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

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

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

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

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

В объекте Документ за логику создания на основании отвечает процедура ОбработкаЗаполнения, расположенная в модуле объекта. Проанализируем, как мы можем на нее повлиять с помощью аннотаций:

  1. Аннотация &После: Используется, если типовое заполнение в целом работает корректно, но вам нужно «дозаполнить» специфические реквизиты, которые были добавлены вами в расширении.
  2. Аннотация &Вместо: Позволяет полностью заменить стандартный код своим алгоритмом. Это необходимо, если типовая логика содержит ошибки или категорически не подходит под бизнес-процессы компании.
  3. Аннотация &Перед: Позволяет подготовить данные перед выполнением основного кода или полностью отменить выполнение стандартного обработчика.

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

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


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

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

Метод 2. Подписки на события

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

Выясним, как это работает: вы создаете в дереве метаданных новый объект Подписка на событие, выбираете в качестве источника нужный тип документа (или группу документов), а в качестве события — ОбработкаЗаполнения. Обработчик подписки должен располагаться в общем модуле.

Важное ограничение: Подписка на событие ОбработкаЗаполнения всегда выполняется после того, как отработал код в модуле объекта. Это значит, что вы не можете «отменить» выполнение стандартного кода через параметр СтандартнаяОбработка из подписки, так как к моменту вызова подписки событие уже произошло. Однако вы можете программно очистить или скорректировать уже заполненные поля.

Метод 3. Механизм БСП «Дополнительные отчеты и обработки»

Если ваша конфигурация построена на базе БСП (как большинство современных решений: УТ 11, ERP, КА, БП 3.0), мы можем использовать механизм внешних обработок. В БСП существует специальный вид внешней обработки — «Создание связанных объектов».

Посмотрим на преимущества этого подхода:

Разберем алгоритм настройки. В модуле внешней обработки необходимо описать функцию СведенияОВнешнейОбработке(), указав вид ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиСозданиеСвязанныхОбъектов(). Основная логика по заполнению будет находиться в методе ВыполнитьКоманду().

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

Метод 4. Параметры выбора и связи параметров выбора

Иногда задача «редактирования заполнения» сводится к тому, чтобы при выборе данных в новом документе срабатывали правильные фильтры, зависящие от документа-основания. В этом случае программирование в модулях вообще может не понадобиться.

Проанализируем свойства реквизитов. Используя механизм Связи параметров выбора в свойствах реквизита документа, мы можем указать платформе, что значение поля (например, Договор) должно фильтроваться по значению поля Контрагент, которое уже было заполнено из основания. Это настраивается в окне свойств реквизита в конфигураторе и также может быть сделано через расширение без изменения основной конфигурации.

Метод 5. Переопределяемые модули БСП

В крупных типовых решениях (например, ERP или УТ 11) вендор часто выносит логику заполнения из модулей объектов в специализированные менеджеры. Рассмотрим, как найти такие точки входа.

Найдем в конфигурации общие модули с суффиксом Переопределяемый. Например, ЗаполнениеОбъектовПереопределяемый. В этих модулях часто предусмотрены пустые процедуры-«заглушки», предназначенные специально для кастомизации. Вместо того чтобы вмешиваться в код каждого документа, мы можем через расширение добавить логику в один такой модуль, и она будет применяться ко всем операциям заполнения в системе. Это делает архитектуру решения более стройной и понятной.

Резюме и выбор решения

Подведем итог нашему анализу. Выбор метода зависит от конкретной задачи:

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

← На главную