Система событий — один из самых мощных механизмов в 1С-Битрикс. Она позволяет «вклиниваться» в стандартные процессы (например, перед добавлением товара в корзину или после обновления пользователя) и выполнять свой собственный код. Это ключевой принцип кастомизации, позволяющий обновлять систему без потери доработок.
Обработчики событий обычно размещают в файле /bitrix/php_interface/init.php (или /local/php_interface/init.php, что предпочтительнее).
1. Классический подход: AddEventHandler()
Это старый, но все еще широко используемый способ регистрации обработчика.
Синтаксис:
AddEventHandler(«ID_МОДУЛЯ», «НАЗВАНИЕ_СОБЫТИЯ», «ФУНКЦИЯ_ОБРАБОТЧИК»);
- ID_МОДУЛЯ: Модуль, который инициирует событие (например, iblock, main, sale).
- НАЗВАНИЕ_СОБЫТИЯ: Имя события (например, OnBeforeIBlockElementAdd).
- ФУНКЦИЯ_ОБРАБОТЧИК: Имя глобальной функции или метод класса, который будет выполнен.
Пример: Установка символьного кода из названия перед добавлением элемента
Событие OnBeforeIBlockElementAdd срабатывает прямо перед тем, как элемент инфоблока будет сохранен в базу. Оно передает в обработчик массив полей $arFields по ссылке, что позволяет их изменить.
// В /local/php_interface/init.php
// Регистрируем обработчик
AddEventHandler("iblock", "OnBeforeIBlockElementAdd", "SetElementCodeFromTitle");
// Сама функция-обработчик
function SetElementCodeFromTitle(&$arFields)
{
// Работаем только с инфоблоком новостей (ID = 2)
if ($arFields['IBLOCK_ID'] == 2 && empty($arFields['CODE'])) {
$params = [
"max_len" => 100, // Максимальная длина
"change_case" => 'L', // Привести к нижнему регистру
"replace_space" => '_', // Заменять пробелы
"replace_other" => '_', // Заменять прочие символы
"delete_repeat_replace" => true
];
// Транслитерируем название и записываем в поле CODE
$arFields['CODE'] = CUtil::translit($arFields['NAME'], "ru", $params);
}
}
2. Современный подход D7: EventManager
В ядре D7 для работы с событиями предназначен класс \Bitrix\Main\EventManager. Синтаксис более современный и объектно-ориентированный.
Синтаксис:
use Bitrix\Main\EventManager;
$eventManager = EventManager::getInstance();
$eventManager->addEventHandler("ID_МОДУЛЯ", "НАЗВАНИЕ_СОБЫТИЯ", "ФУНКЦИЯ_ОБРАБОТЧИК");
Ключевое отличие: В D7-обработчик передается не набор аргументов, а один объект класса \Bitrix\Main\Event. Все параметры события нужно получать из этого объекта.
Пример: Та же задача на D7
// В /local/php_interface/init.php
use Bitrix\Main\EventManager;
$eventManager = EventManager::getInstance();
$eventManager->addEventHandler(
'iblock',
'OnBeforeIBlockElementAdd',
['MyEventHandlerClass', 'handleSetElementCode'] // Обработчик - статический метод класса
);
// Рекомендуется выносить обработчики в классы
class MyEventHandlerClass
{
public static function handleSetElementCode(\Bitrix\Main\Event $event)
{
// Получаем параметры из объекта события
$arFields = $event->getParameter("fields");
if ($arFields['IBLOCK_ID'] == 2 && empty($arFields['CODE'])) {
$params = ["max_len" => 100, "change_case" => 'L', "replace_space" => '_', "replace_other" => '_', "delete_repeat_replace" => true];
$arFields['CODE'] = CUtil::translit($arFields['NAME'], "ru", $params);
// Чтобы изменения применились, нужно создать объект Result и установить в него измененные поля
$result = new \Bitrix\Main\Entity\EventResult();
$result->modifyFields($arFields);
// Возвращаем результат
return $result;
}
}
}
Сравнение подходов
Критерий | AddEventHandler (старое API) | EventManager (D7) |
Аргументы | Набор переменных, часто по ссылке (&$arFields) | Один объект \Bitrix\Main\Event |
Изменение данных | Прямое изменение переменных по ссылке | Через методы объекта EventResult |
Стиль | Процедурный | Объектно-ориентированный |
Совместимость | Полная, работает везде | Предпочтителен для новых проектов |
Вывод:
Система событий — это ваш главный инструмент для безопасной кастомизации Битрикс. Для поддержки старого кода необходимо знать AddEventHandler, но для всех новых проектов настоятельно рекомендуется использовать EventManager и выносить логику обработчиков в отдельные классы. Это делает код более структурированным, читаемым и легко тестируемым.
AddEventHandler, EventManager, OnBeforeIBlockElementAdd, Битрикс события, обработчик событий, init.php, D7 события, модуль, event.