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

Событие импорта цен

к сведению

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

Описание

Событие OnPriceStepImported срабатывает после завершения очередного шага импорта цен из МойСклад. Событие вызывается в классе Rbs\MoyskladStocks\Import\Type\Prices после обработки каждой порции товаров.

Когда срабатывает

  • При автоматическом импорте цен через агент
  • При ручном запуске импорта цен из админки
  • При импорте цен из объекта МойСклад (webhook и т.д.)

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

ПараметрТипОписание
entitystringТип сущности: product, variant, bundle, service
changedProductsIdsarrayМассив ID товаров (b_iblock_element.ID), у которых изменились цены на текущем шаге
productInfoArrayarrayАссоциативный массив с информацией о ценах из МойСклад для всех товаров шага

Структура productInfoArray

[
47520 => [ // ID товара в Битрикс
'MS_PRICES' => [
'cbb10056-e0aa-11f0-0a80-182a000a50bc' => [ // ID типа цены в МойСклад
'PRICE' => 3887.24,
'CURRENCY' => 'cbb0bdeb-e0aa-11f0-0a80-182a000a50bb' // ID валюты в МойСклад
],
'minPrice' => [
'PRICE' => 0,
'CURRENCY' => 'cbb0bdeb-e0aa-11f0-0a80-182a000a50bb'
],
'buyPrice' => [
'PRICE' => 0,
'CURRENCY' => 'cbb0bdeb-e0aa-11f0-0a80-182a000a50bb'
]
]
],
// ... другие товары
]

Примеры использования

Пример 1: Базовое логирование

\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'rbs.moyskladstocks',
'OnPriceStepImported',
function (\Bitrix\Main\Event $event) {
$entity = $event->getParameter('entity');
$changedProductsIds = $event->getParameter('changedProductsIds');

if (!empty($changedProductsIds)) {
logWrite([
'entity' => $entity,
'count' => count($changedProductsIds),
'ids' => $changedProductsIds
], 'Price Import', 'price_import.txt');
}
}
);

Пример 2: Отправка уведомления при изменении цен

\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'rbs.moyskladstocks',
'OnPriceStepImported',
function (\Bitrix\Main\Event $event) {
$entity = $event->getParameter('entity');
$changedProductsIds = $event->getParameter('changedProductsIds');

if (count($changedProductsIds) > 0) {
// Отправляем уведомление администратору
\CEvent::SendImmediate('PRICE_IMPORT_COMPLETE', SITE_ID, [
'ENTITY' => $entity,
'COUNT' => count($changedProductsIds),
'PRODUCT_IDS' => implode(', ', array_slice($changedProductsIds, 0, 10))
]);
}
}
);

Пример 3: Условная обработка по типу сущности

\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'rbs.moyskladstocks',
'OnPriceStepImported',
function (\Bitrix\Main\Event $event) {
$entity = $event->getParameter('entity');
$changedProductsIds = $event->getParameter('changedProductsIds');

// Разная логика для разных сущностей
switch ($entity) {
case 'product':
// Обработка товаров
ProductPriceHandler::processChanges($changedProductsIds);
break;

case 'variant':
// Обработка торговых предложений
VariantPriceHandler::processChanges($changedProductsIds);
break;

case 'bundle':
// Обработка комплектов
BundlePriceHandler::processChanges($changedProductsIds);
break;
}
}
);

Расположение в коде

Файл: bitrix/modules/rbs.moyskladstocks/lib/import/type/prices.php

$event = new \Bitrix\Main\Event(Config::getModuleId(true), 'OnPriceStepImported', [
'entity' => $entity,
'changedProductsIds' => $changedProductsIds,
'productInfoArray' => $productInfoArray,
]);
$event->send();

Важные замечания

  1. changedProductsIds пустой — если массив пуст, значит на текущем шаге не было изменений цен (цены уже актуальны).

  2. Производительность — обработчик вызывается на каждом шаге импорта. При большом каталоге это может быть много вызовов. Избегайте тяжёлых операций в обработчике.

  3. productInfoArray содержит все товары — не только изменённые, а все товары текущего шага. Для фильтрации используйте changedProductsIds.

  4. ID валют и типов цен — это UUID из МойСклад, не ID из Битрикс. Для маппинга используйте настройки модуля.