Как добавить элементы на управляемую форму и передать параметры через событие ОбработкаПолученияФормы?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Ограничения и назначение события ОбработкаПолученияФормы

Проанализируем механику работы события ОбработкаПолученияФормы. Данный обработчик может располагаться в модуле менеджера объекта или вызываться через одноименную подписку на событие.

Важно понимать: это событие срабатывает до того, как платформа начинает создавать экземпляр управляемой формы на сервере. В этот момент:

  1. Экземпляра формы, ее реквизитов, команд и дерева элементов интерфейса еще физически не существует.
  2. В контексте обработчика доступны только метаданные объекта, вид запрашиваемой формы и структура входных параметров.
  3. Обратиться к коллекции Элементы или вызвать методы модификации формы невозможно, так как форма еще не скомпонована.

Событие ОбработкаПолученияФормы предназначено исключительно для переопределения того, какая именно форма будет открыта (параметр ВыбраннаяФорма), и для модификации структуры Параметры, с которой эта форма начнет создаваться.

Подмена стандартной формы и передача параметров

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


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

    // Проверяем вид запрашиваемой формы
    Если ВидФормы = "ФормаОбъекта" Тогда
        // Отключаем стандартную логику открытия формы
        СтандартнаяОбработка = Ложь;
        
        // Указываем путь к альтернативной форме
        ВыбраннаяФорма = "Обработка.АРММенеджера.Форма.ФормаРедактирования";
        
        // Передаем дополнительные параметры в открываемую форму
        Параметры.Вставить("РежимМодификации", Истина);
        Параметры.Вставить("ИсходныйОбъект", Источник);
    КонецЕсли;

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

Разберем ключевые моменты этого кода:

  1. Параметру СтандартнаяОбработка обязательно присваивается значение Ложь, чтобы отменить стандартный выбор формы платформой.
  2. В параметр ВыбраннаяФорма передается полное строковое имя целевой формы.
  3. Коллекция Параметры является структурой. Мы можем беспрепятственно дополнять ее любыми свойствами через метод Вставить(). Все значения из этой структуры будут переданы в создаваемую форму.

Принятие параметров в открываемой форме

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


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

    // Проверяем наличие переданного параметра
    Если Параметры.Свойство("РежимМодификации") И Параметры.РежимМодификации Тогда
        // Выполняем требуемую серверную логику настройки
        НастроитьФормуДляРежима();
    КонецЕсли;

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

Как правильно добавлять элементы и реквизиты на форму программно

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


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

    // Шаг 1. Создаем и добавляем реквизит формы
    МассивДобавляемыхРеквизитов = Новый Массив;
    ТипСтрока = Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(150));
    
    МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ДополнительныйКомментарий", ТипСтрока, , "Комментарий"));
    ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);

    // Шаг 2. Создаем визуальный элемент на форме и привязываем его к реквизиту
    НовыйЭлемент = Элементы.Добавить("ПолеДополнительныйКомментарий", Тип("ПолеФормы"), ЭтаФорма);
    НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
    НовыйЭлемент.ПутьКДанным = "ДополнительныйКомментарий";
    НовыйЭлемент.Заголовок = "Доп. комментарий";

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

Альтернативное решение: использование механизма расширений

Если требуется модифицировать стандартную форму типовой конфигурации без снятия с поддержки и без подмены ее на форму обработки, наилучшим подходом является использование расширений конфигурации:

  1. Заимствуем нужный объект и его форму в расширение.
  2. Добавляем необходимые реквизиты и элементы визуально в редакторе формы расширения.
  3. При необходимости программной логики перехватываем событие формы с помощью аннотации &После("ПриСозданииНаСервере") или &Вместо("ПриСозданииНаСервере").

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

← На главную