Разработка на управляемых формах часто ставит перед программистом задачу массовой доработки интерфейсов. Когда необходимо добавить новые элементы или изменить поведение существующих реквизитов во множестве документов, метод «затаскивания» каждой формы в расширение становится крайне неудобным: при каждом обновлении конфигурации требуется проверять работоспособность каждой измененной формы. Давайте разберем, как автоматизировать этот процесс и перенести логику в единое место.
Автор вопроса предложил использовать механизм ПриСозданииНаСервере в расширении общего модуля ПодключаемыеКоманды. Это правильный путь, так как использование встроенных «точек входа» типовых конфигураций позволяет охватить максимум форм одним кодом. Однако важно учитывать ограничения: не во всех типовых формах присутствуют нужные вызовы ПодключаемыеКоманды или СобытияФорм. В таких случаях подход требует комбинирования.
Вместо того чтобы прописывать логику изменения формы внутри модуля каждой формы в расширении, мы создадим единый общий модуль. В расширении мы будем перехватывать событие ПриСозданииНаСервере типового общего модуля. Рассмотрим пример такой реализации:
// В расширении общего модуля ПодключаемыеКоманды
&После("ПриСозданииНаСервере")
Процедура Расш_ПриСозданииНаСервере(Форма, ПараметрыРазмещения)
// Централизованная проверка имени формы
Если Форма.ИмяФормы = "Документ.ГТДИмпорт.Форма.ФормаДокумента" Тогда
ДобавитьЭлементыФормы(Форма);
КонецЕсли;
КонецПроцедуры
Процедура ДобавитьЭлементыФормы(Форма)
НовыйЭлемент = Форма.Элементы.Добавить("МойНовыйРеквизит", Тип("ПолеФормы"), Форма.Элементы.ГруппаКоманд);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
// ... дальнейшая настройка
КонецПроцедуры
Самая частая трудность возникает при попытке назначить обработчик события (например, ПриИзменении) для программно созданного реквизита. Платформа 1С требует, чтобы процедура-обработчик физически находилась в модуле формы. Напрямую назначить процедуру из общего модуля нельзя — это приведет к ошибке.
Для обхода этого ограничения используем механизм «прокси-процедур»:
ЭтаФорма, Элемент).
// В модуле формы (в расширении)
&НаКлиенте
Процедура Расш_МойРеквизитПриИзменении(Элемент)
МойОбщийМодульКлиент.ОбработкаИзмененияРеквизита(ЭтотОбъект, Элемент);
КонецПроцедуры
При использовании такого централизованного подхода важно следовать ряду правил, чтобы система оставалась стабильной и легко отлаживаемой:
ПриСозданииНаСервере всегда ставьте жесткие проверки по ИмяФормы. Это предотвратит выполнение лишнего кода при открытии служебных форм и форм, не требующих изменений.ПодключаемыеКоманды может привести к конфликтам при обновлении. Старайтесь использовать свои собственные общие модули, вызывая их из обработчиков, а не перекрывая логику стандартных процедур БСП без необходимости.Если.Таким образом, использование общего модуля для манипуляции элементами форм — это рабочий и масштабируемый паттерн, позволяющий избежать дублирования кода в расширении. Главное — правильно сочетать этот метод с механизмом прокси-процедур для обработки событий пользователя.