Перейти к основному содержимому

События в 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)
РегистрацияAddEventHandlerEventManager::addEventHandler
Передача данныхМассив параметров (часто по ссылке &)Объект события Bitrix\Main\Event
Пример событияOnBeforeUserAdd\Bitrix\Main\User::onBeforeAdd
Где смотретьВ коде через ExecuteModuleEventВ коде через send() объекта Event