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

События связанные с импортом товаров

События в этом блоке работают для сущностей:

  • товары
  • модификации
  • комплекты
  • услуги

Все эти сущности импортируются по общим правилам и имеют одинаковые события для модификации импорта.

Общая структура импорта модуля делится на несколько этапов:

Этап 1. Считывание очередной порции товаров.​

Здесь модуль считывает порцию товаров. Она зависит от шага импорта, но всегда кратна 100 элементам. Максимум 1000 элементов. Далее модуль разделяет эту порцию на 2 подмассива:

  • найденные элементы по внешнему коду
  • не найденные элементы, которые нужно создать

Этап 2. Создание новых элементов​

Здесь модуль создает новые элементы инфоблока. После создания каждого элемента он создает также элемент торгового каталога.

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

События этапа в порядке вызова:

  • OnBeforeAddItem — перед созданием каждого нового элемента; позволяет отменить его создание.
  • OnImportBundle — для комплектов, после успешного создания товара каталога; позволяет подставить свои компоненты набора.
  • OnSetSkuProps — для модификаций, запись характеристик в свойства торгового предложения.
  • OnSetPropsForItem — запись свойств элемента, если включён импорт свойств.
  • OnAfterImportItems — один раз после создания всей порции.

Этап 3. Обновление существующих элементов​

Здесь аналогичные правила как при создании: сначала обновляем элемент инфоблока, а затем уже обновляем поля товара торгового каталога.

к сведению

По большому счету все события ниже можно заменить стандартными событиями Битрикса, например перед обновлением элемента инфоблока или перед изменением элемента торгового каталога. События модуля в некоторых моментах могут помочь с тем, чтобы видеть поля пришедшие из МС, что позволяет не делать лишних запросов.

Если в настройках обновления сущности не отмечено ни одной опции и сущность — не модификация, модуль пропускает этап целиком: ни одно событие ниже, включая OnAfterUpdateItems, не вызывается.

Ниже опишем события в том порядке, в котором они вызываются:

[OnBeforeGetPropsValues] - вызывается один раз на порцию, до цикла по элементам, если включено обновление свойств (или загрузка картинок в свойство). Позволяет заменить список сопоставления свойств, по которому модуль прочитает текущие значения и затем запишет новые.

Событие перед чтением значений свойств

[OnBeforeUpdateItem] - вызывается перед тем как конкретный элемент будет обновлен, можно использовать для модификации данных, которые передаются в элемент инфоблока. В этом событии можно поменять поля, которые уйдут в метод CIblockElement::Update(). Вызывается только если модуль собрал для элемента хотя бы одно поле на обновление;

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

[OnSetPropsForItem] - вызывается если вы импортируете свойства элементов инфоблока, здесь можно либо модифицировать значения передаваемых свойств, либо добавить свои свойства для записи. Поля в этом методе передаются в метод CIBlockElement::SetPropertyValuesEx();

Событие перед записью свойств товара

[OnBeforeUpdateItemProduct] - вызывается перед тем как изменятся поля товара торгового каталога. Вызывается перед методом \Bitrix\Catalog\Model\Product::update();

[OnBeforeUpdateItemVariant] - аналогично событию выше, но в нем также передаются поля родительского товара, т.к. здесь событие срабатывает при импорте модификаций.

Событие перед изменением товара

[OnImportBundle] - для комплектов вызывается после OnBeforeUpdateItemProduct, на каждом прогоне для каждого комплекта. Позволяет подставить свои компоненты набора.

Событие импорта комплекта

[OnSetSkuProps] - вызывается для каждой модификации (и при создании, и при обновлении), здесь можно модифицировать значения свойств торговых предложений. При создании событие вызывается, даже если товар каталога для модификации создать не удалось.

Событие перед записью свойств торговых предложений

[OnAfterUpdateItems] - здесь событие можно считать устаревшим, т.к. оно срабатывает после того, как сработали все события выше для каждого из товаров и в этом событии передаются данные массового импорта. Следовательно данные в этом событии можно обрабатывать также массово.

События массовой обработки очередного шага импорта

Как модуль читает ответ обработчиков

События OnBeforeUpdateItem, OnBeforeUpdateItemProduct, OnBeforeUpdateItemVariant, OnSetPropsForItem, OnSetSkuProps, OnBeforeGetPropsValues и OnImportBundle устроены одинаково:

  • исключение из обработчика модуль не перехватывает — оно обрывает шаг импорта. Оборачивайте свой код в try/catch;
  • модуль перебирает ответы всех обработчиков, и параметры последнего EventResult::SUCCESS целиком заменяют данные модуля. Ответы не сливаются: каждый обработчик получает исходные данные, а не результат предыдущего;
  • EventResult::ERROR игнорируется — отменить им операцию нельзя (исключение — OnBeforeAddItem);
  • SUCCESS без параметров превращает данные в null, который модуль дальше передаёт в count() и методы Битрикса — на PHP 8 это TypeError. Всегда возвращайте полный массив, а если менять нечего — не возвращайте ничего.