Модуль «Обработчики событий»
1. Описание
Модуль listevent («Обработчики событий») — это административный инструмент для Bitrix24, который:
Регистрирует собственные обработчики событий разных модулей (main, crm, tasks, iblock, sale, im, disk и др.) через единый интерфейс.
Создаёт PHP-классы обработчиков автоматически в каталоге модуля и подключает их к ядру Bitrix через
RegisterModuleDependences.Позволяет просматривать, добавлять, редактировать сортировку и удалять привязки событий без правки кода вручную.
Ведёт логирование ошибок из обработчиков в файл и при необходимости отправляет уведомления об ошибках в Bitrix24 (пользователю или в чат через модуль
im).
Модуль не реализует бизнес-логику приложения — он выступает конструктором и реестром обработчиков событий с логированием и уведомлениями.
2. Структура модуля
listevent/ ├── config/ │ ├── config.php # Класс Config: чтение .env и .ini │ ├── .env # Идентификация модуля (ID, версия, имя, партнёр) │ └── .ini # Настройки по умолчанию (логи, уведомления, версии PHP/Битрикс) ├── install/ │ ├── index.php # Класс listevent (CModule): установка/удаление │ └── step.php # Страница после установки ├── lib/ │ ├── events/ │ │ ├── BaseEvent.php # Регистрация/снятие обработчиков, генерация файлов, работа с load.ini │ │ └── EventList.php # Справочник событий по модулям (main, crm, tasks, sale и др.) │ ├── exceptions/ │ │ └── handler.php # Глобальные обработчики ошибок (опционально, по умолчанию не активны) │ ├── handlers/ # Сгенерированные и кастомные обработчики (в .gitignore) │ │ └── <module>/ # Например: tasks/, crm/, main/ │ │ └── <Handler>.php │ ├── im/ │ │ ├── notifier.php # Отправка уведомлений об ошибках (user/chat) │ │ └── send.php # IM: notify(), message(), chat() │ └── logger/ │ ├── logger.php # Запись в файл, чтение, очистка лога │ └── listevent.log # Файл лога (создаётся при включённом логировании) ├── include.php # Точка входа: автозагрузка классов модуля ├── options.php # Админ-страница настроек (вкладки: События, Справочник, Настройки, Лог, О модуле) ├── load.ini # Создаётся в рантайме: маппинг классов обработчиков → пути к файлам └── .gitignore # Исключает lib/handlers/* (обработчики предполагается хранить отдельно)
Куда ставится модуль: в каталог модулей Bitrix, например
bitrix/local/modules/listevent/.Куда пишутся обработчики: в
lib/handlers/<модуль>/<ИмяКласса>.php(путь задаётся в.iniкакHANDLER_PATH=lib/handlers).Куда пишется лог: в файл из опции
LOG_FILE(по умолчаниюlistevent.logв каталогеlib/logger/).
3. Предназначение
Единый интерфейс — не нужно вручную вызывать
RegisterModuleDependencesи создавать файлы обработчиков в разных модулях.Меньше ошибок — модуль сам генерирует заготовку класса с
try/catch, логированием и неймспейсомHandlers.Прозрачность — в админке видно, какие события зарегистрированы (только модулем listevent или все по выбранному модулю).
Безопасность и отладка — логирование ошибок в файл и опциональная отправка в мессенджер Bitrix24 (пользователю или в чат).
4. Устройство
Конфиг в .env и .ini — разделение идентификации модуля (.env) и настроек (.ini) упрощает обновление и деплой.
load.ini — Bitrix подключает модуль через
include.php; автозагрузка классов обработчиков реализована через общий массив вinclude.php+ динамическийload.ini, чтобы не хардкодить каждый новый обработчик.Справочник событий в EventList — список событий по модулям хранится в коде для единообразия и подсказок в интерфейсе (название события, описание).
Обработчики в .gitignore — предполагается, что сгенерированные и кастомные обработчики хранятся или версионируются отдельно от ядра модуля.
5. Использование
5.1. Установка
Скопировать модуль в
bitrix/modules/listevent/.В админке: «Настройки» → «Настройки продукта» → «Модули» → найти «Обработчики событий» → «Установить».
При установке проверяются версии PHP (≥ 8.0) и Битрикс (≥ 20.0.0). Опции из
config/.iniзаписываются в БД.После установки выводится сообщение «Модуль успешно установлен» и кнопка «Вернуться в список модулей».
5.2. Админ-страница настроек
Открывается по адресу вида:
/bitrix/admin/settings.php?lang=ru&mid=listevent
Доступ: право на чтение модуля (GetGroupRight($module_id) >= 'R'). Для сохранения настроек и изменений событий нужно право на запись (>= 'W').
Вкладки:
Вкладка | Назначение |
События | Выбор модуля, список зарегистрированных обработчиков только модуля listevent, добавление/редактирование/удаление привязок, сортировка. |
Справочник | Список всех обработчиков выбранного модуля (от любых модулей). Только просмотр. |
Настройки | Включение логирования, путь к файлу лога, включение уведомлений об ошибках, тип (пользователь/чат) и получатель (ID пользователя или ID чата). |
Лог ошибок | Просмотр содержимого файла лога. Если логирование выключено — выводится подсказка включить его в настройках. |
О модуле | Название, версия, разработчик, описание, список возможностей. |
5.3. Добавление обработчика события
Вкладка «События».
Выбрать модуль (например,
tasks).Нажать «Добавить событие».
Указать:
Название события — из выпадающего списка (справочник из
EventList).Класс-обработчик — имя класса без префикса
Handlers\(например,BeforeUpdate).Метод-обработчик — метод этого класса (например,
update).Сортировка — число, порядок вызова среди других обработчиков (по умолчанию 100).
Отправить форму (или кнопка «Добавить» в форме).
В результате:
В
lib/handlers/<модуль>/<Класс>.phpсоздаётся или дополняется класс в неймспейсеHandlersс методом-заглушкой вtry/catchи вызовомLogger::writeпри ошибке.В
load.iniдобавляется строка для автозагрузки.Вызывается
RegisterModuleDependences(..., listevent, Handlers\<Класс>, <метод>, sort, ...).
Редактирование — по сути снятие старой привязки и регистрация новой (можно изменить сортировку). При удалении вызывается UnRegisterModuleDependences и удаляется запись из load.ini.
5.4. Настройки
Сохраняются через Option::set($module_id, ...) в таблицу опций Bitrix:
Опция | Описание |
| Включить логирование (Y/N). |
| Уровень логирования (из .ini, в UI не редактируется). |
| Имя/путь файла лога (по умолчанию из .ini). |
| Отправлять уведомления об ошибках (Y/N). |
|
|
| ID пользователя или ID чата. |
| Активность модуля (Y/N). |
| Сортировка модуля. |
| Путь к каталогу обработчиков относительно корня модуля. |
5.5. Логирование и уведомления
Logger — при вызове
Logger::write($message, $exception)пишет в файл лога (еслиLOG_ENABLED = Y) и вызываетNotifier::sendError($exception).Notifier — в зависимости от
NOTIFY_TYPEвызываетSend::notify()(уведомление пользователю) илиSend::chat()(сообщение в чат). Для этого должен быть доступен модуль im.
6. Внутреннее устройство
include.php — подключает
config/config.php, объединяет статический список классов с содержимымload.iniи регистрирует автозагрузку черезLoader::registerAutoLoadClasses(listevent, $load).BaseEvent::registerModule — формирует путь к файлу обработчика, создаёт или обновляет класс (добавляет метод при необходимости), добавляет запись в
load.ini, вызываетRegisterModuleDependences.BaseEvent::unRegisterModule — удаляет запись из
load.ini, вызываетUnRegisterModuleDependences.BaseEvent::getEvents — обходит события выбранного модуля из
EventList, для каждого вызываетGetModuleEvents; при$all = falseвозвращает только обработчики сTO_MODULE_ID = listevent, при$all = true— все.EventList — константа
EVENTS: массив модулей и их событий с описаниями для UI и выбора события при добавлении.
Собственных таблиц в БД модуль не создаёт. Используются только механизмы ядра: регистрация модуля, опции, RegisterModuleDependences / UnRegisterModuleDependences / GetModuleEvents.
7. Зависимости
Ядро Bitrix:
CModule,CAdminMessage,CAdminTabControl,Loader,Option,Loc,RegisterModuleDependences,UnRegisterModuleDependences,GetModuleEvents,CheckVersion, сессия (check_bitrix_sessid,bitrix_sessid_post).Модуль im — нужен для отправки уведомлений об ошибках (пользователю или в чат). Без него уведомления работать не будут.
PHP: не ниже 8.0 (задаётся в
config/.ini, секция[PERMISSIONS]).Версия Битрикс: не ниже 20.0.0 (в том же блоке).
8. Ограничения
Количество обработчиков — ограничено только механизмами Bitrix и размером списка событий в
EventList. Добавление многих обработчиков на одно и то же событие увеличивает время отработки этого события.Размер лога — ограничен только диском. Очистка лога через код:
Logger::clear()(в UI кнопки очистки пока что не быть).Справочник событий — список модулей и событий в
EventList::EVENTSфиксированный; добавление новых событий не подразумевается.
9. Удаление модуля
При удалении вызывается только UnRegisterModule($this->MODULE_ID). Таблицы модуль не создаёт, поэтому отдельной очистки БД нет. Файлы модуля (в т.ч. lib/handlers/, load.ini, лог) остаются на диске — при необходимости их нужно удалять вручную.
10. Пример обработчика
При добавлении события с классом BeforeUpdate и методом update для модуля tasks создаётся файл вида:
// lib/handlers/tasks/BeforeUpdate.php <?php namespace Handlers; use Listevent\Lib\Logger; class BeforeUpdate { public static function update (...$values): void { try { // Весь код писать в этом блоке!!! } catch (\Throwable $t) { Logger::write($t->getMessage(), $t); } } }
Параметры ...$values нужно заменить на реальные аргументы события.
11. Важные замечания
load.ini создаётся и изменяется при добавлении/удалении обработчиков. В репозитории его может не быть — он генерируется в рантайме.
lib/handlers/ исключён из git — обработчики предполагается хранить или версионировать отдельно.
В коде обработчика глобальных ошибок (
lib/exceptions/handler.php) в ссылке на настройки может быть указан другой mid — для актуального модуля следует использоватьmid=listevent.Для уведомлений об ошибках должен быть установлен и доступен модуль im.
Модуль представляет готовое решение для работы, но будет доработан в дальнейшем.