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