Имя: Пароль:
IT
 
Проектирование: Вложенные формы от Mort
0 Mort
 
01.11.08
11:53
Короче возникла задачка сделать вложенные формы. Реализация от Гения1С оказалась не то что бы сыроватой, короче бред сивой кобылы.
Решено было придумать своим способом, чтобы и намёк на объектную структуру был и т.д.
В итоге вот что получилось (бета версия):
dt версии 8.1 (40 кб):
http://ifolder.ru/8850052
Скриншот :
http://imageshost.ru/links/60c896179e0fcea954b411e67f625b76


Для того чтобы вложить одну форму в другую нужно:

В конфигурации:
- добавить общие модуль и общий текстовый макет «Вложенные формы».

Во вкладываемой форме:
- (в бете) объявить все события формы и элементов «extern».
- (будет) скопировать из макета 1 функцию.

В родительской форме:
- Добавить реквизит «ВложенныеФормы» произвольного типа.
- Скопировать блок функций из макета. Блок один на все формы и никогда не меняется.
- На каждую вложенную форму:
А) На форме создать панель для вложения
Б) Добавить реквизит произвольного типа с названием = название панели.
В) Добавить вызов функции привязки формы в ПередОткрытием()

Доступ к реквизитам вложенной формы осуществляется так:

ИмяПанелиВложеннойФормы.ДатаНачала

Вот и всё. Изменения вложенной формы в режиме конфигуратора будет отражаться во всех вложениях без редактирования родительских форм.

Ограничения бета версии:
- вложенные формы могут пока содержать только примитивные элементы управления (панель, поле ввода, поле списка, табличное поле, флажок, кнопка, ком. панель и т.д.)
- командные панели с источниками данных должны быть с включенным автозаполнением, либо не содержать добавленные вручную кнопки типа «Добавить» и т.д. не имеющие обработчиков.
- пока нет возможности делать вложенные формы вложенных форм.
- не все события табличного поля реализованы.
- не протестировано использование в качестве вложенных форм формы объектов (форма элемента справочника и т.д.), только общие формы.

Ограничения пожизненные:
- Вложенная форма не должна программно менять свой состав (динамично добавлять кнопки и т.д.) и не должна содержать "битых" обработчиков.
- Имя панели и соотв. реквизита не должны содержать «_».

P/s Спасибо Asady за реализацию деструктивного анализа форм.
1 Волшебник
 
модератор
01.11.08
11:59
Не туда запостил. Нужно сюда http://www.kb.mista.ru/
2 Mort
 
01.11.08
12:03
(1) скину по результатам обсуждения, если таковое вообще появится.
3 Mort
 
01.11.08
12:21
Мдя в субботу не тянет никого на формы. Даже фиксин чо то не стал вопить. Наверное курит в сторонке. Подниму после выходных. Или забью.
4 Mort
 
10.11.08
12:38
Раз уж такая веселуха, подниму как обещал.
5 Ёпрст
 
гуру
10.11.08
12:39
Вложенные формы в Клюшках:
http://www.sinor.ru/%7Efilez/frames.ert
6 Mort
 
10.11.08
12:41
Креативно.. )
7 Гений 1С
 
гуру
10.11.08
15:58
Морт, где у тебя описывается поведение вложенной формы.
Например на вложенной форме есть кнопка "СделатьВСЕ".
Где находится обработчик этой кнопки?
8 Mort
 
10.11.08
16:12
Во вложенной форме естессна. А где же ещё?
9 Александр_
Тверь
 
10.11.08
16:13
(7) (8) а вот и не подеретесь.
10 Mort
 
10.11.08
16:15
В архиве по ссылке очень всё ясно, в пофигураторе есть возможность открыть вложенную форму (в общих) и посмотреть чо она делает. По сути за исключением того что все события объявлены Экспорт, вкладываемая форма вообще не знает что её будут вкладывать и куда, и не отличается от любой другой. Вот в чём цимус.
11 Fragster
 
гуру
10.11.08
16:16
вот интересная разработка (не для 1с, но сам принцип мне нравится):
http://www.cse.yorku.ca/~wolfgang/facades/
12 Mort
 
10.11.08
16:21
(11) Прикольно, правда реально применений именно такого подхода не особо, а вопрос размещать элементы управления по своему усмотрению во всех крупных прогах уже есть от VS до 1С.
13 Fragster
 
гуру
10.11.08
16:23
(12) Между формами? тут же прикол в том, что работа с программиста, который закладывает в программу эти фичи, перекладывается на DE
14 Fragster
 
гуру
10.11.08
16:25
(13) до сих пор под виндой не хватает возможности настроить любые окна так, как мне нравится - без рамки, или со своим стилем рамки, не отображающейся на таскбаре, поверх всех (или отменить это самое поверх всех), установить прозрачность и т.д.
15 Гений 1С
 
гуру
10.11.08
16:25
(10) Окей. допустим у вложенной формы есть поле ввода "Поле1" и кнопка "Бутон1".
При нажатии на Бутон1 нужно вывести предупреждение, содержащееся в Поле1.
Твои вложенные формы поддерживают такой функционал?
Как ты доберешься до значения в Поле1?
16 Mort
 
10.11.08
16:29
(14) Ну общие настройки не помешает, вроде про Win7 о чем-то таком говорили, точно не скажу. Но возможность передвигать элементы формы в пределах одного окна породит жуткий гимор и кодерам и юзерам.
17 Mort
 
10.11.08
16:32
(15) Гений, открыл бы ты архив и посмотрел, там в тестовой вложенной форме все описано, есть как раз пример который ты спросил, вот текст из вложенной формы:

Процедура Кнопка1Нажатие(Элемент) Экспорт
   ПолеВвода1 = "Нажата кнопка1";
КонецПроцедуры

А вот ещё во вложенной форме:

Процедура ПриОткрытии() Экспорт
   ПолеВвода1 = "Этот текст записан при открытии";
   Переключатель = 1;
КонецПроцедуры

А как тебе такой прикол:

Процедура ТабличноеПоле1ПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки) Экспорт
   Если ДанныеСтроки.Цена <=0 И ЭлементыФормы.КоманднаяПанель1.Кнопки.ВыделениеЦветом.Пометка Тогда
       ОформлениеСтроки.ЦветФона = WebЦвета.ТусклоРозовый;
   КонецЕсли;
КонецПроцедуры

На скрине показано про цветом выделенные строки.
18 Господин ПЖ
 
10.11.08
16:32
ставлю 50 крышечек на Морта...
19 Mort
 
10.11.08
16:35
А из модуля родительской формы обратится к реквизитам вложенной также просто и попросту логично:

МояВложеннаяФорма.ПолеВвода1
20 Александр_
Тверь
 
10.11.08
17:03
(18) крышек от ядрёнок колы?
21 Torquader Darigha
 
10.11.08
17:21
"Вложенная форма не должна программно менять свой состав (динамично добавлять кнопки и т.д.)" - а тогда зачем всё это?
По поводи динамического изменения интерфейса - dhtml вам в помощь.
22 Гений 1С
 
гуру
10.11.08
17:25
(17) Я сейчас работаю. ;-)
Объясни мне, данные вложенной формы хранятся во вложенной форме или где.
23 Гений 1С
 
гуру
10.11.08
17:26
Если это написано во вложенной форме:

Процедура ПриОткрытии() Экспорт
  ПолеВвода1 = "Этот текст записан при открытии";
  Переключатель = 1;
КонецПроцедуры

То не взлетит.
потому что значение установится у вложенной формы, которая не видима, а не у элемента управления ПолеВвода1, вложенного в панель.
24 Mort
 
10.11.08
17:28
(21) Нус, ограничение конечно обидное но не смертельное. Многие весчи, например, редактирование контактной инфы, размещение универсальных полей-списков с кнопками управления с указанием типа элементов, сборник списков справочников с закладками этого не требуют.
25 Гений 1С
 
гуру
10.11.08
17:31
(24) Мои вложенные формы могут себя менять. ;-)
Морт, жду от тебя ответа. Как соловей лета.
26 Mort
 
10.11.08
17:36
(23) Дык. Взлетает ищо как.
Экземпляр вложенной формы как ей и положено хранится в ОЗУ а именно в реквизите родительской формы с именем панели. Соответственно все данные в т.ч. ПолеВвода1 хранятся там же.
А теперь внимание, секрет фокуса: копии элементов на родительской форме имеют путь к самим данным формы т.е поле ввода на родительской форме ВложеннаяФорма_ПолеВвода1 имеет путь к данным ВложеннаяФорма.ПолеВвода1.
Таким образом если форма только оперирует с данными на этом можно было закончить. Но вложенная форма может написать

Процедура Кнопка1Нажатие(Элемент) Экспорт
  ЭлементыФормы.Кнопка1.Заголовок = "Ой !! на меня нажали"; //И это работает !!
КонецПроцедуры

поэтому в каждом событии передаются свойства ЭУ во вложенную и из неё.
27 Mort
 
10.11.08
17:37
(25) А твои вложенные могут иметь панели со страничками? Тока поэтому и пришлось зарубить динамику, ну и быстродействие ещё..
28 Mort
 
10.11.08
17:38
+27 им ввиду отслеживать изменение формы хуже чем 1 раз деструктивно анализировать форму.
29 Гений 1С
 
гуру
10.11.08
17:42
(26) Все, признаю - ты крут. Этот фокус многое меняет. ;-)
30 Гений 1С
 
гуру
10.11.08
17:42
Правда, остается еще вопрос, типо:
ЭлементыФормы.Буттон1.Видимость = ложь.
НАверное, такое не взлетит. ;-)
31 Mort
 
10.11.08
17:43
Ну а с событиями вообще всё просто, все события копий элементов на родительской форме обрабатывает один неизменный блок функций. Эти функции обращаются к событиям вложенной формы, причем сохраняются параметры (например ОформлениеСтроки) (у тебя они вроде как бы дохнут) и это позволяет например, раскрашивать строки.
Кстати у тебя вложенная форма когда разукрашивает себя это в родительской отображается?
32 Гений 1С
 
гуру
10.11.08
17:44
Для трансляции событий ты вставляешь в модуль вложенной формы блок ловушек событий?
33 Гений 1С
 
гуру
10.11.08
17:44
т.е. в модуль формы-владелицы. пардон
34 nop
 
10.11.08
17:44
.... Сейчас Mort сделает Гению_1с фаталити  ....
35 Mort
 
10.11.08
17:44
(30) У меня при событии след возникает:

Передаю свойства в вложенный элемент
Обрабатываю событие
Получаю свойства ЭУ из вложенной формы (в т.ч. и Видимость).
Поэтому взлетит.

Короче смотри архив, если интересно.
36 Гений 1С
 
гуру
10.11.08
17:45
(31) у меня они не дохнут ;-)
37 Гений 1С
 
гуру
10.11.08
17:46
(35) Допустим при нажатии на Буттон1 тебе нужно сделать невидимым Поле1.
Как ты разыменуешь элементы без таблицы соответсвий элементов?
38 Гений 1С
 
гуру
10.11.08
17:46
Сдается никак.
39 Mort
 
10.11.08
17:46
(32) Да и он один на все случаи жизни. ПриИзменении всегда содержит 1 параметр у кого бы это событие не было. А вот от кого это событие по элементу решается.
40 Гений 1С
 
гуру
10.11.08
17:48
Елси написать
Функция Буттон1_Нажатие(Элемент)
 ЭлементыФормы.ПОлеВвода1.Видимость = ложь;
КонецФункции

Не сработает, т.к. не сделает невидимой элемент формы в ОЗУ.

А так ваще Морт молодэц. ;-)
41 Mort
 
10.11.08
17:48
(37) У меня элементы на родительской форме названы

ВложеннаяФорма_ПолеВвода1    - ПолеВвода1
ВложеннаяФорма_КнопкаЙопт    - КнопкаЙопт

Поэтому условие в названии панелей не юзать "_"
42 Mort
 
10.11.08
17:48
(40) Сделает.
43 Mort
 
10.11.08
17:50
Тока что дописал во вложенной форме строку:

Процедура Кнопка1Нажатие(Элемент) Экспорт
   ПолеВвода1 = "Нажата кнопка1";
   ЭлементыФормы.ПолеВвода1.Видимость = Не ЭлементыФормы.ПолеВвода1.Видимость;    
КонецПроцедуры

В обработке с вложенными формами все гаснет и появляется по плану.
44 Mort
 
10.11.08
17:51
(40) Видимости пофиг открыта форма или нет.
45 Гений 1С
 
гуру
10.11.08
18:04
(44) Так она сделает невидимым поле у формы в ОЗУ, а не в поле на форме. Т.е. некоторое переписывание все равно придется сделать.
46 Гений 1С
 
гуру
10.11.08
18:04
вот если бы можно было подменить коллекцию ЭлементыФормы... тогда да.
47 Mort
 
10.11.08
18:04
(45) После события свойства всех элементов вложенных форм передаются "наверх".
48 Mort
 
10.11.08
18:05
+47 В т.ч. видимость. Я же говорю дописал в (43) только строку. И всё работает.
49 Mort
 
10.11.08
18:07
Конечно если у тебя на форме 200 элементов и таблица с 100 колонками будет подтармаживать. Только кто такие формы делает?
50 Mort
 
10.11.08
18:13
О ошибочный вызов в форме элемента товара, будет ругатся при добавлении элемента из вложенной, и не из вложенной а вообще при открытии формы элемента. Это не из-за вложенных форм.
Пора бежать.
Всем: будут идеи или предложения по вложенным формам - всегда пожалуйста.
51 Гений 1С
 
гуру
10.11.08
18:19
Я не догоняю, Морт:

ЭлементыФормы.ПолеВвода1.Видимость = бла-бла-бла

Это устанавливается видимость той формы что в ОЗУ, а не того элемента ПолеВвода1, что на форме!!!
52 quest
 
10.11.08
18:29
Ну коли все такие продвинутые, пожите чайнику. Как прицепиться к открытию произвольной формы не меняя код открытия формы... То есть просто получить доступ к ней (желательно сразу после обработки ПриОткрытии()) А то уже извелся весь...
53 Гений 1С
 
гуру
10.11.08
18:59
(52) парсинг
54 Гений 1С
 
гуру
10.11.08
20:04
скинь дтэшник на fixin@mail.ru плиз. Или выложи в другое место. У меня не качается
55 Гений 1С
 
гуру
10.11.08
20:48
Скачал. Смотрю. Слушай. а не слишком ли жирно использовать деструктивный анализ формы для этих целей?
56 Гений 1С
 
гуру
10.11.08
20:49
И еще:

       Если ЭлементПриемник.Данные <> ИмяПанели + "." + ЭлементИсточник.Данные Тогда
           ЭлементПриемник.Данные = ИмяПанели + "." + ЭлементИсточник.Данные;
       КонецЕсли;


У меня в библиотеке есть функция:

//Присваивает значение Б переменной А только если значение реально изменилось
//Удобно, когда нужно защититься от модифицированности
Функция обПрисвоитьБезопасно(А,Б) Экспорт
   Если А<>Б Тогда
       А=Б;
   КонецЕсли;
   Возврат А;
КонецФункции
57 Гений 1С
 
гуру
10.11.08
20:57
Гы, прикольно. Еще один секрет Морта - он копирует свойства элементов формы при каждом вызове события, поэтому то, что вложенная форма делает со своими элементами автоматически синхронизируется с главной формой. Гы... Правда приходится перебирать все элементы. Надо подумать над этим вопросом.
58 Гений 1С
 
гуру
10.11.08
21:07
Думаю если при синхронизации использовать не полное заполнение всех свойств через ЗаполнитьЗначенияСвойств, а только тех что поменялись, то будет быстрее работать.

И кстати, рекомендую сделать как у меня - не вызывать явно вставку вложенных форм, а привязывать их при октрытии по имени панели.
59 Гений 1С
 
гуру
10.11.08
21:24
Рекомендую объединить функии Функция ДеструктивныйАнализФормы(Объект, ИмяФормы)
и  ДеструктивныйАнализОбщейФормы(ИмяФормы) в одну ДеструктивныйАнализФормы(Форма). ;-)
60 Гений 1С
 
гуру
11.11.08
12:31
окей. за идею с данными панели спасибо. Реально удобно. Добавлю.
Но деструктивный анализ юзать не буду. ;-)
И копирование свойств при вызове каждого события тоже делать не буду.

То бишь у меня, чтобы форму сделать вложенной, нужно будет:
1. Заменить все вхождения ЭлементыФормы на Элементы (в режиме целого слова)
2. Добавить в начало модуля формы код: Перем Элементы;
3. Добавить в конец модуля формы код: Элементы = ЭлементыФормы;
4. Сделать все методы формы экспортными.

Так будет шуршать быстрее. А подготовительных действий немного. Ок, пусть будет так.
61 Александр_
Тверь
 
11.11.08
12:37
(60) коллективный разум всех победит?
62 Mort
 
11.11.08
12:42
(60) Без деструктивного анализа придется отказаться от вложенных форм с панелями со страницами.
Про замену элементовФорм. Реквизит ЭлементыФормы не единственный способ добраться до свойств элементов формы.

Допустим во вложенной форме:

Процедура Кнопка1ПриНажатии(Элемент)
   Элемент.Видимость = Ложь;
КонецПроцедуры

В моём случае в событие вложенной посылается Элемент формы в ОЗУ, а остальные параметры - из элемента на родительской форме. Если пошлем Элемент из родительской - будет несходняк в свойствах.
63 Mort
 
11.11.08
12:45
А подменить ЭлементыФормы дочерней на ЭлементыФормы родительской (т.е. называться они и там и там будут одинаково) паливо. ПолеВвода1 может быть и там и там. Либо нужно реквизиты вложенной формы называть оригинально, что убъет возможность включать уже готовые формы на что это собсна расчитывалось.
64 Mort
 
11.11.08
12:48
А про привязку вложенных форм по названию - тоже самое. Расчитывалась возможность включить не только общую форму или обработки, а форму элемента справочника, например, можно листалку по объектам сделать и т.д.
65 Mort
 
11.11.08
12:51
Собственно если отказаться от ВФ с многостраничными панелями и Дестр.Ан-за, можно и динамически создаваемые объекты разрешить и формы вложенные во вложенные.
66 AntiBuh
 
11.11.08
13:03
(5) вах, шайтан
Как сделал?
67 Гений 1С
 
гуру
11.11.08
14:26
(64) Лучше тогда сочетать два механизма - возможность привязывать программно и автоматически.
(63) Нет, не на родительской, а просто создать структуру Элементы, где по именам правильно будут прописаны элементы вложенной. Но только не формы в ОЗУ, а элементы находящиеся на панели.
(62) не знаю, мне не нравится необходимость просматривать все элементы. Тормозить будет имхо. Дешевле заменить "ЭлементыФормы" на Элементы. ;-)

Ну, можно конечно бы подумать о хэшировании, чтобы форма деструктивно разбиралась только при первом вызове. Я лично буду делать без деструктивного анализа.
68 Гений 1С
 
гуру
11.11.08
14:27
(5) давай скриншоты, у меян 1с77 уже нету
69 Гений 1С
 
гуру
25.11.08
16:11
Морт, глянь эту тему, тебе будет полезно:
http://infostart.ru/projects/2966/#comm12

(намек - вместо нескольких реквизитов формы - один типа построитель).
Я уже свои вложенные переделал на этот механизм.
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший