Использование подписок на событие для корректировки движений документов «извне»

Рассмотрим на практическом примере использование объекта "Подписка на событие" для корректировки движений документа.

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

Для данных целей очень хорошо подходит объект «Подписка на событие», который позволяет выполнять какие-то действия при наступлении определенного события для большого количества объектов (например, при записи платежных документов или при установке нового номера справочников, связанных с налоговым учетом).

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

 Например, возникла задача – нужно в платежные документы записывать определенные данные (информацию о направлениях деятельности компании) после формирования основных движений документа (сформированных в событии «ОбработкаПроведения»). Задача будем реализовывать на конфигурации «Управление производственным предприятием» ред. 1.3.

 Давайте рассмотрим решение более подробно:

 Создадим новую подписку на событие «ЗаписьНаправленияВПлатежки». У подписки существует ряд свойств, которые будут определять ее поведение:

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

 События – само действия, после которого будет выполняться наш код. Согласно условиям задачи, выберем ОбработкаПроведения

 Обработчик – указание на процедуру, в которой будет происходить обработка. Выберем для этих целей общий модуль ОбщегоНазначения.

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

 Рассмотрим ее параметры:

 Источник – этот объект вида СправочникОбъект или ДокументОбъект, для которого происходит действие.

Отказ – параметр, позволяющий отменить проведение документа при определенных условиях.

РежимПроведения – варианты проведения (оперативное или неоперативное), позволяющее по-разному строить алгоритмы обработки.

 Остановимся на параметре Источник. Для нашей задачи тип этого параметра будет – ДокументОбъект. Для этого типа доступна коллекция Движения, которая содержит все наборы записей регистров, для которых данный документ является регистратором.

 В данной коллекции содержится набор записей РасчетыСКонтрагентамиНаборЗаписей, который нас интересует. Допустим, что в регистре создано измерение Направление, которое нам необходимо заполнять из документа.

Напишем следующий код:

Наборы = Источник.Движения;
Расчеты = Наборы.РасчетыСКонтрагентами;
Для каждого Стр из Расчеты Цикл
Стр.Направление = Источник.Направление;
КонецЕсли;

 

Как мы видим, реализация достаточно простая, после обработки действия по записи набора предпринимать дополнительно не нужно – подписка на событие выполняется в рамках транзакции события ОбработкаПроведения, после ее окончания набор будет записан автоматически.

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

Минус такого подхода: увеличение времени проведения документов и записи  элементов справочников.

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

11 Comments

  1. AnryMc

    «-» Кроме копипаста практически ничего нет

    Reply
  2. dimonster

    (1) каким образом эту задачу предлагаете решить внешней обработкой? Предлагаете использовать ОбработчикОжидания или вызывать заполнение вручную? Цель — именно автоматизировать добавление данных после их основной записи в ОбработкеПроведения без участия пользователей.

    Reply
  3. Alex Star

    Я так понимаю так подписка сама называется

    Reply
  4. FractonKireyev

    На кого рассчитана статья? Новичок в ней ничего не поймет, а профи это всё знает не хуже автора. Похоже, что это статья ради статьи.

    Reply
  5. klel

    =)

    Reply
  6. and_r

    Полность согласен с FractonKireyev. Ничего нового, от автор не сообщил, надо было добавить какой-нибудь интересный пример или ловкий обход сложной ситуации… а так бумагомарательство….

    Reply
  7. dimonster

    (6) FractonKireyev, статья рассчитана и на новичков (алгоритмы настройки подписки простые, тестовый код приведен) и на профи (для узких специалистов это может быть полезной информацией). Также с момента их (подписок) появления в 8.1 описание работы остается достаточно скудным (например, тот факт, что несколько подписок на одно событие вызываются в произвольном порядке).

    Reply
  8. artichoke

    Метод имеет право на жизнь, непонятным осталось только зачем, так стараясь не вмешиваться в типовые механизмы, в качестве обработчика выбирается модуль «Общего назначения», где, по всей видимости, и предполагается создание процедуры-обработчика…

    «Выберем для этих целей общий модуль ОбщегоНазначения. После вышеозначенных целей создается процедура…»

    Reply
  9. CaSH_2004

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

    Ведь это не внешняя обработка, какая разница где прописан модуль?

    Reply
  10. AndrewVVS

    Набор записей в обработке проведения не всегда может быть заполнен — не мешало бы указать, алгоритм действия в таком случае и не всегда Ваш вариант будет отрабатывать, может понадобиться строчка Записать Движения (а рассмотреть вариант, когда данные берутся из Табличной части)… А также могли бы рассмотреть вариант решения данной задачи через подписку на событие «ПередЗаписью» Регистра накопления.

    Reply
  11. mikele_bes

    столкнулся с проблемой по подпискам:

    для корректной отработки подписки в свойствах модуля не нужно указывать «вызов сервера»

    иначе ругается на мутабельное значение первого параметра

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *