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

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

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

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

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

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

Разберем по шагам, как добавить реквизит и визуальный элемент через расширение:

  1. Добавление реквизита в документ: если режим совместимости конфигурации установлен 8.3.11 или выше, вы можете заимствовать документ в расширение и добавить новый реквизит непосредственно в структуру объекта. Данные реквизита будут автоматически сохраняться в отдельной таблице базы данных расширения.
  2. Заимствование формы документа: добавляем форму документа в расширение. При этом в расширении формируется копия макета формы на момент заимствования.
  3. Размещение элемента на форме: перетаскиваем добавленный реквизит из списка реквизитов формы на панель элементов интерфейса.
  4. Обработка проведения: перехватываем процедуру проведения в модуле объекта документа с помощью аннотации &После("ОбработкаПроведения") или создаем собственную подписку на событие внутри расширения. Значение реквизита доступно напрямую через контекст ЭтотОбъект.ИмяРеквизита.

Способ 2. Программное создание элементов формы в расширении (без изменения макета)

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

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

  1. Заимствуем форму документа в расширение только ради модуля формы (не меняя её визуальный состав).
  2. В модуле формы перехватываем обработчик события инициализации с директивой &После:

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

Для обработки пользовательского ввода в модуль формы расширения добавляется клиентская процедура:


&НаКлиенте
Процедура Расш1_ПолеДополнительныйПараметрПриИзменении(Элемент)
    // Обработка логики при изменении значения пользователем
КонецПроцедуры

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

Способ 3. Типовой механизм БСП «Дополнительные реквизиты и сведения»

Если конфигурация типовая (как «1С:Бухгалтерия 3.0»), задачу часто можно решить без единой строчки доработки формы:

  1. В разделе администрирования включаем функциональную опцию «Дополнительные реквизиты и сведения».
  2. Для нужного документа (например, «Поступление (акты, накладные)») добавляем новый дополнительный реквизит.
  3. Библиотека стандартных подсистем (БСП) автоматически встроит поле ввода на управляемую форму при её открытии.
  4. Для доработки проведения создается подписка на событие ОбработкаПроведения (в расширении или основной конфигурации), где значение реквизита считывается из табличной части документа ДополнительныеРеквизиты.

Способ 4. Точечный перехват через общий модуль БСП

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


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

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

← На главную