5. Механизм событий

Неименованные события

События в системе - это ситуации, в которых производится поиск и вызов stored procedure с определенным именем. Имена процедур, обслуживающих события, имеют вид:

<метод>_<имя события>_<id класса>_

Последнее подчеркивание может отсутствует у событий типа pre.

Пусть возникло событие с каким либо именем, например, off. Событие off рассылается, когда объект удаляется. Рассылка события производится в связи с удалением объекта класса bigitem, производного от item, производного от Doc:

Doc a item a bigitem

Тогда вначале рассылается событие pre, которое отрабатывается ДО того, как изменения вступят в силу. При этом вначале опрашиваются процедуры, обслуживающие события у самого производного класса (bigitem) c движением вглубь, а именно в порядке следующих образцов:

<любой имя>_off_bigitem

<любой имя>_off_item

<любой имя>_off_Doc

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

<любой имя>_off_Doc_

<любой имя>_off_item_

<любой имя>_off_bigitem_

Рассмотренное событие off является НЕИМЕНОВАННЫМ. То есть для данного события для данного объекта может быть много процедур, которые его обрабатывают, например,

hist_off_Doc_ -- для ведения истории, вводится модулем история

site_off_Doc_ -- модулем филиалы, для синхронизации.

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

Когда события лучше делать типа pre, а когда post ? Проверки лучше делать вначале, тогда будет быстрее откат, а коррекцию других данных по результатам делать в post.

Каждая процедура обработки события имеет три целых параметра, @p1, @p2 и @p3. В @p1 передается UDN объекта, если не сказано другое. Не все события используют все параметры, в этом случае передается 0. Процедуры обработки событий не начинают и не заканчивают транзакций.

Список неименованных событий

Следующие неименованные события определены в системе

move Перемещение документа из фолдера в другой фолдер. Параметры: @p1 -UDN документа, @p2 - фолдер откуда, @p3 - фолдер куда.

off Документ удаляется физически или логически. Использует @p1, тоже для всех остальных событий

on Документ вступает вступает в силу: он был создан или было сделано undelete

und Событие, характерное только для undelete, вызывается совместно с on

upd Любое изменение документа

getp Очень важное событие, вызываемое по нажатию правой клавиши мыши (Get properties). Процедуры, обслуживающие это событие формируют состав возникающего меню. Внимание: у события есть только post-составляющая.

 

Именованные события

Имена процедур, обслуживающих именованные события выглядят также, но вместо слота <любое имя> там ставится название метода отображения. События существуют только в post-форме. Поэтому для данного класса для данного события и определенного метода может существовать ТОЛЬКО ОДНА процедура обработки события. Однако, для одного объекта, а не класса их может вызваться несколько для всех классов, входящих в иерархию.

В системе есть следующие именованные события:

gets Вызывается перед отображением окна для создания нового объекта. Процедура должна указызать, какие поля и как надо заполнять. @p1 - UDN. Внимание: имя метода в данном случае: edit. Во всех остальных событиях имя метода - из выбранной property.

cre Вызывается после заполнения форм при создании документа. @p1 - отрицательное число, используемое как номер среза таблицы Detailed, @p2 - номер только что созданного нового документа, @p3 не используется. Процедура должна создать записи в связанных таблицах с UDN=@p2, и, если объект имеет поля типа названия, то сделать update полям No,Name,Dat в таблице Docs по UDN=@p2

read Вызывается при детализации документа для просмотра или редактирования документа. Процедура должна сформировать поля для просмотра или редактирования.

put Запись документа после изменения. Производит коррекцию таблиц документа и возможно Docs.

cycl Используется при выполнении recycle при редактировании. Изменяет в форме значения одних полей на основании других.

detp Вызывается до редактирования или просмотра. Может запросить параметры перед отображением, например вариант кратко/детально, диапазон дат итд.