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

Событие подстановки элементов для цен и остатков

[OnAfterFindElementsForStocks] Свои элементы каталога для цен и остатков​

Доступно с версии 3.9.0

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

Перед записью цен и остатков модуль ищет элементы каталога по внешним кодам сущностей МойСклад (XML_ID). Событие OnAfterFindElementsForStocks вызывается сразу после этого поиска и позволяет дописать к найденному свои элементы: из другого инфоблока, с другим форматом XML_ID, несколько элементов на одну сущность МойСклад — например, когда товар МойСклад на сайте представлен торговыми предложениями.

Добавленные элементы модуль не выделяет особо: для него это дубли — несколько элементов за одним внешним кодом. Куда в итоге запишутся цены и остатки, решает настройка «Тип обработки дублей».

Без режима [ALL] добавленные элементы, скорее всего, ничего не получат

Настройка «Тип обработки дублей» задаётся отдельно для каждого пайплайна:

  • вкладка «Цены» — в блоке каждой сущности (товары, модификации, услуги, комплекты);
  • вкладка «Остатки» — для товаров, модификаций и комплектов;
  • вкладка «Быстрые остатки» — одна на вкладку.

Как значения настройки обходятся с набором элементов:

ЗначениеЧто получит значение из МойСклад
[ASC] Импортировать в первый по ID товар (по умолчанию) / [DESC] Импортировать в последний по ID товарТолько первый элемент набора. Найденные модулем идут первыми (по возрастанию или убыванию ID), добавленные — после них. Если модуль нашёл хоть что-то, добавленные элементы игнорируются; если не нашёл ничего — значение получит только первый из добавленных
[ALL] Импортировать во все товарыВсе элементы набора — и найденные модулем, и добавленные
[SKIP] Пропускать дубли при импортеВнешний код отбрасывается целиком, если за ним больше одного элемента — не получит значение даже элемент, найденный модулем

Чтобы событие работало, выставьте [ALL] Импортировать во все товары в тех пайплайнах, где вы добавляете элементы. Учтите, что режим распространяется и на настоящие дубли в каталоге: значение получат все элементы с одинаковым внешним кодом.

Предупреждение о дублях в логе импорта считает и добавленные элементы — при работе события оно ожидаемо.

В каких пайплайнах срабатывает​

ПайплайнЗначение target
Запись цен — агент цен, разовый импорт, цены при импорте товаров и по веб-хукуprices
Остатки по складам — агент, разовый импорт, обновление по веб-хукуstocks
Быстрые (текущие) остатки — агент, разовый импорт, обновление по веб-хукуcurrent_stocks

Событие приходит и тогда, когда модуль не нашёл ничего: found в этом случае пустой массив.

Событие только добавляет

Всё, что нашёл модуль, остаётся в наборе при любом ответе обработчика. Пропущенный в ответе внешний код, пропущенный элемент внутри кода, пустой found — ничего из найденного модулем не убирают. Исключить элемент из импорта цен и остатков через это событие нельзя.

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

ПараметрТипОписание
entitystringСущность МойСклад: product, variant, bundle, service
targetstringПайплайн: prices, stocks, current_stocks
xmlIdsarrayВнешние коды, которые искал модуль
foundarrayЧто модуль нашёл: [внешний код => [ID элемента => '', ...], ...]

Структура found

[
'abc123externalcode' => [
1234 => '', // ID элемента инфоблока — в ключе, значение не используется
1240 => '', // дубль с тем же внешним кодом
],
// ...
]

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

EventResult::SUCCESS с ключом found в той же форме. Возвращать весь набор не обязательно — достаточно того, что добавляете:

return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, [
'found' => [
'abc123externalcode' => [5678 => '', 5679 => ''],
],
]);

Ключи found берите из xmlIds: цены и остатки модуль знает только для тех сущностей, которые искал.

Что отбрасывается

  • ответ с типом, отличным от EventResult::SUCCESS, и ответ без массива в found;
  • внешний код с пустым именем или с не-массивом вместо списка элементов;
  • ID элемента, который не целое число или не больше нуля.

Для остатков (stocks) и быстрых остатков (current_stocks) элемент должен быть товаром каталога — иметь запись в b_catalog_product. Добавленные элементы без неё отбрасываются уже после события; в логе об этом только общее предупреждение о расхождении числа товаров и элементов инфоблока, без ID.

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