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