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

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

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

Почему событие «ОбработкаПолученияФормы» не подходит для добавления элементов

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

Из-за отсутствия готового объекта УправляемаяФорма его коллекции — Элементы, Реквизиты и Команды — недоступны для модификации. Попытка обратиться к элементам формы в этом событии приведет к ошибке.

Способ 1. Использование расширений конфигурации (рекомендуемый подход)

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

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

Посмотрим на пример кода в модуле формы расширения:


&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    МойОбщийМодуль.МодифицироватьФорму(ЭтотОбъект);
КонецПроцедуры

Способ 2. Программное создание элементов через централизованный общий модуль

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

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


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

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

Важное ограничение платформы: метод ИзменитьРеквизиты() можно вызывать только в обработчике ПриСозданииНаСервере. На более поздних этапах жизненного цикла формы динамическое добавление реквизитов с путем к данным недоступно.

Способ 3. Использование подсистем БСП и переопределяемых модулей

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

Выясним, какие точки расширения можно использовать:

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

Если точка останова в процедуре ПодключаемыеКоманды.ПриСозданииНаСервере не срабатывает, проверим следующие причины:

Способ 4. Передача параметров через «ОбработкаПолученияФормы»

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


Процедура ОбработкаПолученияФормыПриПолученииФормы(Источник, ВидФормы, Параметры, ВыбраннаяФорма, ДополнительныеПараметры, СтандартнаяОбработка)
    
    // Передаем признак необходимости модификации
    Параметры.Вставить("СпециальныйРежимОтображения", Истина);

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

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

← На главную