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

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

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

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

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

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

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

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

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

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

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

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

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


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


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


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

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

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

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

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

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

  • Что такое подписка на событие и как его применять на практике?
  • Как выполнить проверку дублирования наименования при записи элемента справочника без модификации модулей самого справочника?
  • Как, при помощи подписки на событие, обеспечить формирование движений по регистру накопления при проведении документа?
  • Как обеспечить подмену основной формы документа?

Применимость

В статье рассматривается платформа «1С:Предприятие» редакции 8.3. Представленная информация актуальна для текущих релизов платформы.

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

В статье рассматриваются несколько примеров применения одного из вспомогательных объектов платформы «1С:Предприятие 8» – подписок на события .

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

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

Подписки на события описываются в ветке Общие окна объектов конфигурации (Рис.1).

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

  1. Выполняется обработчик события ПередЗаписью() в модуле объекта документа.
  2. Если в ходе выполнения обработчика параметр Отказ принимает значение Истина или вызывается исключение, то обработка события прерывается.
  3. Если на втором шаге обработка события не прерывалась, то выполняются внешние обработчики (подписки на события), определенные для события ПередЗаписью() .
  4. Если в ходе выполнения внешнего обработчика параметр Отказ принимает значение Истина или вызывается исключение, то выполнение внешнего обработчика прерывается.

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

Задача 1

Выполнить проверку дублирования наименования при записи элемента справочника “Контрагенты” – без модификации модулей самого справочника.

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

Флаг Клиент (обычное приложение) доступен, если в параметрах конфигуратора установлен режим редактирования Управляемое приложение и обычное приложение .

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

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

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

Листинг процедуры ПроверкаНаименованияСправочникаПередЗаписью()

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

Задача 2

Создать оборотный регистр накопления “Выбытия денежных средств” и обеспечить формирование движений по этому регистру при проведении документа “Расходный кассовый ордер”, используя механизм подписок на события.

Создать новый оборотный регистр с именем ВыбытияДенежныхСредств . Выбрать регистратор “Расходный кассовый ордер”. Добавить измерения регистра:

Создать ресурс регистра:

Сумма , тип Число , Длина – 15, Точность – 2.

В документе “Расходный кассовый ордер” создать реквизит СтатьяДвижения с типом данных СправочникСсылка.СтатьиДвиженияДенежныхСредств .

Имя – ДвиженияПоВыбытиюДенежныхСредств ;
Источник – ДокументОбъект.РКО ;
Событие – ОбработкаПроведения .

В общем модуле ОбработчикиПодписокНаСобытия создать обработчик . В обработчике осуществляется обход табличной части документа “Расходный кассовый ордер” и формируются движения в регистре накопления ВыбытияДенежныхСредств .

Листинг процедуры ДвиженияПоВыбытиюДенежныхСредствОбработкаПроведения()

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

Задача 3

Обеспечить подмену основной формы документа “Расходный кассовый ордер”.

Создать новую форму документа “Расходный кассовый ордер” с именем ФормаДокументаКлиентская . Внести в форму произвольные изменения, например, поменять порядок элементов управления. Для вызова этой формы необходимо использовать подписку на событие ОбработкаПолученияФормы() в модуле менеджера документа “Расходный кассовый ордер”.

Создать новую подписку на событие:

Имя – ОсновнаяФормаРКО;
Источник – ДокументМенеджер.РКО;
Событие – ОбработкаПолученияФормы.

В общем модуле ОбработчикиПодписокНаСобытия создать обработчик . В обработчик в качестве параметра ВыбраннаяФорма передается имя открываемой формы.
Параметр СтандартнаяОбработка устанавливается в значении Ложь для отключения открытия основной формы.

Листинг процедуры ОсновнаяФормаРКООбработкаПолученияФормы()

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

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

  • Увеличение сложности алгоритмов.
  • Подписаться можно только на события объектов и менеджеров объектов.

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

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

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

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

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

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

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

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


Рис.3

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Рис.4

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

Подписка на событие 1С 8.3 и 8.2 — объект конфигурации, позволяющий назначить обработчик на определенное событие объекта. Такой обработчик можно назначить сразу на несколько объектов конфигурации, например, сразу на все документы.

Рассмотрим этот объект метаданных подробнее.

  • ПриУстановкеНовогоНомера
  • ПриКопировании
  • ОбработкаЗаполнения
  • ПередЗаписью
  • ПриЗаписи
  • ПередУдалением
  • ОбработкаПроведения
  • ОбработкаУдаленияПроведения
  • ОбработкаПроверкиЗаполнения

Подписку на событие можно установить только на объект, а не на форму.

Очередность вызова обработчиков в 1С 8

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

Получите 267 видеоуроков по 1С бесплатно:

Если подписок на одно событие несколько, то, судя по опыту, сначала вызывается вышестоящая в древе конфигурации подписка. Хотя и сама фирма 1С сообщает, что эта очередность не определена.

Использование подписок на событие в 1С

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

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

Настройка подписки на событие

Настроить подписку очень просто:

  • Источник — типы данных, для которых устанавливается обработчик;
  • Событие — событие, для которого установлен обработчик;
  • Обработчик — указывается процедура из , в которой будет расположен обработчик события.



Close