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