gifts2017

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

Опубликовал Dimonster (dimonster) в раздел Программирование - Практика программирования

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

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

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

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

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Николай (rinatru) 02.10.12 09:34
не понимаю смысла в данной подписке. при необходимости вне типовых алгоритмов и не внося изменения в конфигурацию можно такую задачу решить с помощью внешней обработки
2. anry mc (AnryMc) 02.10.12 09:51
"-" Кроме копипаста практически ничего нет
3. Dimonster (dimonster) 02.10.12 11:26
(1) rinatru, каким образом эту задачу предлагаете решить внешней обработкой? Предлагаете использовать ОбработчикОжидания или вызывать заполнение вручную? Цель - именно автоматизировать добавление данных после их основной записи в ОбработкеПроведения без участия пользователей.
4. Модератор раздела Артур Аюханов (artbear) 02.10.12 11:26
>> Создадим новую подписку на событие «ЗаписьНаправленияВПлатежки»
Что за событие? у 1С нет такого типового события :)
5. Алексей Старый (Alex Star) 04.10.12 08:06
Я так понимаю так подписка сама называется
6. Андрей Киреев (FractonKireyev) 11.10.12 19:30
На кого рассчитана статья? Новичок в ней ничего не поймет, а профи это всё знает не хуже автора. Похоже, что это статья ради статьи.
8. Андрей Романовский (and_r) 12.10.12 06:00
Полность согласен с FractonKireyev. Ничего нового, от автор не сообщил, надо было добавить какой-нибудь интересный пример или ловкий обход сложной ситуации... а так бумагомарательство....
9. Dimonster (dimonster) 12.10.12 15:12
(6) FractonKireyev, статья рассчитана и на новичков (алгоритмы настройки подписки простые, тестовый код приведен) и на профи (для узких специалистов это может быть полезной информацией). Также с момента их (подписок) появления в 8.1 описание работы остается достаточно скудным (например, тот факт, что несколько подписок на одно событие вызываются в произвольном порядке).
10. Антон Тоник (artichoke) 14.10.12 13:56
Метод имеет право на жизнь, непонятным осталось только зачем, так стараясь не вмешиваться в типовые механизмы, в качестве обработчика выбирается модуль "Общего назначения", где, по всей видимости, и предполагается создание процедуры-обработчика...
"Выберем для этих целей общий модуль ОбщегоНазначения. После вышеозначенных целей создается процедура..."
11. Олег Шалимов (CaSH_2004) 14.11.12 00:05
А почему идет замедление выполнения? Просто из-за дополнительного вызова или сама суть подписки выполняется платформой медленнее?
Ведь это не внешняя обработка, какая разница где прописан модуль?
12. Андрей Ро (AndrewVVS) 10.01.14 15:19
Набор записей в обработке проведения не всегда может быть заполнен - не мешало бы указать, алгоритм действия в таком случае и не всегда Ваш вариант будет отрабатывать, может понадобиться строчка Записать Движения (а рассмотреть вариант, когда данные берутся из Табличной части)... А также могли бы рассмотреть вариант решения данной задачи через подписку на событие "ПередЗаписью" Регистра накопления.
13. Михаил _ (mikele_bes) 06.02.14 09:46
столкнулся с проблемой по подпискам:
для корректной отработки подписки в свойствах модуля не нужно указывать "вызов сервера"
иначе ругается на мутабельное значение первого параметра
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа