События в 1С-Битрикс (Event Handlers)
Events Handlers или механизм перехвата событий (хуков) - позволяет изменять логику работы ядра или модулей Битрикса, не редактируя их исходный код.
События — это «точки входа», которые Битрикс вызывает перед или после выполнения важных операций (сохранение элемента, регистрация пользователя, отправка письма).
Типы событий
Битрикс разделяет события на две группы по времени их срабатывания:
А. События «Before» (До совершения действия)
Начинаются с префикса OnBefore... (например, OnBeforeIBlockElementUpdate).
- Зачем: Используются для валидации данных или их изменения ПЕРЕД записью в БД.
- Особенность: Вы можете отменить действие. Если обработчик вернет
falseи установит текст ошибки через$APPLICATION->ThrowException(), Битрикс прервет операцию и покажет ошибку пользователю.
Б. События «After» (После совершения действия)
Начинаются с префикса OnAfter... (например, OnAfterUserRegister).
- Зачем: Используются для действий, которые должны произойти только при успешном завершении операции.
- Особенность: В эти обработчики обычно передаются уже созданные
IDобъектов. Вы не можете отменить действие, так как оно уже записано в базу. - Примеры: Отправка уведомления в Telegram после заказа, очистка стороннего кеша, логирование изменений.
Регистрация обработчиков
Существует два основных способа «подписаться» на событие:
В файле init.php (Статическое подключение)
Это самый частый способ для кастомизации конкретного проекта. Пишется в /local/php_interface/init.php (чтоб не было лапши из кода лучше вызвать классы)
// Пример на старом ядре
AddEventHandler("main", "OnBeforeUserLogin", "MyBeforeUserLoginHandler");
function MyBeforeUserLoginHandler(&$arParams) {
if ($arParams['LOGIN'] == 'admin') {
// Логика проверки
}
}
Через D7 (Современный подход)
Использует менеджер событий EventManager
use Bitrix\Main\EventManager;
$eventManager = EventManager::getInstance();
// Регистрация анонимной функцией или методом класса
$eventManager->addEventHandler(
"iblock",
"OnAfterIBlockElementAdd",
["MyNamespace\\MyClass", "onAfterElementAdd"]
);
Примеры использования
Пример 1: Запрет удаления элементов в инфоблоке "Новости"
Если менеджер пытается удалить важную новость, система выдаст ошибку.
EventManager::getInstance()->addEventHandler(
"iblock", "OnBeforeIBlockElementDelete", "preventNewsDeletion"
);
function preventNewsDeletion($ID) {
$res = CIBlockElement::GetByID($ID)->Fetch();
if ($res['IBLOCK_ID'] == 5) { // ID инфоблока новостей
global $APPLICATION;
$APPLICATION->ThrowException("Удаление новостей запрещено! Используйте деактивацию.");
return false; // Прерываем удаление
}
}
Старое ядро vs Новое ядро (D7)
| Характеристика | Старое ядро (Old Core) | Новое ядро (D7) |
|---|---|---|
| Регистрация | AddEventHandler | EventManager::addEventHandler |
| Передача данных | Массив параметров (часто по ссылке &) | Объект события Bitrix\Main\Event |
| Пример события | OnBeforeUserAdd | \Bitrix\Main\User::onBeforeAdd |
| Где смотреть | В коде через ExecuteModuleEvent | В коде через send() объекта Event |