В ходе решения различных задач пользователей иногда возникает необходимость уже сформированные движения документов (а именно определенные наборы регистров) подвергать какой-либо корректировке.
Для данных целей очень хорошо подходит объект «Подписка на событие», который позволяет выполнять какие-то действия при наступлении определенного события для большого количества объектов (например, при записи платежных документов или при установке нового номера справочников, связанных с налоговым учетом).
Также подписка на событие удобна тем, что позволяет производить различные действия, не изменяя типовые механизмы, описанные в разных модулях.
Например, возникла задача – нужно в платежные документы записывать определенные данные (информацию о направлениях деятельности компании) после формирования основных движений документа (сформированных в событии «ОбработкаПроведения»). Задача будем реализовывать на конфигурации «Управление производственным предприятием» ред. 1.3.
Давайте рассмотрим решение более подробно:
Создадим новую подписку на событие «ЗаписьНаправленияВПлатежки». У подписки существует ряд свойств, которые будут определять ее поведение:
Источник – это объект (например, документ или список документов) для которого будет вызываться действия. Для нашего случая – выберем Платежное поручение исходящее и Платежное поручение входящее
События – само действия, после которого будет выполняться наш код. Согласно условиям задачи, выберем ОбработкаПроведения
Обработчик – указание на процедуру, в которой будет происходить обработка. Выберем для этих целей общий модуль ОбщегоНазначения.
После вышеозначенных целей создается процедура, в которой необходимо поместить код для заполнения данных о направлении (предположим, что такая информация в платежках уже содержится).
Рассмотрим ее параметры:
Источник – этот объект вида СправочникОбъект или ДокументОбъект, для которого происходит действие.
Отказ – параметр, позволяющий отменить проведение документа при определенных условиях.
РежимПроведения – варианты проведения (оперативное или неоперативное), позволяющее по-разному строить алгоритмы обработки.
Остановимся на параметре Источник. Для нашей задачи тип этого параметра будет – ДокументОбъект. Для этого типа доступна коллекция Движения, которая содержит все наборы записей регистров, для которых данный документ является регистратором.
В данной коллекции содержится набор записей РасчетыСКонтрагентамиНаборЗаписей, который нас интересует. Допустим, что в регистре создано измерение Направление, которое нам необходимо заполнять из документа.
Напишем следующий код:
Наборы = Источник.Движения; Расчеты = Наборы.РасчетыСКонтрагентами; Для каждого Стр из Расчеты Цикл Стр.Направление = Источник.Направление; КонецЕсли;
Как мы видим, реализация достаточно простая, после обработки действия по записи набора предпринимать дополнительно не нужно – подписка на событие выполняется в рамках транзакции события ОбработкаПроведения, после ее окончания набор будет записан автоматически.
Плюсы данного подхода: обработка данных вне типовых алгоритмов, уменьшение объема работ по поиску и переносу изменений при обновлении, большая наглядность – весь код в одной процедуре.
Минус такого подхода: увеличение времени проведения документов и записи элементов справочников.
Надеюсь, данная информация будет полезна как начинающим программистам, так и их более опытным коллегам в качестве расширения кругозора.
«-» Кроме копипаста практически ничего нет
(1) каким образом эту задачу предлагаете решить внешней обработкой? Предлагаете использовать ОбработчикОжидания или вызывать заполнение вручную? Цель — именно автоматизировать добавление данных после их основной записи в ОбработкеПроведения без участия пользователей.
Я так понимаю так подписка сама называется
На кого рассчитана статья? Новичок в ней ничего не поймет, а профи это всё знает не хуже автора. Похоже, что это статья ради статьи.
=)
Полность согласен с FractonKireyev. Ничего нового, от автор не сообщил, надо было добавить какой-нибудь интересный пример или ловкий обход сложной ситуации… а так бумагомарательство….
(6) FractonKireyev, статья рассчитана и на новичков (алгоритмы настройки подписки простые, тестовый код приведен) и на профи (для узких специалистов это может быть полезной информацией). Также с момента их (подписок) появления в 8.1 описание работы остается достаточно скудным (например, тот факт, что несколько подписок на одно событие вызываются в произвольном порядке).
Метод имеет право на жизнь, непонятным осталось только зачем, так стараясь не вмешиваться в типовые механизмы, в качестве обработчика выбирается модуль «Общего назначения», где, по всей видимости, и предполагается создание процедуры-обработчика…
«Выберем для этих целей общий модуль ОбщегоНазначения. После вышеозначенных целей создается процедура…»
А почему идет замедление выполнения? Просто из-за дополнительного вызова или сама суть подписки выполняется платформой медленнее?
Ведь это не внешняя обработка, какая разница где прописан модуль?
Набор записей в обработке проведения не всегда может быть заполнен — не мешало бы указать, алгоритм действия в таком случае и не всегда Ваш вариант будет отрабатывать, может понадобиться строчка Записать Движения (а рассмотреть вариант, когда данные берутся из Табличной части)… А также могли бы рассмотреть вариант решения данной задачи через подписку на событие «ПередЗаписью» Регистра накопления.
столкнулся с проблемой по подпискам:
для корректной отработки подписки в свойствах модуля не нужно указывать «вызов сервера»
иначе ругается на мутабельное значение первого параметра