Семейство хуков сущности
Для любой строки высоких нагрузок ядро раскладывает жизненный цикл по парам до/после: сохранение, обновление, удаление. События «до» позволяют поправить поля или остановить операцию объектом ошибки; «после» нужны журналированию и побочным эффектам, когда основная строка уже гарантированно лежит в таблице.
Место регистрации
Вызывают точки через 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 дней гарантии