События (events) — штатный механизм 1С-Битрикс, который позволяет вклиниться в работу ядра и модулей, не правя их исходный код. Обработчик события — это ваша функция или метод, который платформа вызывает в определённой точке: перед сохранением заказа, после регистрации пользователя, при отправке письма.
Что такое событие и обработчик
Событие в Битрикс — это именованная точка в коде ядра, в которой платформа даёт возможность стороннему коду выполнить свою логику. Модуль iblock перед добавлением элемента вызывает событие OnBeforeIBlockElementAdd, модуль sale после сохранения заказа — OnSaleOrderSaved, и так далее. Каждое событие имеет три составляющие: идентификатор модуля-источника (например, main, iblock, sale), имя события и набор параметров, которые ядро передаёт обработчику.
Обработчик (handler) — функция, статический метод класса или замыкание, которое вы регистрируете на событие. Когда ядро доходит до точки события, оно последовательно вызывает все зарегистрированные обработчики. Это позволяет держать доработки отдельно от ядра и переживать обновления платформы без конфликтов.
/bitrix/modules/. Любое обновление их перезапишет. Всё расширение поведения делается через события и собственные модули.Две системы событий: старая и D7
Исторически в Битрикс сосуществуют два API событий, и оба рабочие.
- Старое ядро — процедурные функции
AddEventHandler()иRegisterModuleDependencies(). Обработчику передаётся набор позиционных аргументов, менять данные можно по ссылке (&$arFields). - Ядро D7 — класс
\Bitrix\Main\EventManagerи объект\Bitrix\Main\Event. Обработчик получает единый объект события, а результат возвращает через\Bitrix\Main\EventResult.
Какой использовать? Зависит от того, какое событие вы ловите. Многие модули (в частности iblock, старые части sale) до сих пор рассылают события в старом формате, и ловить их нужно старым API. Новые компоненты ядра работают через D7. На практике разработчик держит в голове обе схемы.
Типы событий: OnBefore, OnAfter и уведомления
По назначению события делят на три группы.
| Тип | Момент вызова | Возможности |
|---|---|---|
OnBefore* | До операции | Проверить и изменить данные, отменить действие (валидация) |
OnAfter* / On*Add | После операции | Реакция на факт: логирование, интеграции, уведомления |
| Почтовые/системные | По триггеру | Отправка писем, переопределение контента |
Событие OnBeforeIBlockElementUpdate позволяет отменить обновление, вернув false и установив ошибку. OnAfterIBlockElementAdd уже ничего не отменяет — элемент создан, вы лишь реагируете. Понимание этой разницы критично: тяжёлую интеграцию с внешней системой вешают на OnAfter*, а валидацию — на OnBefore*.
Где регистрировать обработчики
Точка регистрации определяет, когда обработчик станет активным.
- Файл
/bitrix/php_interface/init.php(или/local/php_interface/init.php) — подключается на каждом хите. Здесь регистрируют обработчики черезAddEventHandler/addEventHandler. Регистрация живёт один запрос. - Собственный модуль — регистрация в методе
DoInstall()черезRegisterModuleDependencies. Запись попадает в таблицуb_module_to_moduleи действует постоянно, пока модуль установлен.
/local/ предпочтительнее /bitrix/php_interface/: он не затрагивается обновлениями и удобен для контроля версий.Пример обработчика
Обработчик на старом API — валидация символьного кода перед сохранением элемента инфоблока. Код кладём в init.php:
AddEventHandler('iblock', 'OnBeforeIBlockElementUpdate', ['MyHandlers', 'checkCode']);
class MyHandlers {
public static function checkCode(&$arFields) {
if (empty($arFields['CODE'])) {
global $APPLICATION;
$APPLICATION->throwException('Не заполнен символьный код');
return false;
}
}
}
Тот же смысл в D7-стиле на событии главного модуля:
use Bitrix\Main\EventManager;
EventManager::getInstance()->addEventHandler('main', 'OnAfterUserLogin', ['MyHandlers', 'onLogin']);
Порядок вызова и отладка
Если на одно событие висит несколько обработчиков, порядок задаётся параметром сортировки. У AddEventHandler(..., $sort = 100) и у RegisterModuleDependencies(..., $sort = 100) меньшее значение вызывается раньше. Это важно, когда один обработчик подготавливает данные для другого.
- Чтобы увидеть все обработчики события, посмотрите таблицу
b_module_to_module(постоянные) и содержимоеinit.php(временные). - Для отладки удобно логировать вход в обработчик через
AddMessage2Log()или\Bitrix\Main\Diag\Debug::writeToFile(). - Если обработчик «не срабатывает», проверьте точное написание модуля и имени события — они регистрозависимы.
Итог
События — это фундамент расширяемости 1С-Битрикс. Они дают возможность встроить бизнес-логику, валидацию, интеграции и уведомления, не касаясь ядра, и потому переживать обновления. Разработчику важно различать старое и D7-API, понимать разницу OnBefore* и OnAfter* и выбирать правильную точку регистрации.
Мы проектируем доработки Битрикс так, чтобы они были устойчивы к обновлениям и понятны следующему разработчику: обработчики выносим в собственные модули, покрываем логированием и документируем. Если нужна интеграционная разработка или автоматизация бизнес-процессов на событиях — поможем спроектировать архитектуру и написать код.
Частые вопросы
Чем обработчик события отличается от агента?
Обработчик вызывается ядром в момент конкретного действия (например, сохранения заказа). Агент — это отложенная задача, которая выполняется по расписанию независимо от действий пользователя.
Можно ли из обработчика отменить действие?
Да, но только в событиях типа OnBefore*. Нужно вернуть false и установить ошибку через throwException. События OnAfter* уже ничего не отменяют.
Где лучше регистрировать обработчики — в init.php или в модуле?
Разовые доработки удобно держать в /local/php_interface/init.php. Тиражируемую и постоянную логику лучше оформить отдельным модулем и регистрировать через RegisterModuleDependencies.
Почему обработчик не вызывается?
Чаще всего из-за опечатки в идентификаторе модуля или имени события (они регистрозависимы), либо файл init.php не подключается. Проверьте также, действительно ли модуль рассылает это событие в вашей версии.
Старый и новый API событий конфликтуют?
Нет, они сосуществуют. Выбор зависит от того, каким API модуль рассылает событие. Многие модули до сих пор используют старый формат, поэтому знать оба необходимо.
Как задать порядок нескольких обработчиков одного события?
Через параметр сортировки при регистрации: меньшее значение вызывается раньше. По умолчанию используется 100.
Правка файлов в /bitrix/modules/ — это плохо?
Да, категорически. Обновление платформы перезапишет изменения. Всё расширение поведения делается через события и собственные модули в /local/.
Поможем с настройкой и поддержкой Для разработчиков
Поможем с настройкой, доработкой и поддержкой Для разработчиков.