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