![]() |
![]() |
![]() |
|
Проектирование: Вложенные формы от 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 (намек - вместо нескольких реквизитов формы - один типа построитель). Я уже свои вложенные переделал на этот механизм. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |