При определении обработчика события на экземпляр объекта 1с предприятие количество параметров

Обновлено: 05.07.2024

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

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

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

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

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

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

Пример кода процедуры-обработчика:

Обработчик события должен удовлетворять следующим требованиям:

  1. процедура должна быть расположена в общем модуле;
  2. у общего модуля, в котором расположена процедура, должны быть заданы следующие свойства:
    • флаг "Глобальный" снят ;
    • флаг "Клиент (обычное приложение)" установлен;
    • флаг "Клиент (управляемое приложение)" установлен;
    • флаг "Сервер" установлен;
    • флаг "Внешнее соединение" установлен.
  3. Количество параметров процедуры должно быть на единицу больше, чем количество параметров, которое имеет обработчик выбранного события.
  • существует мнение, что обязателен только флаг "Сервер", другие без разницы, хоть сняты, хоть установлены.

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

  • ДобавитьОбработчик ;
  • УдалитьОбработчик .

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

События на которые можно назначить обработчик подписки на событие:

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

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

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

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

Особенности обработки подписки на событие 1С:

    При определении на одно событие объекта 1С:Предприятие нескольких подписок на событие процедуры вызываются в произвольном порядке.
При определении подписки на событие для разных объектов перечень показываемых событий формируется по принципу:
  • должно совпадать количество параметров события;
  • должно совпадать имя события.

Добавить комментарий Отменить ответ

Для отправки комментария вам необходимо авторизоваться.

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

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

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

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

Какие бонусы мы получим:
• Для объектов – для всех событий объектов будут вызываться события до стандартной реакции, после стандартной реакции и можно будет отменить стандартную реакцию.
• Для форм - для всех событий формы будут вызываться события до стандартной реакции, после стандартной реакции и можно будет отменить стандартную реакцию.
• Для форм можно будет добавлять любые элементы управления, реакцию на которые описывать в общем модуле, т.к. все события всех возможных типов элементов управления будут прописаны в форме.
• У форм и объектов будет добавлена одна переменная типа структура, где можно будет хранить свои вспомогательные переменные, чтобы не добавлять их в объявление переменных каждой формы/объекта.
• У форм и объектов будут доступны некоторые недостающие методы, которые будут описывать форму/объект. Например, для формы это будет функция, которая возвращает имя формы.
• Обработчики событий элементов управления формы можно будет программно вызывать, т.е. например программно кликать на кнопках, вводить текст в поле ввода аналогично тому, как это делает пользователь и т.п.


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

В целях ускорения разработки я выношу ее на коллективную правку/работу. На исключительные авторские права не претендую.

Общие принципы

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

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

Все процедуры и функции будут начинаться с префикса «ГОС_» для избежания конфликтов по имени.

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

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

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

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

Парсинг модуля объекта

Добавление переменных

Парсинг обработчиков событий

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

Для справочника определены следующие события:
• ОбработкаЗаполнения(<Основание>)
• ПередЗаписью(<Отказ>)
• ПередУдалением(<Отказ>)
• ПриЗаписи(<Отказ>)
• ПриКопировании(<Объект копирования>)
• ПриУстановкеНовогоКода(<Стандартная обработка>, <Префикс>)
Для документа определены следующие события:
• ОбработкаЗаполнения(<Основание>)
• ОбработкаПроведения(<Отказ>, <Режим проведения>)
• ОбработкаУдаленияПроведения(<Отказ>)
• ПередЗаписью(<Отказ>, <Режим записи>, <Режим проведения>)
• ПередУдалением(<Отказ>)
• ПриЗаписи(<Отказ>)
• ПриКопировании(<Объект копирования>)
• ПриУстановкеНовогоНомера(<Стандартная обработка>, <Префикс>)

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

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

Т.е. если функция-обработчик начала события вернет ложь, стандартная обработка события вызываться не будет.

Парсинг форм


Парсинг идет одинаково для всех определенных в конфигурации форм прикладного объекта.

Добавление переменных

Добавление методов


Добавляются следующие функции-методы:
• ВидФормы() – возвращает один из видов формы: ФормаСписка, ФормаЭлемента, ФормаВыбора, ФормаВыбораГруппы, ФормаГруппы, Форма.
• ИмяФормы() – возвращает имя формы, как оно задано в конфигураторе.
Эти параметры определяются из названия модуля во время парсинга.

Парсинг обработчиков событий

Для формы характерно отсутствие явного соответствия между событием и именем процедуры, кроме того обработчики событий могут назначаться динамически.
Поэтому и перехват событий для формы возможен только динамически.
Список событий всех форм:
• ВнешнееСобытие(<Источник>, <Событие>, <Данные>)
• ОбновлениеОтображения()
• ОбработкаАктивизацииОбъекта(<Активный объект>, <Источник>)
• ОбработкаВыбора(<Результат выбора>, <Источник выбора>)
• ОбработкаЗаписиНовогоОбъекта(<Объект>, <Источник>)
• ОбработкаОповещения(<Имя события>, <Параметр>, <Источник>)
• ПередЗакрытием(<Отказ>, <Стандартная обработка>)
• ПередОткрытием(<Отказ>, <Стандартная обработка>)
• ПриЗакрытии()
• ПриОткрытии()
• ПриПовторномОткрытии(<Стандартная обработка>)

Список дополнительных событий форм элементов справочников:
• ПередЗаписью(<Отказ>)
• ПослеЗаписи()
• ПриЗаписи(<Отказ>)
• ПриИзмененииДанных()

Список дополнительных событий форм документов:
• ПередЗаписью(<Отказ>, <Режим записи>, <Режим проведения>)
• ПослеЗаписи()
• ПриЗаписи(<Отказ>)
• ПриИзмененииДанных()

У форм списков справочников и документов дополнительных событий нет.

Рассмотрим переназначение событий на двух примерах:
1. В форме есть обработчик ПередОткрытием(Отк) - т.е. указаны не все названия параметров и первый параметр называется нестандартно, т.е. Отк, а не Отказ.
2. В форме нет обработчика ОбработкаВыбора.

Шаг 1. В конце модуля формы прописывается код, который проверяет наличие у формы обработчиков событий, в случае их наличия определяет количество параметров у обработчиков событий.

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

Шаг 2. Вся полученная информация заносится в структуру ГОС_Параметры.

Пример 1:
В структуру по ключу «СтарыйОбработчик_ПередОткрытием» будет добавлена строка «ПередОткрытием(Отказ)».

Пример 2:
В структуру по ключу «СтарыйОбработчик_ОбработкаВыбора» будет добавлено значение Неопределено.

Шаг 3. Добавляем в модуль формы процедуры:
Пример 1:


Шаг 4. Далее все события формы переназначаются на новые процедуры.

Пример 1:
ЭтаФорма.УстановитьДействие(«ПередОткрытием», Новый Действие(«ГОС_Форма_ПередОткрытием»));

Пример 2:
ЭтаФорма.УстановитьДействие(«ОбработкаВыбора», Новый Действие(«ГОС_Форма_ ОбработкаВыбора»));

Алгоритм парсинга

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

Парсинг для элементов управления.

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

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

При установке обработчика события на одну из этих процедур вызывается аналогичная процедура модуля ГОС, например при срабатывании ГОС_Элемент_Лок_Нажатие(Элемент) вызывается функция ГОС_Элемент_Нажатие(Элемент).

Таким образом если мы программно добавили кнопку «КнопкаВыполнить», то в дальнейшем ей можно назначить процедуру-обработчик нажатия на кнопку так:

Парсинг для программного вызова событий.

В каждую форму добавляется экспортируемая функция

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

Состояние дел

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

Слабо проработаны алгоритмы синтаксического разбора модулей.

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

Остается только закодировать.

Кстати, небольшое финансовое вливание в размере 1000$ может ускорить релиз этой обработки. :)

Проверьте Ваши знания по теме “Механизмы интеграции и обмена данными в 1с” из тестирования 1с:Профессионал Платформа 8.3.

Список вопросов 1c :Профессионал Платформа 8.3 Глава 8

Навигация (только номера заданий)

0 из 54 заданий окончено

Информация

08. Механизмы интеграции и обмена данными

Вы уже проходили тест ранее. Вы не можете запустить его снова.

Вы должны войти или зарегистрироваться для того, чтобы начать тест.

Вы должны закончить следующие тесты, чтобы начать этот:

Результаты

Вы набрали 0 из 0 баллов ( 0 )

Рубрики

  • К простым типам
  • К сложным типам
  • Применить средства XML сериализации к данному типу значения нельзя
  • Любое количество индексных файлов
  • Количество индексных файлов, не превышающее количество полей в dbf файле
  • Не более трех индексных файлов
  • Не более одного индексного файла
  • В модуле приложения
  • В модуле внешнего соединения
  • В общем модуле
  • в OLE модуле
  • Только при использовании возможности распределения информационной базы данных
  • Только при использовании возможностей универсального обмена
  • Как средствами универсального обмена, так и распределением информационной базы
  • Данную топологию реализовать невозможно

При записи значения с использованием средств XML сериализации в XML документ:

  • Используются только методы, относящиеся к средствам XML сериалиации
  • Используются только возможности объекта "ЗаписьХМL"
  • Используются методы, относящиеся к средствам XML сериализации и объект "ЗаписьХМL"
  • Для записи преобразованного значения используется метод глобального контекста "ЗаписатьВФайл(ИмяФайла)"
  • В модуле приложения
  • В модуле внешнего соединения
  • В общем модуле
  • В СОМ модуле
  • Только при использовании возможности распределения информационной базы данных
  • Только при использовании возможностей универсального обмена
  • Как средствами универсального обмена, так и распределением информационной базы
  • Данную топологию реализовать невозможно
  • При отмеченном у данного плана обмена флаге "Распределенная база данных"
  • При не отмеченном у данного плана обмена флаге "Распределенная база данных"
  • Состояние данного флага на вызов этого обработчика события не влияет

При последовательном чтении из текстового файла невозможно:

  • Построчное чтение текста
  • Посимвольное чтение текста
  • Возможно как построчное, так и посимвольное чтение

В процедуре, которая будет вызываться при подключении к базе данных через СОМ, нельзя использовать:

  • ДокОбъект=Док.СоздатьДокумент()
  • Форма.Открыть()
  • Запрос=Новый Запрос
  • Нет правильного ответа

При использовании механизма распределенных баз данных изменения в конфигурации:

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

Для создания объекта, с использованием которого из одной базы 1С:Предприятие 8 будет производиться обращение через OLE к другой информационной базе 1С:Предприятие 8, используется конструктор:

Процедуры-обработчики событий

Особенностью обработки событий среде 1С:Предприятия 8 является то, что имя процедуры-обработчика в одних случаях должно совпадать с именем события, а в других случаях может от него отличаться. Данная статья написана, чтобы внести ясность в этом вопросе.

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

Ниже показана палитра свойств для формы элемента справочника "Номенклатура" с несколькими назначенными обработчиками событий:


За информацией о приемах работы с этой частью палитры свойств обращайтесь к документации: книга "Конфигурирование и администрирование", "Глава 3. Объекты конфигурации => Свойства элементов управления => Категория свойств События" (стр. 1 - 204)

Обратите внимание на важный момент, имя процедуры-обработчика событий может не совпадать с именем события . Для элементов управления чаще всего так и бывает, например, процедура "ТипЦенПриИзменении" обрабатывает событие "ПриИзменении" поля ввода для реквизита "ТипЦен", как показано на следующем рисунке:


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

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

Поясним это правило на конкретных примерах:

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

  • ПередНачаломРаботыСистемы
  • ПриНачалеРаботыСистемы
  • ПриЗавершенииРаботыСистемы
  • ПередЗавершениемРаботыСистемы
  • ОбработкаВнешнегоСобытия

2. Имена процедур-обработчиков событий, расположенных в модуле объекта, тоже строго соответствуют именам событий:

для модуля документа (события объекта типа "ДокументОбъект")

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

Аналогичные обработчики событий могут располагаться в модуле справочника и модулях других прикладных объектов.

3. Есть также модуль набора записей для всех видов регистров, который подобен модулям прикладных объектов. Модуль набора записей может содержать следующие процедуры-обработчики событий (имена процедур должны совпадать с именами событий):

Ниже приведены несколько важных моментов, которые полезно помнить при работе с событиями:

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

Примечание 2. Если в процедурах-обработчиках модуля объекта нужно обратиться к самому объекту (текущий элемент справочника, текущий документ и т.д.), то для этого можно использовать свойство ЭтотОбъект. Оно содержит объект типа "СправочникОбъект", "ДокументОбъект" и т.д.

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

Читайте также: