Еще один способ программной модификации управляемых форм

Публикация № 1116920

Разработка - Работа с интерфейсом

управляемые формы программная модификация изменение форм

9
Пример программной модификации управляемой формы для случая когда вызов метода СобытияФорм.ПриСозданииНаСервере разработчиком конфигурации не предусмотрен.

Стандартным способом изменения управляемой формы в типовых конфигурациях серии УТ/КА/ERP является разработка (доработка) метода ПриСозданииНаСервере в общем модуле МодификацияКонфигурацииПереопределяемый. Я обычно наследую этот метод в расширение и реализую в нем маршрутизацию до прикладных методов, которые и модифицируют конкретные формы. Со всех сторон прекрасный способ, но как всегда есть но.

И так, в модуле управляемой формы в событии ПриСозданииНаСервере есть вызов переопределяемого метода общего модуля. Примерно так:

	СобытияФорм.ПриСозданииНаСервере(ЭтаФорма, Отказ, СтандартнаяОбработка);
	
КонецПроцедуры

Но к сожалению этот вызов реализован не во всех формах, соответственно воспользоваться стандартным способом не получиться.

Я предлагаю для решения этой задачи воспользоваться другим общим модулем а именно ОбновлениеИнформационнойБазы. Дело в том, что во всех формах типовых конфигураций в событии ПриСозданииНаСервере идет обращение к методу ПроверитьОбъектОбработан вышеназванного общего модуля. Выглядит это примерно так:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

	УстановитьУсловноеОформление();
	
	Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа.
		Возврат;
	КонецЕсли;

	ОбновлениеИнформационнойБазы.ПроверитьОбъектОбработан(Объект, ЭтотОбъект);

Соответственно, если &Перед вызовом метода выполнить код модификации управляемой формы, то мы не нарушая логики приложения решим свою задачу.

Суть идеи понятна, теперь для примера давайте в конфигурации УТ 11.4 модифицируем форму элемента Плана видов характеристик ДополнительныеРеквизитыИСведения а именно добавим описание (Декорацию) к полю Комментарий. Вот так будет выглядеть конечный результат:

Добавим в конфигурацию расширение со снятым флажком Безопасный режим.

В расширение унаследуем метод ПроверитьОбъектОбработан общего модуля ОбновлениеИнформационнойБазы с директивой &Перед. И реализуем в нем маршрутизацию до прикладного метода, который и будет непосредственно модифицировать форму.

&Перед("ПроверитьОбъектОбработан")
Процедура DEM01_ПроверитьОбъектОбработан(Данные, Форма, ИмяОтложенногоОбработчика, ИмяПроцедурыПрограммногоИнтерфейса) Экспорт
	
	// Тут только маршрутизация
	Если ТипЗнч(Форма) = Тип("ФормаКлиентскогоПриложения") Тогда
		Если Форма.ИмяФормы = "ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.Форма.ФормаЭлемента" Тогда
			DEM01_МодификацияКонфигурации.ДобавитьЭлементы_ДополнительныеРеквизитыИСведения_ФормаЭлемента(Форма);
		КонецЕсли;
	КонецЕсли;

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

В расширение добавим новый серверный общий модуль в котором будем реализовывать прикладные методы. Например так:

Реализуем прикладной метод в новом общем модуле:

#Область Модификация_формы_ПВХ_ДополнительныеРеквизитыИСведения
// Вызов из унаследованного ОМ ОбновлениеИнформационнойБазы

Процедура ДобавитьЭлементы_ДополнительныеРеквизитыИСведения_ФормаЭлемента(Форма) Экспорт
	Перем оГруппаРодитель, оЭлементПеред, оЭлемент;
	
	Если Форма.Элементы.Найти("ОстальныеРеквизиты") <> Неопределено
		И Форма.Элементы.Найти("Комментарий") <> Неопределено Тогда
		оГруппаРодитель = Форма.Элементы.ОстальныеРеквизиты;
		оЭлементПеред = Форма.Элементы.Комментарий;
	Иначе
		Возврат;
	КонецЕсли;
	оЭлемент = Форма.Элементы.Вставить("DEM01_КомментарийОписание", Тип("ДекорацияФормы"), оГруппаРодитель, оЭлементПеред);
	оЭлемент.Вид = ВидДекорацииФормы.Надпись;
	оЭлемент.Заголовок = "Добавьте в начало поля Комментарий префикс #Печать# для вывода в печатных формах этого дополнителного реквизита.";
	
КонецПроцедуры

#КонецОбласти

 

Реализацию метода модификации формы делаем максимально безопасным. Добавляем проверки, которые не позволят нарушить дальнейшую работу метода ПроверитьОбъектОбработа.

Все, мы программно модифицировали форму в которой разработчики не предусмотрели вызов переопределяемого метода ПриСозданииНаСервере. Как истинные тру программисты мы не наследовали саму форму в расширение.

В приложенном файле находится расширение конфигурации, которое мы создали.

Разработка и тестирование проводилось на конфигурации 1С Управление торговлей 11.4.8, платформа 8.3.15.1565

9

Скачать файлы

Наименование Файл Версия Размер
Еще один способ программной модификации управляемых форм:
.cfe 6,70Kb
02.09.19
0
.cfe 6,70Kb Скачать

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. VmvLer 03.09.19 09:19 Сейчас в теме
чесно говоря не понял зачем такие танцы с бубном?

просто добавляем форму в расширение и определяем там обработчик ПриСозданииНаСервере. При этом мы будем работать только с расширением и
не терзать основную конфигурацию обновлениями.

Причем, пабарабану
- есть вызов этого обработчика в основной конфигурации или нет
- есть вызов из общих модулей или нет
- вообще все пабарабану - работает без непоняток и насилия мозга.
2. infosoft-v 312 03.09.19 09:29 Сейчас в теме
(1)
просто добавляем форму в расширение

Вот именно этого я пытаюсь избежать.
3. vv2 03.09.19 09:38 Сейчас в теме
(2) А для чего вы хотите этого избежать?
6. infosoft-v 312 03.09.19 09:53 Сейчас в теме
(3) две причины:
1. вместе с наследованием формы в расширение наследуются все ссылочные объекты используемые на форме
2. изменение дизайна формы разработчиком типовой конфигурации будет требовать от меня дополнительного внимания к унаследованной форме
14. dhurricane 04.09.19 00:05 Сейчас в теме
(6) В публикации Вы указали, что тестировали на платформе 8.3.15. Если мне не изменяет память, то уже начиная с платформы 8.3.14 расширение формы не наследует все ссылочные объекты, используемые на форме (если конечно об этом явно не "попросить"), и соответственно, если Вы ничего не меняете в дизайне, то и дополнительного внимания не требуется.
vv2; infosoft-v; FreeArcher; +3 Ответить
15. infosoft-v 312 04.09.19 07:57 Сейчас в теме
(14) Спасибо за комментарий. Как то я упустил это изменение в платформе. Обязательно проверю.
4. VmvLer 03.09.19 09:38 Сейчас в теме
(2) это я понял и код в принципе понял, но если необходима модификация многих форм - допустим 50 форм списков по отборам, то предложенный
5. VmvLer 03.09.19 09:42 Сейчас в теме
код превратиться в громадный линейный код

Если Форма.ИмяФормы = "ПланВидовХарактеристик.ДополнительныеРеквизитыИСв
...
ИначеЕсли
....
ИначеЕсли
....

Адепты копания в куче линейного кода конечно попробуют меня распять,
но к счастью таких аборигенов можно встретить редко.

посему считаю, что добавить форму в расширение это меньшее зло, чем пирамиды кода.
7. infosoft-v 312 03.09.19 09:56 Сейчас в теме
(5) Линейный код маршрутизации это не страшно, он стабилен и хорошо читается.
При добавлении формы в расширение я получаю два побочных эффекта:
1. вместе с наследуемой формой в расширение наследуются все ссылочные объекты используемые на форме
2. изменение дизайна исходной формы разработчиком типовой конфигурации будет требовать от меня дополнительного внимания к унаследованной форме
SlavaKron; +1 Ответить
8. VmvLer 03.09.19 10:08 Сейчас в теме
(7) мне больше нечего сказать по теме, если найдутся еще пару адептов линейного кода, то можете создать свое королевство и отправить ко мне дракона.
12. SlavaKron 03.09.19 16:00 Сейчас в теме
(8) А что не так с линейным кодом?
dima_home; +1 Ответить
13. VmvLer 03.09.19 16:14 Сейчас в теме
(12) да все ок с ним, просто на любителя и по ситуации.

в этой ситуации он вреден и выше я разжевал почему.
9. EVKash 3 03.09.19 10:50 Сейчас в теме
(7) Чтобы все это хозяйство не лезло в расширение, достаточно создать пустую конфу с тем же режимом совместимости, создать справочник или документ с таким же названием, проверить ключевые параметры(типа длина наименования), создать пустую форму с таким же названием, эту форму в расширение и там уже в ПриСозданиииНаСервере прописать СобытияФорм.ПриСозданииНаСервере
В основную конфу такое расширение прекрасно загружается и работает.
ASDF2; nomad_irk; skif47; for_sale; infosoft-v; +5 Ответить
10. infosoft-v 312 03.09.19 10:55 Сейчас в теме
11. dandykry 3 03.09.19 15:47 Сейчас в теме
Только недавнечко, 7 месяцев назад, перевели 99% изменений форм в такой модуль. Полет нормальный

http://prntscr.com/p17r85
Оставьте свое сообщение