gifts2017

Подписка на событие получения управляемой формы

Опубликовал Алексей Драчков (Bassgood) в раздел Программирование - Практика программирования

Сбылась мечта многих 1эсников: платформа предоставила возможность создания подписок на получение ("открытие") управляемых форм прикладных объектов. Публикация наиболее актуальна будет для тех, кто сопровождает конфигурации, функционирующих в режиме управляемого приложения или частично на него переведенных.

Выдержка из описания новых возможностей платформы 8.2.14: "В модуле менеджера некоторых объектов реализовано событие "ОбработкаПолученияФормы", вызываемое на сервере при получении стандартной управляемой формы. С помощью данного события возможно переопределение открываемой формы. При явном указании открываемой формы событие не вызывается."

Подчеркнем еще раз, что обработчик этого события вызывается только для управляемых форм!

Выдержка из описания новых возможностей платформы 8.2.15: "Реализована возможность создавать подписки на события модулей менеджеров".

Т.о. это дает возможность в случае необходимости внесения изменений в типовые формы прикладных объектов (или же полной их переделки) не вносить их непосредственно в сами типовые формы, а создавать свои собственные управляемые формы на основе типовых (или же с нуля) и уже в них производить поправки, предварительно создав необходимую подписку на событие, тем самым облегчая процедуру будущих обновлений конфигурации.

Но как было описано выше, здесь есть одно НО: "При явном указании открываемой формы событие не вызывается" - это значит, что если в каком-либо месте конфигурации открывается типовая форма методом ОткрытьФорму("Документ.АвансовыйОтчет.Форма.ФормаДокумента") вместо ОткрытьФорму("Документ.АвансовыйОтчет.ФормаОбъекта") наша подписка в этом случае не сработает и переопределение получения типовой формы на нашу не произойдет, поэтому прежде чем создавать подобную подписку лучше убедиться (с помощью глобального поиска по конфигурации) не производится ли где открытие интересующей вас типовой формы в явном виде. Думаю и надеюсь, что в типовых конфигурациях открытие стандартных форм прикладных объектов производится без явного их указания в соответствующих методах.

И наконец рассмотрим работу этого механизма на небольшои примере.

Создадим подписку на событие получения управляемой формы документа "Авансовый отчет". У общего модуля, в котором будет располагаться процедура-обработчик события, должны быть взведены флаги "Сервер" и "Вызов сервера", т.к. получение управляемой формы (как упоминалось выше) происходит на стороне сервера. 

Создание подписки на получение формы документа

Типичный код процедуры-обработчика события получения управляемой формы может выглядеть следующим образом. Т.е. перед открытием типовой формы документа "Авансовый отчет" сработает наша подписка на событие, в которой мы переопределяем открытие типовой формы на нашу собственную "НетиповаяУправляемаяФормаДокумента", указав ее имя в качестве значения параметра процедуры "ВыбраннаяФорма".

Процедура ОбработкаПолученияФормы(Источник, ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) Экспорт

    Если
ТипЗнч(Источник) = Тип("ДокументМенеджер.АвансовыйОтчет") И ВидФормы = "ФормаОбъекта" Тогда
       
СтандартнаяОбработка = Ложь;
       
ВыбраннаяФорма = "НетиповаяУправляемаяФормаДокумента";
    КонецЕсли;

КонецПроцедуры

Резюме: Использование подписок на событие "ОбработкаПолученияФормы" менеджеров прикладных объектов может значительно облегчить процедуру обновления конфигурации. Особенно актуальным их использование может быть для тех прикладных объектов, формы которых практически никогда серьезно не меняются от релиза к релизу программы (как например, рассмотренный выше документ "Авансовый отчет").  

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Dmitry Dmitry (Dimasik2007) 27.08.12 13:41
Я обычно делаю по другому, в случае как управляемых, так и не управляемых форм. При серьезных модификациях формы, я ее копирую из типовой с префиксом (допустим _) и сменяю в конфигурации основную форму объекта.
Обновляетмся все довольно легко, система показывает, что измено свойство документа (напр. ОсновнаяФормаДокумента), и тут же легко проверить, вносились ли изменеия в типовую форму (мы же ее не изменяли). Если изменений нет, то форма не появиться в сравнении конфигурации, а значит и делать ничего не нужно. Только не забыть флажок снять)
SirYozha; Bassgood; +2 Ответить 3
3. Zigfridish (Bassgood) 27.08.12 14:00
(1) Dimasik2007, да, можно и так делать, тоже вариант, основное отличие проделывать это через подписки - не снимать дополнительные галочки при сравнении конфигураций.
4. Сергей Ожерельев (Поручик) 27.08.12 15:01
Это одно НО сводит почти на нет ценность фичи. 1С, как всегда, к ложке мёда прилагает бочку дёгтя.
DrAku1a; soulsteps; SirYozha; fishca; artbear; +5 Ответить 1
5. Сергей Ожерельев (Поручик) 29.08.12 10:00
Вот сейчас у меня в работе один проект по доработке УТ 11. Необходимо для несколько штатных документов добавить однотипные элементы формы и меню. Но использовать подписку я не хочу, так как нет уверенности, что вызов формы документов будет всегда осуществляться указанным способом.
6. Дмитрий Глеков (glek) 29.08.12 10:54
Если начали разрабатывать такое - значит в итоги долижут. Насчет (1): тоже делал так же. Один нюанс перечеркивает все плюсы: при существенных изменениях в форме от поставщика - все равно переносить ручками.
7. Алекс Ю (AlexO) 29.08.12 11:05
(1) Dimasik2007,
и каким образом будете вносить изменения от 1С в свою копию формы? это не выход.
Один нюанс перечеркивает все плюсы: при существенных изменениях в форме от поставщика - все равно переносить ручками.

да как бы в создании копии формы плюсов немного - потому как это все из разряда "любым способом сохранить совместимость конфигурации".
Если начали разрабатывать такое - значит в итоги долижут.

есть прецеденты от 1С?
8. Dmitry Dmitry (Dimasik2007) 29.08.12 11:40
(7) Глобально перепаханные документы (по крайней мере в моей торговой области - заказ покупателя, поступление товаров, заказы поставщику, ОПЗС и проч) в дальнейших обновлениях не нуждаются. По крайней мере за 2 года обновления УПП серьезных изменений не было, т.е. они более статичны.
А в других доках уже проще - типовая форма уже загружена в базу, можно сравнить и подкопипастить.
9. Dmitry Dmitry (Dimasik2007) 29.08.12 11:41
Вот когда сделают размещение подписок на события в форме, возможность перегрузки имеющихся обработчиков и проч. - тогда будет сказка. Но по опыту, многие забьют на это дело и будут продолжать дальше крыжыть формы.
10. Евгений Сосна (pumbaE) 29.08.12 11:43
(9) Dimasik2007, многие забивают на подписки о событиях, но это не мешает другим их использовать, а не пихать дополнительную процедуру в модуль проведения.
11. Алекс Ю (AlexO) 29.08.12 11:47
(9) Dimasik2007,
Вот когда сделают размещение подписок на события в форме, возможность перегрузки имеющихся обработчиков и проч.

1С никогда такого не сделает. Потому как изначально ей этого не сделано при написании платформы (откуда и проблема "одно НО").
А уж обращение и перегрузка стандартных событий форм/объектов - забудьте. Это 1С.
А не среда программирования.
12. Dmitry Dmitry (Dimasik2007) 29.08.12 12:24
(10) Тут уж в зависимости от задачи. Вот я, допустим, при расчете упр. цены в документе ОПЗС в процедуру ОбработкаПроведения вставил такой код

_Ценообразование.ЗафиксироватьЦены_ОПЗС(ЭтотОбъект, ТаблицаПоПродукции, СтруктураШапкиДокумента, Отказ);

Зачем мне тут подписка? Заново рассчитывать данные ТаблицаПоПродукции, СтруктураШапки и т.п?


(11) Не сделает - да и бог с ним. И так кормит) Да и порог вхождения минимальный.
13. Zigfridish (Bassgood) 29.08.12 12:45
(4) Поручик, (6) glek, (11) AlexO, я так думаю, что это одно НО 1С сделала не случайно, они тем самым учли следующий момент: если возникнет необходимость открыть какую-либо форму объекта (возможно для каких-либо особых случаев или еще чего) - чтобы такая возможность у разработчика была несмотря на существование в конфигурации подобных подписок (иначе постоянно бы открывалась одна и та же форма, назначенная в подписке).
14. Сергей Старых (tormozit) 29.08.12 13:03
Название публикации не соответствует ее содержанию. Здесь описана подписка на событие менеджера объекта метаданных, а не формы.
15. Евгений Сосна (pumbaE) 29.08.12 13:04
(12) Dimasik2007, конкретно этот пример неправильный для типовых и 8.2 в подписке обращаемся к ДополнительнымСвойствам:
 
Если Источник.ДополнительныеСвойства.Свойство("СтруктураШапкиДокумента")
	 И Источник.ДополнительныеСвойства.Свойство("СтруктураТабличныхЧастей") Тогда
    мСтруктураШапкиДокумента = Источник.ДополнительныеСвойства.СтруктураШапкиДокумента;

...Показать Скрыть
16. Zigfridish (Bassgood) 29.08.12 13:07
(14) tormozit, событие относится к менеджерам объектов, но ведь само событие вызывается при получении формы прикладного объекта (то что подписка относится непосредственно к форме в заголовке ничего не сказано).
17. Алекс Ю (AlexO) 29.08.12 13:14
(10) pumbaE,
а не пихать дополнительную процедуру в модуль проведения.

так даже и модуля проведения как такового нет. Так, скромная процедура на обработку события...
18. Сергей Старых (tormozit) 29.08.12 13:14
(16) В общем рекомендую убрать двусмысленность из названия. Например "Подписка на событие "Обработка получения формы" менеджера объекта".
19. Алекс Ю (AlexO) 29.08.12 13:15
(18) tormozit,
так весь кайф студентам обломаешь :))
20. Zigfridish (Bassgood) 29.08.12 13:55
(5) Поручик, можно попробовать воспользоваться добавлением в конфигурацию новых команд, в которых указать, чтобы они располагались где-нибудь на форме (в командном меню формы или в ее панели навигации), правда не всегда этим можно воспользоваться.
21. Zigfridish (Bassgood) 29.08.12 14:01
(19) AlexO, вы совершенно угадали, иначе студенты на схватят кайфа, ведь статья публиковалась конечно же не для просвещения такого знатока возможностей платформы как вы.
22. Алекс Ю (AlexO) 29.08.12 14:37
(21) Zigfridish,
ну согласитесь же, что разбирать "Подписку на получение УФ" намного интереснее, чем какую-то там малохольную "Подписку на событие "Обработка получения формы" менеджера объекта" ;)
23. Zigfridish (Bassgood) 29.08.12 15:26
(22) AlexO, так оно и есть, особенно не интересна для многих будет тема с заголовком "Подписка на событие "Обработка получения формы" менеджера прикладного объекта, используемой для переопределения управляемой формы на сервере" =)
Мне кажется заголовок полно и кратно отражает содержание публикации (без лишних уточнений, в статье описано именно получение формы через подписку, а не то, какому модулю принадлежит это событие).
24. Dmitry Dmitry (Dimasik2007) 29.08.12 16:54
(15) Да, к сожалению пример не правильный, в ОПЗС не заполняются ДополнительныеСвойства.
В том же документе ТребованиеНакладная они заполняются и их можно цеплять извне.
Там даже пишут "в лоб":
//Сделаем переменные доступными из подписок на события
ДополнительныеСвойства.Вставить("СтруктураШапкиДокумента", СтруктураШапкиДокумента);
ДополнительныеСвойства.Вставить("СтруктураТабличныхЧастей", Новый Структура("ТаблицаПоТоварам", ТаблицаПоТоварам));
25. Сергей Ожерельев (Поручик) 29.08.12 23:11
Есть ещё одна причина, по которой эта фича в большинстве случаев останется невостребованной. Многие заказчики используют прежние версии платформы 8.2, в которой она отсутствует, и менять платформу желанием не горят.
26. Zigfridish (Bassgood) 30.08.12 14:23
(25) Поручик, со временем перейдут, всему свое время =)
27. Роман (Raminus) 30.08.12 14:30
Потестил, пока что не могу найти для себя применение такой возможности, но вещь бесспорно интересная думаю будут развивать.

(25) Поручик, бесспорно перейдут, нужна будет поддержка бух 3.х перейдут никуда не денутся :)
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа