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

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

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

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

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

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

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

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

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

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

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

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

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

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

Отступление

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

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

Создаем подписку в 1С

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

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

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

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

После выбора модуля и перехода в него, остается лишь описать действия процедуры, и на этом создание подписки в конфигурации будет закончено. Далее можно обновлять конфигурацию 1C и проверять результат работы описанной на встроенном языке процедуры. Разработчики с помощью подписок делают проверки перед записью или проведением документа для контроля заполнения нужных полей. Также удобно заполнять дополнительные регистры – документ или элемент справочника уже записан, и вы можете использовать достоверные данные.

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

Подписки в расширениях

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

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

  • После;
  • Перед;
  • Вместо.

В последнем случае код из конфигурации не будет работать, как будто его закомментировали, а вместо него написали свою процедуру. Как это происходит, рассмотрим на примере документа «Реализация товаров и услуг» – будем выдавать сообщение об успехе продажи перед записью. Для этого нам необходимо добавить к конфигурации расширение:


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


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


Фрагмент кода

&После("ПередЗаписью") Процедура Подп_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) КонецПроцедуры

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

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

Дорабатывайте конфигурации с минимальными изменениями и обновления не будут отнимать у вас много времени.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Мы нажали на какую-то кнопку, сразу начинает выполняться определенное действие — закрывается или открывается форма, сохраняется или читается документ — возникает соответствующее событие. На любое событие программист имеет возможность назначить специальную функцию, которая написана на встроенном языке 1С и сможет выполнить заданные ей действия при возникновении события.

Очень часто возникает необходимость назначить обработчик сразу на целый документ или несколько отдельных. Например, в каждом из документов содержится реквизит «Пользователь». Или мы просто такой общий реквизит добавили. Заполнен ли данный реквизит, мы сможем увидеть, только проконтролировав самостоятельно весь процесс. Но как нам это сделать?

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

Подписка на события в 1С — это объект, который находится в соответствующей конфигурации Общие / Подписки на события. Эта подписка позволяет назначить обработчик для таких случаев, когда наступают определенные события сразу для нескольких объектов.

Установим название и добавим новую подписку на событие 1С

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

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

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


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

Мы сумели подписаться для всех документов на событие "Перед записью". Теперь будет выполнятся функция при записи любого документа, в которой прописана проверка. Если проверка прошла отрицательно, то для того, чтобы отказаться в записи документа нужно установить параметр функции
Отказ = Истина.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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