Как я использую события Bitrix, чтобы допиливать логику и не трогать ядро

В Bitrix почти любая «допилка» может быть сделана двумя способами: быстро и грязно (правим ядро, стандартные компоненты, модули) или через события. Первый вариант даёт быстрый эффект и долгую боль. Второй требует чуть больше дисциплины, но зато переживает обновления.

Зачем вообще нужны события

Событие — это точка, в которую Bitrix «зовёт» ваш код: перед сохранением элемента, после оформления заказа, при отправке почты, при авторизации и т.д. Вместо правки стандартного кода мы просто подписываемся на событие и меняем поведение.

В итоге ядро и модули можно спокойно обновлять, а вся кастомная логика живёт в отдельном месте — в /local и своих модулях.

Где я храню обработчики

Исторически люди лепили всё в /bitrix/php_interface/init.php. Я стараюсь от этого уходить:

  • завожу свой модуль в /local/modules/ и регистрирую обработчики там
  • либо, если проект поменьше, делаю отдельный класс-хранилище и подключаю его из init.php

Важно, чтобы код был не «рассыпан функциями», а собран в классы с адекватными именами. Тогда по логам/ошибкам сразу понятно, где искать поведение.

Базовая схема подключения

Пример для событий инфоблока:

use BitrixMainEventManager;

EventManager::getInstance()->addEventHandler( 'iblock', 'OnBeforeIBlockElementUpdate', ['\Local\Handlers\IBlock', 'onBeforeElementUpdate'] );

А в LocalHandlersIBlock:

class IBlock { public static function onBeforeElementUpdate(array &$fields): void { // ваша логика } }

Ключевой момент — аккуратно работать по ссылке с $fields, не забывать про проверки и не бросать исключения «во всё поле» без нужды.

Типичные кейсы, где события реально выручали Я чаще всего использую:

  • события инфоблоков: дополнять/нормализовать данные перед сохранением, синхронизировать сущности
  • OnSaleOrderSaved, OnBeforeOrderAdd: автоматическая установка свойств, статусов, прокидывание данных в внешние системы
  • события пользователей: при регистрации создавать связанные сущности, отправлять дополнительные письма, проставлять роли
  • почтовые события: логировать отправку важных писем, подставлять дополнительные поля

Всё это можно было бы «впихнуть» в шаблоны или модули, но события дают аккуратную точку вмешательства.

Типи**чные ошибки при работе с событиями

Гл**авные грабли:

  • вешать тяжёлую логику прямо в событие: внутри OnBefore… гонять сложные запросы, HTTP-запросы, циклы
  • регистрировать обработчики в /bitrix/modules, а не в /local
  • не логировать ошибки, из-за чего сайт «ведёт себя странно», а причина — в упавшем обработчике
  • плодить обработчики в разных местах, вместо одного централизованного модуля

Я стараюсь держать обработчики максимально лёгкими: если нужно что-то тяжёлое, лучше поставить флаг, записать задачу в свою таблицу и обработать её агентом или кроном.

Итог События в Bitrix — это нормальный, «правильный» способ вмешаться в работу системы, не трогая ядро и стандартные модули. Если вынести обработчики в /local, оформить их в модуль и следить за тем, чтобы они оставались лёгкими и предсказуемыми, проект переживает обновления и новые фичи без того самого ощущения, что любое изменение может всё сломать.

#bitrix #php #разработка

Как я использую события Bitrix, чтобы допиливать логику и не трогать ядро
В Bitrix почти любая «допилка» может быть сделана двумя способами: быстро и грязно (правим ядро, стандартные компоненты, модул... | Сетка — социальная сеть от hh.ru