Изменения в новой версии:
- Добавлена управляемая форма подписки совместимая c интерфейсом "Такси" без использования модальных окон
- Теперь в обычной и управляемой форме подписики на событие доступен конструктор запросов (только в толстом клиенте)
- Устранена проблема со сбросом свойств объектов подсистемы при добавлении подсистемы в конфигурации на платформе 8.3
Особенности подсистемы
1) Подписки на события объектов можно добавлять и редактировать в пользовательском режиме, они вступают в действие почти мгновенно, без отключения пользователей и без необходимости каких-либо дополнительных действий.
В каждом сеансе код подписок будет читаться из БД один раз и помещаться в кэш - параметр сеанса (фиксированный hash-map). При возникновении событий, для которых предусмотрены подписки, но не чаще чем раз в 15 секунд, читается константа, хранящая последнюю дату и время изменения кода, и проверяется необходимость обновления кэша. Новый код вступит в силу не позднее чем через 15 секунд после его изменения и в то же время обращение к БД для чтения всего одной константы происходит достаточно редко, чтобы не сказываться на производительности системы.
2) Поддержка английского и русского языков снимает ограничение на использование подсистемы в нерусскоязычных конфигурациях.
3) Процесс выбора объектов для новой подписки близок к тому, как это происходит в конфигураторе.
Для подписок можно задать краткий комментарий и расширенное описание. Список подписок представлен в виде иерархического справочника, в котором можно создавать группы подписок.
4) Для создания/редактирования подписки в тонком клиенте доступна только управляемая форма. В толстом клиенте для этого можно использовать на выбор обычную или управляемую форму, для чего в форме списка созданы специальные кнопки. По умолчанию в толстом клиенте открывается обычная форма, поскольку только она обеспечивает синтаксическую подсветку кода:
5) Существует возможность приостановить действие подписки выставив соответствующий флаг. Возможность задавать последовательность выполнения подписок на события через присвоение им числовых приоритетов. В порядке приоритетов выполняются сначала подписки, назначенные для конкретного объекта метаданных, затем для класса метаданных.
6) Есть возможность проводить отбор всех подписок, относящихся указанному источнику и производить поиск по тексту, содержащемуся в коде. Оба поля отбора текстовые, поиск регистронезависимый:
7) Если объект метаданных, для которого назначена подписка, будет переименован в конфигураторе, то необходимо переназначить источник подписки в пользовательском режиме. При открытии формы списка подписок производится проверка правильности имен метаданных, указанных в качестве источника. Все подписки, для которых обнаружено несоответствие источника и метаданных конфигурации выводятся в информационное окно:
8) Код подписки выполняется оператором "Выполнить", который выдает ошибку, если встречает оператор "Возврат". Это ограничение обходится через хранение двух версий кода. Одна отображается на форме и редактируется программистом. Другая будет исполняться при обработке событий. Она генерируется при записи подписки путем замены оператора "Возврат" на оператор "GoTo", метка для которого добавляется в конец кода. Увидеть результат автозамены после записи можно в форме списка подписок:
9) При запуске в толстом клиенте как в обычной так и в управляемой форме доступен конструктор запросов:
Ограничения подсистемы
1) Код задается в пользовательском режиме, где недоступна контекстная подсказка и отладка. Код выполняется в контексте своего общего модуля и его нельзя разбить на процедуры. Поэтому в пользовательском режиме лучше добавлять обработчики с относительно независимым алгоритмом.
2) Невозможно использовать инструкции препроцессору #Если ... #КонецЕсли. Код, расположенный в таких блоках просто игнорируется. Чтобы сгладить это ограничение в коде подписки доступна предопределенная переменная "КодИсполняетсяНаКлиенте"/"CodeIsExecutingOnClient". Если она равна Истина, значит исполнение кода идет в толстом клиенте, иначе - на сервере. Для конфигураций на управляемых формах это не актуально.
3) Пока не стал реализовывать обработку событий, специфичных для планов обмена, задач и констант. Переопределять события, связанные с этими объектами приходится крайне редко, поэтому решил не добавлять ради них несколько подписок в состав конфигурации.
Разумеется, эти ограничения можно обойти просто используя стандартное добавление подписок через конфигуратор :) Эта подсистема нужна чтобы дополнить стандартные возможности платформы, а не заменить их.
Установка и настройка подсистемы
1) Скачиваем файл конфигурации. За исключением свойств самой конфигурации объединяем с конфигурацией нашей БД. Не забывайте при объединении проставить флажок и на самой подсистеме!
У вас в конфигурации появится независимая не включаемая в командный интерфейс подсистема des_DynamicEventSubscriptions, все объекты которой будут иметь префикс "des_".
2) В подсистеме используются обычные и управляемые формы. Если вы хотите использовать подсистему в обычном приложении, то в свойствах конфигурации нужно выставить свойство "Использовать управляемые формы в обычном приложении". Если же вы хотите использовать обычную форму подписки (с подсветкой синтаксиса) вместо управляемой в толстом клиенте, то нужно выставить свойство "Использвоать обычные формы в управляемом приложении":
4) Пользователям будут нужны права на объекты новой подсистемы:
- получение и установку четырех параметров сеанса: des_CodeCachingDateTime , des_ConstantCheckDateTime, des_CachedCodeCollection, des_MapSourceRuEn
- чтение справочника "des_DynamicEventSubscriptions" и константы "des_CodeChangeDateTime"
Поэтому надо либо дать роли "Пользователь", уже имеющейся в вашей конфигурации эти права, либо добавить всем пользователям роль "des_User". Программистам нужно дать полные права на эти объекты.
5) Подсистема способна работать в тонком клиенте. Но чтобы использовать конструктор запросов и иметь возможность открывать обычную форму с синтаксической подсветкой кода конфигурацию нужно запускать в толстом клиенте (управляемом или обычном приложении).
6) Язык, который вы хотите использовать выбирается в форме списка справочника "Dynamic event subscriptions". По-умолчанию выбирается тот, который установлен в поле "Вариант встроенного языка" для конфигурации. Язык влияет на интерфейс формы списка подписок, формы выбора источника события и определяет с применением какого языка будут создаваться новые подписки. Он не влияет на уже созданные подписки, для них язык определяется при создании и в дальнейшем остается неизменным:
Добавление новых подписок
Группы добавляются по желанию. Можно создавать отдельные группы для отдельных классов объектов. Может оказаться удобно создавать группы по прикладному назначению (допроведение, запреты изменения, заполнение):
При добавлении новой подписки ей обязательно указывать источник, вид события и наименование (краткое описание). Расширенное описание задается на отдельной вкладке по желанию. После этого создаем код подписки. В зависимости от вида события и источника будет указана сигнатура обработчика и предопределенные переменные, которые также можно использовать.
Проверяем, работает ли подписка. Для этого на время проверки в код можно вставлять вызовы метода Сообщить(), выводящего диагностические сообщения.
Рекомендации
1) Если вы думаете, что могли допустить ошибку в коде, но по какой-то причине сразу добавляете подписку в рабочую базу, а не тестовую, то помещайте свой код в блок "Попытка Исключение". Необработанные исключения в них могут привести к отключению клиентского приложения. Неявной их обработки делать не стал, вы сами можете решить, обрабатывать исключения в своем коде или нет. Все таки сразу в рабочую базу лучше добавлять только простые подписки, где вероятность ошибки мала (например запрет записи/проведения по условию).
2) Необходимо помнить об опасности несогласованных изменений взаимосвязанных подписок. Сложно добавить две подписки, которые по логике должны вступать в силу одновременно. Ведь с момента записи одной подписки и до момента записи другой проходит какое-то время и за это время первая уже может сработать, а второй еще нет. Для независимых подписок таких проблем не возникет.
3) Работа на платформе ниже версии 8.2.16 не проверялась. Будьте внимательны при использвании этой и более ранних версий платформ.
К публикации приложено два файла - конфигурация des_v3.cf и выгрузка демо-базы des_demo_v3.dt, в которой есть несколько дополнительных объектов и подписок, определенных для них.
Ниже приведены скриншоты из реальной рабочей базы УПП 1.3.