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

💖 Нравится? Поделись с друзьями ссылкой

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

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

Стандартное поведение

Пусть в нашем примере используется некоторый справочник "ПростойСправочник". Для него созданы подписки на события для каждого события, в которое может вмешаться разработчик. Процедуры-обработчики событий находятся в соответсвующем серверном общем модуле.

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

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

При записи элемента справочника, будь то новый элемент или существующий, вызываются три обработчика: "ОбработкаПроверкиЗаполнения" (на этом этапе обработчик может проверить корректность введенных данных и в случае, если есть ошибки, отказаться от записи), "ПередЗаписью" (пока объект не записан в базу можно корректировать значения реквизитов и проверить какие-либо дополнительные условия) и затем "ПриЗаписи" (запись в базу произведена, но транзакция не закрыта, разработчик может проверить данные после записи и при необходимости отменить транзакцию).

Событие "ПередУдалением" возникает только в случае непосредственного удаления объекта из информационной базы. Обычно, ни один пользователь не обладает правами на непосредственное удаление без проверки ссылочной целостности. Удаление всегда должно производиться обработкой "Удаление помеченных объектов". В последнем случае обработчик "ПередУдалением" тажке вызывается.

Таким образом, если мы создаем элемент справочника и записываем его в информационную базу, платформа выполнит вызов следующих обработчиков событий в указанном порядке:

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

Недокументированная сторона

Теперь рассмотрим интересную ситуацию. Допустим, для нашего справочника "ПростойСправочник" определены три подписки на событие "ПередЗаписью":

Как Вы думаете, в какой последовательности будут вызываться обработчкики этих подписок? Не будем гадать. Приведу результат записи элемента, где обработчик каждой подписки выводит сообщение с именем вызываемой подписки (см. следующий скриншот).

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

Отступление

Вы спросите: "Для чего создавать несколько подписок для одного события объекта конфигурации?". Ответ прост. Если разработкой занимаются несколько человек, то вмешательство в созданные механизмы друг друга может привести к некорректной работе программы. В таких случаях самым логичным будет создавать отдельные подписки на события каждому разработчкику в соотетствии с поставленной задачей. Конечно, не исключено, что в дальнейшем они будут объединены в единую процедуру-обработчик.

Данная статья является анонсом новой функциональности.
Не рекомендуется использовать содержание данной статьи для освоения новой функциональности.
Полное описание новой функциональности будет приведено в документации к соответствующей версии.
Полный список изменений в новой версии приводится в файле v8Update.htm.

Реализовано в EDT версии 1.7.0.567.

В 1C:Enterprise Development Tools (EDT) мы реализовали прототип нового инструмента. Рабочее название этого инструмента – редактор Все подписки на события . Он поможет вам удобно анализировать подписки на все события, которые существуют в прикладном решении.

Подписки на события

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

Получается что подписка – это удобный и универсальный механизм. Но в больших прикладных решениях количество подписок на события может достигать нескольких сотен. Анализировать их в дереве конфигурации, в линейном списке, становится неудобно. Например, в прикладном решении 1С:Управление предприятием (ERP) более 340 подписок на события.

EDT несколько облегчает работу с подписками, показывая их в панели Схема , когда открыт модуль какого-либо прикладного объекта.


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

Все подписки на события

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


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


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

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


Если вы вызываете редактор для некоторого объекта конфигурации, будут показаны события и подписки только этого объекта, а сам объект всегда будет подсвечен красным в списке источников. Таким образом, вы можете быстро проконтролировать, например, что выбранная вами подписка работает для всех объектов конфигурации, для которых это нужно.


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


Кроме этого редактор содержит универсальный фильтр, с помощью которого вы можете произвольным образом настраивать состав объектов, событий и процедур.


Обратите внимание, что с помощью этого фильтра вы можете выбирать не только конкретные объекты, являющиеся источником событий, но и наборы типов, такие как СправочникОбъект , ДокументОбъект и другие. Такие наборы типов включают в себя все справочники или все документы, которые есть в конфигурации.

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


В любой момент вы можете быстро отфильтровать содержимое по тому событию или источнику, который показан в редакторе. Например, вы нашли подписку ПроверитьФормулуРасчета . Её источником является план видов расчета Удержания .


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


Автоматическое добавление точек останова

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

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


Вы можете найти и выбрать интересующий вас объект, выбрать одно из его событий, и отметить, например, все обработчики. После нажатия ОК точки останова будут добавлены на первую исполняемую строку каждого отмеченного обработчика, и все эти точки появятся в панели Точки прерывания в перспективе Отладка .


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


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


Таким образом, редактор Все подписки на события является универсальным инструментом, позволяющим использовать самые разные сценарии анализа. Он будет полезен не только разработчикам, которые хорошо знают прикладное решение, но и специалистам по внедрению или IT-специалистам, которым требуется разобраться с незнакомой функциональностью.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

В управляемой форме могут быть сгенерированы события: ПриЧтенииНаСервере, ПриСозданииНаСервере, ПриОткрытии и т.д.

События в управляемой форме генерируются на клиенте и на сервере: ПередЗаписью, ПередЗаписьюНаСервере.

События вызываются в разных модулях: ФормаЭлемента, МодульОбъекта, МодульМенеджера.

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

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

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

Чтобы лучше понять логику и последовательность вызываемых событий, можно воспользоваться разработкой «Изучение событий» прикрепленной к данной статье. Зная контекст вызова события, последовательность событий и действия которые будет выполнять пользователь будет легче понять в какой обработчик событий лучше всего поместить свой программный код.

Инструкция к применению программы «Изучение событий»

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

Все события отображаются в специальном окне «Последние события». В нем можно включить или выключить запись событий. По умолчанию при первом открытии запись событий включена. Окно «Последние события» советую закрепить снизу экрана сразу при запуске программы, для удобного просмотра событий.

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

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

Все записанные события можно посмотреть через «Отчет по событиям», который находится в разделе «Сервис».

Чтобы быстро очистить все записанные действия и события в разделе «Сервис» выбираем «Очистить события и действия».

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

Проанализировав отзывы пользователей, разработчики в восьмерке реализовали новый объект, получивший название «Подписка на событие». В этой статье мы постараемся раскрыть:

  • Настройку подписок;
  • Создание;
  • Особенности функционирования.

Создание новой подписки

Как и любой другой объект метаданных, подписка на событие в 1С добавляется из конфигуратора.

Находится эти элементы в ветке дерева «Общие» (Рис.1).

Для добавления нового обработчика необходимо:


Рис.3

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

Особенности функционирования подписок

Одним из главных вопросов, возникающих у пользователей начинающих работать с объектом «Подписка на события», является вопрос о порядке вызова процедур. Зачастую именно здесь кроются ошибки, связанные с тем, что процедура не срабатывает или срабатывает через раз.

На примере процедуры ПриЗаписи() для любого документа можно увидеть порядок вызова обработчиков.

Так, если в модуле объекта документ, существует эта процедура и параллельно с ней существует обработка, вызываемая из подписки и обрабатывающая то же самое событие, в первую очередь будет отработан модуль документа. Если в ходе выполнения ПриЗаписи() в модуле документа, параметр Отказ по каким-либо причинам примет значение Истина, подписка гарантировано не сработает.

В случае, когда существует несколько объектов-подписок, одинаковых для одного источника и одного события, отследить порядок выполнения очень сложно. И, если в ходе выполнения, хотя бы одного обработчика, будет вызвана исключительная ситуация, часть процедур останется не выполненной.

Таким образом, последовательность обработок можно задать следующей схемой:

  1. Обрабатываются события модуля объекта;
  2. Обрабатываются подписки, связанные непосредственно с текущим типом данных;
  3. Отрабатывается код, привязанный к общему типу.

Очень важно запомнить, что ни в коем случае в процедуры, исполняемые при записи, при проведении нельзя вставлять код, меняющий данные объекта-источника, это может привести к ненужному зацикливанию. Лучше подобный код использовать в процедурах ПередЗаписью.

Обработчик события открытия формы

Возрастающая популярность управляемых форм, используемых в 8 версии программы, а так же проблемы связанные с обновлением этих объектов с сохранением собственных изменений, привели к тому, что, начиная с платформы 8.2.15, в программе появилось событие ОбработкаПолученияФормы. Именно сюда можно вставлять код, изменяющий и заменяющий типовые формы.

Некоторые особенности данного обработчика:

  • Событие не сработает в случае, если в конфигурации открываемая типовая форма прописана строго;
  • Событие может быть реализовано только для управляемых форм;
  • Общий модуль, содержащий этот обработчик должен не только иметь признак «Сервер», но и содержать установленный флажок в поле «Вызов сервера».

Важно учитывать, что эта подписка вызывается не для конкретного объекта, а для его менеджера, то есть поле источник должно содержать это слово (Рис.4)

Рис.4

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

Рассказать друзьям