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