Событие перед удалением по веб-хуку
[OnBeforeDeleteItem] Удаление сущности в МойСклад
Событие OnBeforeDeleteItem вызывается, когда из МойСклад пришёл веб-хук с действием DELETE. Срабатывает в самом начале обработки: до того, как модуль удалит запись из своего HL-кеша и до того, как начнёт искать элемент в инфоблоке.
Главное отличие от остальных событий модуля: событие приходит даже если элемента в каталоге Битрикс нет вообще. Сущность могла никогда не импортироваться, попадать под фильтр по группе или быть архивной — веб-хук об удалении всё равно придёт, и кастомный код получит о нём сигнал.
Обработчик может отменить штатную обработку, вернув EventResult::ERROR. Тогда модуль выйдет, не тронув ни HL-кеш, ни элемент инфоблока.
Для каких сущностей срабатывает
| Сущность | Что делает модуль после события |
|---|---|
product, variant, bundle, service | Удаляет или деактивирует элемент инфоблока — в зависимости от настройки «Удалять элемент при удалении в МойСклад» |
productfolder | Удаляет запись из HL-кеша разделов и удаляет/деактивирует раздел инфоблока |
Событие вызывается только для действия DELETE. Веб-хуки CREATE и UPDATE до него не доходят.
- Описание события
- Пример вызова события
- Примеры использования
Параметры события
| Параметр | Тип | Описание |
|---|---|---|
hook | object | Объект веб-хука от МойСклад целиком |
entity | string | Сущность: product, variant, bundle, service, productfolder |
href | string | Ссылка на удалённую сущность в API МойСклад |
xmlId | string | Внешний код (XML_ID) элемента в Битрикс, если модулю удалось его разрешить |
xmlId может прийти пустой строкой — это нормальная ситуация. Так бывает, когда режим внешних кодов использует HL-кеш ExtCodes/PFolder, а записи для этого href в нём нет: сущность не импортировалась. Проверяйте значение перед использованием.
Возвращаемое значение
Возвращать ничего не обязательно — событие можно использовать как информационное.
Чтобы отменить штатное удаление или деактивацию:
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::ERROR);
Отмена работает целиком: запись HL-кеша остаётся на месте, элемент инфоблока не трогается. Если обработчиков несколько, достаточно ERROR от любого из них.
//Пример кода нужно вставить в файл init.php
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'rbs.moyskladstocks',
'OnBeforeDeleteItem',
'OnBeforeDeleteItemHandler'
);
function OnBeforeDeleteItemHandler(\Bitrix\Main\Event $event)
{
$eventParams = $event->getParameters();
// $hook — объект веб-хука МойСклад:
// $hook->action // 'DELETE'
// $hook->meta->type // 'product' | 'variant' | 'bundle' | 'service' | 'productfolder'
// $hook->meta->href // 'https://api.moysklad.ru/api/remap/1.2/entity/product/...'
$hook = $eventParams['hook'];
$entity = $eventParams['entity']; // тип сущности МойСклад
$href = $eventParams['href']; // ссылка на сущность в API МойСклад
$xmlId = $eventParams['xmlId']; // внешний код элемента, может быть пустым
#WORK_AREA#
}
Журнал удалений, включая непроимпортированные сущности
function OnBeforeDeleteItemHandler(\Bitrix\Main\Event $event)
{
$eventParams = $event->getParameters();
YourAuditLogger::log([
'event' => 'ms_entity_deleted',
'entity' => $eventParams['entity'],
'href' => $eventParams['href'],
'xml_id' => $eventParams['xmlId'],
'in_bitrix' => $eventParams['xmlId'] !== '',
'timestamp' => date('Y-m-d H:i:s'),
]);
}
Запретить удаление товаров, участвующих в незавершённых заказах
function OnBeforeDeleteItemHandler(\Bitrix\Main\Event $event)
{
$eventParams = $event->getParameters();
if ($eventParams['entity'] !== 'product' || $eventParams['xmlId'] === '') {
return;
}
// Проверка — на стороне разработчика
if (YourOrderChecker::hasActiveOrders($eventParams['xmlId'])) {
// Модуль не тронет ни HL-кеш, ни элемент инфоблока
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::ERROR);
}
}
Своя логика вместо штатной: перенос в архивный раздел
function OnBeforeDeleteItemHandler(\Bitrix\Main\Event $event)
{
$eventParams = $event->getParameters();
if ($eventParams['xmlId'] === '') {
return;
}
// Переносим элемент в свой раздел «Снято с продажи»
YourArchiver::moveToArchive($eventParams['xmlId'], $eventParams['entity']);
// Отменяем штатное удаление/деактивацию
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::ERROR);
}