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

События перед записью поля "Доступное количество"

События позволяют менять поля товара после полного рассчета остатков для него. В модуле используется для смены поля QUANTITY у товара. Фактически результат события записывается в товар следующим методом:

\Bitrix\Catalog\Model\Product::update($productId, $arUpdateProductFields);
Как модуль читает ответ обработчика

Оба события вызываются для каждого товара, даже если QUANTITY не изменился — тогда arUpdateProductFields приходит пустым массивом []. Если после обработчиков массив остался пустым, запись товара пропускается.

  • Ответы обработчиков читаются по порядку, и последний ответ EventResult::SUCCESS целиком заменяет массив полей — поля не сливаются. Ответы ERROR игнорируются.
  • Всегда возвращайте полный массив полей. SUCCESS без параметров даёт null, и на PHP 8 запись товара падает с ошибкой.
  • Событие отправляется без перехвата исключений: исключение в обработчике прерывает текущий шаг импорта, и оставшиеся товары шага не обрабатываются. Ловите исключения внутри обработчика.

[OnBeforeUpdateProductInStockRow] Для вкладки "Остатки"​

Это событие стоит применять если используете вкладку "Остатки".

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

ПараметрТипОписание
arUpdateProductFieldsarrayПоля товара для обновления: ['QUANTITY' => …], если количество изменилось, иначе []
productBxintID товара в Битрикс
currentStocksarrayОстатки на складах Битрикс ПОСЛЕ записи новых значений, ключи — ID склада
productInfoStocksarrayПолный массив данных, влияющих на изменение остатков; BX_STOCKS в нём — остатки ДО изменения
qtyByStocksarrayРассчитанные количества по складам

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

Верните EventResult::SUCCESS с модифицированным массивом $arUpdateProductFields. Этот массив заменит тот, что передаёт модуль в \Bitrix\Catalog\Model\Product::update().

return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $arUpdateProductFields);
к сведению

Ключи ALL, ALL_MS, ALL_BX и ID складов присутствуют в зависимости от настроек синхронизации. qtyByStocks содержит рассчитанные значения, одно из которых выбирается для записи в QUANTITY.

Вызов из устаревшего API

OnBeforeUpdateProductInStockRow также вызывается устаревшим ImportStocksClass::updateRow — только если ваш код сам зовёт устаревшие публичные методы Rbs\MoyskladStocks\Import\Type\Stocks::updateRow() или Stocks::updateAll(); штатный импорт модуля этот путь не использует. В этом вызове другой набор параметров:

  • productBx — массив ['ID' => …, 'QUANTITY' => …], а не int;
  • currentStocks — нумерованный список записей StoreProductTable по сопоставленным складам, а в режиме ALL_BX — все записи складов товара;
  • параметров productInfoStocks и qtyByStocks нет.

Если обработчик должен работать в обоих случаях, проверяйте тип productBx.


[OnBeforeUpdateProductInCurrentStockRow] для вкладки "Быстрые остатки"​

Событие полностью аналогично событию выше, но работает при передаче быстрых остатков.

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

ПараметрТипОписание
arUpdateProductFieldsarrayПоля товара для обновления: ['QUANTITY' => …], если количество изменилось, иначе []
productBxintID товара в Битрикс
currentStocksarrayОстатки на складах Битрикс ПОСЛЕ записи новых значений, ключи — ID склада
productInfoStocksarrayПолный массив данных, влияющих на изменение остатков; BX_STOCKS в нём — остатки ДО изменения
Отличие от OnBeforeUpdateProductInStockRow

В данном событии не передаётся параметр qtyByStocks. BX_QUANTITY и BX_STOCKS в productInfoStocks устроены так же, а MS_STOCKS — иначе: [UUID склада МС => [<тип> => значение], 'all_stocks' => [<тип> => сумма]], где <тип> — stock или quantity по настройке «Тип импорта остатков» вкладки.

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

Верните EventResult::SUCCESS с модифицированным массивом $arUpdateProductFields.

return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $arUpdateProductFields);