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
Документ вступает вступает в силу: он был создан или было сделано undeleteund
Событие, характерное только для undelete, вызывается совместно с onupd
Любое изменение документаgetp
Очень важное событие, вызываемое по нажатию правой клавиши мыши (Get properties). Процедуры, обслуживающие это событие формируют состав возникающего меню. Внимание: у события есть только post-составляющая.
Именованные события
Имена процедур
, обслуживающих именованные события выглядят также, но вместо слота <любое имя> там ставится название метода отображения. События существуют только в post-форме. Поэтому для данного класса для данного события и определенного метода может существовать ТОЛЬКО ОДНА процедура обработки события. Однако, для одного объекта, а не класса их может вызваться несколько для всех классов, входящих в иерархию. В системе есть следующие именованные события:gets
Вызывается перед отображением окна для создания нового объекта. Процедура должна указызать, какие поля и как надо заполнять. @p1 - UDN. Внимание: имя метода в данном случае: edit. Во всех остальных событиях имя метода - из выбранной property.cre
Вызывается после заполнения форм при создании документа. @p1 - отрицательное число, используемое как номер среза таблицы Detailed, @p2 - номер только что созданного нового документа, @p3 не используется. Процедура должна создать записи в связанных таблицах с UDN=@p2, и, если объект имеет поля типа названия, то сделать update полям No,Name,Dat в таблице Docs по UDN=@p2read
Вызывается при детализации документа для просмотра или редактирования документа. Процедура должна сформировать поля для просмотра или редактирования.put
Запись документа после изменения. Производит коррекцию таблиц документа и возможно Docs.cycl
Используется при выполнении recycle при редактировании. Изменяет в форме значения одних полей на основании других.detp
Вызывается до редактирования или просмотра. Может запросить параметры перед отображением, например вариант кратко/детально, диапазон дат итд.