Yandex Metrika
sanches.free

События highload-блока в Bitrix D7

Семейство хуков сущности

Для любой строки высоких нагрузок ядро раскладывает жизненный цикл по парам до/после: сохранение, обновление, удаление. События «до» позволяют поправить поля или остановить операцию объектом ошибки; «после» нужны журналированию и побочным эффектам, когда основная строка уже гарантированно лежит в таблице.

Место регистрации

Вызывают точки через EventManager, указывая модуль высоких нагрузок и символьный код операции над конкретной сущностью. Внутри обработчика смотрим на объект события, получаем ORM-сущность и параметры изменяемых полей, возвращая либо EventResult с нужным кодом успеха или ошибкой.

use Bitrix\Main\EventManager;
use Bitrix\Main\ORM\Event;
use Bitrix\Main\ORM\EventResult;

EventManager::getInstance()->addEventHandler(
    '',
    '\\Warehouse\\Hl\\ShelfTable::onBeforeUpdate',
    static function (Event $event) {
        $fields = [];
        if (method_exists($event, 'getParameter')) {
            $candidate = $event->getParameter('fields');
            if (is_array($candidate)) {
                $fields = $candidate;
            }
        }
        if (($fields['UF_CAPACITY'] ?? 0) < 0) {
            return new EventResult(EventResult::ERROR);
        }
        return new EventResult(EventResult::SUCCESS, $fields);
    }
);

Практика

  • Тяжёлые синхронные проверки и внешние HTTP-вызовы лучше вынести в отложенные задания, оставив в событии лёгкую валидацию.
  • Не полагаться на то, что OnAfter* «всегда» приходит после коммита: при откате транзакции верхним уровнем побочная логика тоже откатывается, поэтому критические инварианты должны решаться там же, где и данные строки.

Не хотите копаться сами?

Починю за 1-3 дня. Без предоплаты — оплата по результату.

15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии