Как правильно вызвать код дополнительной обработки при проведении документа?

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

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

Почему нельзя использовать форму документа?

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

Более того, проведение документа — это бизнес-процесс, происходящий на сервере, в то время как форма — это интерфейс. Разделение логики формы и логики данных — фундаментальный принцип разработки в 1С. Поэтому мы будем реализовывать решение на уровне модуля объекта или подписки на событие.

Решение через подписку на событие

Самый надежный и правильный способ реализации — это использование механизма Подписка на событие. Давайте рассмотрим по шагам, как это организовать:

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

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


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

Передача параметров из формы

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

Поскольку ДополнительныеСвойства доступны в рамках одного сеанса записи, мы можем передать туда флаг «необходимости выполнения». Порядок действий следующий:

  1. В модуле формы, перед записью, поместите признак в свойства объекта.
  2. В модуле объекта или в подписке на событие считайте этот признак.

// В модуле формы:
Объект.ДополнительныеСвойства.Вставить("ВыполнитьМоюЛогику", Истина);
Записать(РежимЗаписиДокумента.Проведение);

// В модуле объекта (в процедуре ОбработкаПроведения):
Если ДополнительныеСвойства.Свойство("ВыполнитьМоюЛогику") Тогда
    // Выполняем действия
КонецЕсли;

Рекомендации по архитектуре

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

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

Применяя эти подходы, вы сможете гибко управлять поведением документов, сохраняя чистоту архитектуры и надежность данных.

← На главную