Файлы описания событий
Файлы описания событий располагаются в директории ./events. При обработке событий принимаются во внимание все файлы, находящиеся в этой директории и имеющие расширение evd. Количество файлов описаний может быть любым, причем описания для одного и того же блока могут быть распределены по разным файлам. Множественность evd-файлов позволяет:
- разделять логику обработки событий на локальную и серверную, а также автоматически осуществлять их симбиоз в локальной версии (просто скопировав evd-файлы клиентской и сетевой версии в одну директорию);
- распределять ответственность за поддержку evd-файлов между разработчиками;
- легко добавлять и обновлять evd-файлы в процессе эксплуатации системы.
В файле описания указываются имена блоков, и для каждого блока определяются обработчики событий. Имя блока задается в квадратных скобках:
[<имя блока>]
Пробелы между именем и скобками допускаются и значения не имеют. Все описания ниже имени блока относятся к этому блоку, пока не встретится имя другого блока. Описания для одного и того же блока можно вводить многократно, как в одном файле, так и в разных - при обработке событий будут проанализированы все записи. Но в любом случае описания для блока должны предваряться его именем.
Обработчики событий для блока определяются по имени события или по имени семейства события. Перед именем семейства ставится знак амперсанда @. Указание обработчика для события по его имени всегда имеет больший приоритет. Если указан обработчик для события - обработчик для семейства не вызывается. Сам обработчик задается либо указанием имени исполняемого файла (ibx), либо директивой пересылки события на сервер - @. События могут пересылаться на сервер Инфо-Бухгалтер 10 или на прокси-сервер. В последнем случае необходимо указать после директивы имя прокси-сервера. Для одного и того же события можно указывать несколько различных обработчиков даже в рамках одного блока - в этом случае будут последовательно запущены все указанные обработчики.
Обработчик для события
<имя_события> = <имя_файла.ibx>
Обработчик для семейства событий
@<имя_семейства> = <имя_файла.ibx>
Передача события на сервер
<имя_события> = @
Передача всех событий семейства на сервер
@<имя_семейства> = @
Передача события на прокси-сервер
<имя_события> = @<имя прокси-сервера>
Передача всех событий семейства на прокси-сервер
@<имя_семейства> = @<имя прокси-сервера>
<имя_файла.ibx> - это имя исполняемого файла относительно локальных директорий для исполняемых файлов, установленных в настройках платформы.
Директива пересылки на сервер имеет смысл только в evd-файлах сетевого рабочего места. В evd-файлах на сервере и в локальной версии эта директива игнорируется. В evd-файлах на сервере всегда указываются имена расположенных там ibx-файлов. Поэтому в случае перехода на локальную версию можно просто поместить в одну директорию клиентские и серверные evd-файлы. При использовании такого подхода рекомендуется только давать разные имена семействам событий на сервере и на клиентском месте, иначе логика работы может исказиться. Если же в одну директорию установлены сервер и клиентское приложение - следует быть осторожным с объединением файлов описаний. Логика работы может быть нарушена, поскольку это не одно и то же, что локальная версия.
Для написания комментария используется точка с запятой в начале строки.
Для разделения содержимого evd-файлов на клиентскую и серверную части используются директивы препроцессора. Препроцессор обрабатывает evd-файл до его разбора и построения таблиц обработчиков. Платформа определяет символы препроцессора CLIENT и SERVER. Символ CLIENT определяется в случае сетевого рабочего места и в локальной версии. Символ SERVER определяется случае сервера и локальной версии. Препроцессор позволяет директивами #ifdef, #ifndef, #else и #endif исключать строки evd-файла в зависимотси от набора определенных символов. В помощью директивы #define можно определять собственные символы для включения или отключения каких-то обработчиков.
Пример evd-файла с директивами препроцессора:
; определяем собственный символ, для отключения лога его надо просто убрать или закомментировать #define BLOCK_A_LOG [БлокА] ; здесь устанавливаем обработчик для семейства "ЗапросДанныхБлока" #ifdef SERVER ; это обработчик для сервера и локальной версии (база данных близко) @ЗапросДанныхБлока = ЗапросДанныхСервер.ibx #else ; этот обработчик только для сетевого рабочего места (база данных далеко) @ЗапросДанныхБлока = ЗапросДанныхКлиент.ibx #endif #ifdef CLIENT ; дальше фрагмент только для сетевого рабочего места и локальной версии #ifdef BLOCK_A_LOG ; определен символ BLOCK_A_LOG, то задаем обработчик событий записи в лог @ЗаписьЛог = ЗаписатьФайлПротокола.ibx #endif #endif
Пример evd-файла на сетевом рабочем месте
; Набор описаний обработчиков блока "БлокА" [БлокА] ; События семейства "СобытияОтБ" обрабатываются на рабочем месте ; алгоритмом alg1.ibx @СобытияОтБ = alg1.ibx ; Событие с именем "СобытиеОтБ1" обрабатывается алгоритмом alg2.ibx ; (даже если принадлежит семейству "СобытияОтБ") СобытиеОтБ1 = alg2.ibx ; СобытиеОтС передается на сервер СобытиеОтС = @ ; СобытиеОтС2 передается на сервер, а также обрабатывается локально СобытиеОтС2 = @ СобытиеОтС2 = alg3.ibx ; Набор описаний обработчиков блока "БлокБ" [БлокБ] ; Для семейства "СобытияОтА" заданы два обработчика. ; Это означает, что при возникновении события этого семейства ; будут последовательно вызваны оба алгоритма. @СобытияОтА = DispB1.ibx @СобытияОтА = DispB2.ibx ; все события семейства "СобытияОтС" передаются на сервер @СобытияОтС = @