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

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

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

Ограничения платформы при работе с управляемыми формами

Попытка перехватить открытие формы документа через подписку на событие ОбработкаПолученияФормы и модифицировать ее из внешней обработки наталкивается на фундаментальные ограничения клиент-серверной архитектуры 1С:

  1. Несериализуемость объекта формы: Объект УправляемаяФорма является контекстным и существует на клиенте только в виде ссылки на форму. Его невозможно передать в качестве параметра в серверную процедуру общего модуля или внешней обработки.
  2. Контекст метода ИзменитьРеквизиты: Метод ИзменитьРеквизиты доступен исключительно на сервере и может быть выполнен только внутри контекста самой формы (например, в обработчиках ПриСозданииНаСервере или ПриЧтенииНаСервере). Вызвать его снаружи формы при наличии лишь клиентской ссылки на нее невозможно.
  3. Специфика события ОбработкаПолученияФормы: Данное событие служит исключительно для выбора типа или имени формы, которая должна быть открыта. В момент его срабатывания контекст формы еще не сформирован, и программно внедрить в нее реквизиты нельзя.
  4. Назначение обработчиков событий: Метод УстановитьДействие для программно созданных элементов может связывать события только с процедурами модуля самой формы или серверными процедурами общих модулей. Подключить в качестве обработчика процедуру из модуля внешней обработки платформа не позволяет.

Использование метода ИзменитьРеквизиты в контексте формы

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

Для добавления нового реквизита формируется массив объектов РеквизитФормы, после чего вызывается метод управляемой формы:


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

// Применяем изменения к структуре реквизитов формы
ЭтаФорма.ИзменитьРеквизиты(МассивРеквизитов);

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

Важно: Обращение к программно добавленным реквизитам верхнего уровня в коде модуля формы возможно только через конструкцию ЭтотОбъект.ИмяРеквизита.

Решение через переопределяемые модули БСП

Если конфигурация построена на базе «Библиотеки стандартных подсистем» (БСП), внедрение дополнительных реквизитов без изменения форм документов выполняется через механизм общих переопределяемых модулей. В типовых конфигурациях формы документов при инициализации на сервере передают свой контекст в общие модули.

Разберем по шагам, как подключить программное изменение формы:

  1. Найдем в конфигурации общий модуль МодификацияКонфигурацииПереопределяемый или УправлениеСвойствамиПереопределяемый.
  2. В процедуре ПриСозданииНаСервере получаем контекст формы через переданный параметр Форма.
  3. Проверяем тип документа или имя формы и выполняем внедрение реквизитов и элементов.

Процедура ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Экспорт
    
    // Проверяем имя формы или тип основного реквизита
    Если Форма.ИмяФормы = "Документ.РеализацияТоваровУслуг.Форма.ФормаДокумента" Тогда
        
        МассивДобавляемых = Новый Массив;
        МассивДобавляемых.Добавить(Новый РеквизитФормы("СпецСтатус", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(50)), , "Специальный статус"));
        
        Форма.ИзменитьРеквизиты(МассивДобавляемых);
        
        // Создаем элемент формы
        НовыйЭлемент = Форма.Элементы.Добавить("СпецСтатус", Тип("ПолеФормы"), Форма);
        НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
        НовыйЭлемент.ПутьКДанным = "СпецСтатус";
        
    КонецЕсли;
    
КонецПроцедуры

Альтернативные архитектурные решения

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

  1. Типовой механизм «Дополнительные реквизиты и сведения»: Если задача сводится к вводу и хранению дополнительной информации в документе, целесообразно задействовать стандартную подсистему свойств БСП. В режиме «1С:Предприятие» для нужного вида документов создается дополнительный реквизит. Он автоматически отобразится на форме и запишется в базу данных без написания программного кода.
  2. Подмена формы документа на форму обработки: В процедуре-подписчике события ОбработкаПолученияФормы стандартная обработка отменяется (СтандартнаяОбработка = Ложь), а в качестве возвращаемой формы назначается форма универсальной внешней обработки. Эта форма полностью берет на себя логику отображения типовых полей объекта, работу с дополнительными реквизитами и запись документа через объектную модель.
  3. Использование вспомогательного диалогового окна: Типовая форма документа открывается без изменений, а ввод специфических данных выполняется в отдельном рабочем месте или боковой панели. Взаимодействие между типовой формой и внешним окном реализуется через механизм глобальных оповещений платформы (Оповестить и ОбработкаОповещения).
← На главную