Перейти к основному содержимому

Событие перед созданием элемента

[OnBeforeAddItem] Событие перед созданием элемента инфоблока​

Событие OnBeforeAddItem вызывается на этапе создания новых элементов — один раз для каждого нового элемента порции, которого ещё нет в каталоге. Работает для товаров, модификаций, комплектов и услуг: и при плановом импорте, и при обработке веб-хуков, которые создают элементы.

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

Событие срабатывает до всех проверок модуля: до пропуска архивных товаров и до поиска родителя модификации. Поэтому оно приходит и для тех элементов, которые модуль затем всё равно пропустит.

к сведению

Обработчик может отменить создание элемента, вернув EventResult::ERROR. Достаточно ERROR от любого из обработчиков.

Исключения не перехватываются

Исключение из обработчика модуль не ловит: оно обрывает шаг импорта. Оборачивайте свой код в try/catch.

Параметры события

ПараметрТипОписание
xmlIdstringИдентификатор элемента: externalCode МойСклад, а в режиме идентификации по идентификатору МойСклад — id сущности. Для модификаций — без префикса родителя
itemobjectСтрока МойСклад — объект товара, модификации, комплекта или услуги

Структура item

$item->name // 'Название товара'
$item->externalCode // 'abc123externalcode'
$item->id // UUID сущности в МойСклад
$item->archived // false
$item->meta->type // 'product' | 'variant' | 'bundle' | 'service'
$item->meta->href // 'https://api.moysklad.ru/api/remap/1.2/entity/product/...'
$item->attributes // доп. поля
$item->productFolder // группа товаров (meta->href)
$item->product // для variant — ссылка на родительский товар (meta->href)
item — это объект

Объект передаётся по ссылке на тот же экземпляр, с которым дальше работает модуль. Изменение его свойств в обработчике (например, $item->name) повлияет на создаваемый элемент — и на то, что придёт в items события OnAfterImportItems.

Возвращаемое значение

Возвращать ничего не обязательно.

Чтобы отменить создание элемента:

return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::ERROR);

Что происходит при отмене:

  • элемент не создаётся, модуль переходит к следующему;
  • счётчик пропущенных #SKIP# увеличивается, а в лог импорта пишется строка «Элемент не создан: создание отменено обработчиком события OnBeforeAddItem. [xmlId] Название» (с версии 3.9.0; на более ранних версиях элемент пропускался молча);
  • в событии OnAfterImportItems элемент остаётся в items, но в createdIds его нет.

Параметры, переданные в EventResult::SUCCESS, модуль не читает.