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