Событие импорта цен
Доступно с версии 3.3.0
Описание
Событие OnPriceStepImported срабатывает после завершения очередного шага импорта цен из МойСклад. Событие вызывается в классе Rbs\MoyskladStocks\Import\Type\Prices после обработки каждой порции товаров.
Когда срабатывает
- При автоматическом импорте цен через агент
- При ручном запуске импорта цен из админки
- При импорте цен из объекта МойСклад (webhook и т.д.)
Параметры события
| Параметр | Тип | Описание |
|---|---|---|
entity | string | Тип сущности: product, variant, bundle, service |
changedProductsIds | array | Массив ID товаров (b_iblock_element.ID), у которых изменились цены на текущем шаге |
productInfoArray | array | Ассоциативный массив с информацией о ценах из МойСклад для всех товаров шага |
Структура 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();
Важные замечания
-
changedProductsIds пустой — если массив пуст, значит на текущем шаге не было изменений цен (цены уже актуальны).
-
Производительность — обработчик вызывается на каждом шаге импорта. При большом каталоге это может быть много вызовов. Избегайте тяжёлых операций в обработчике.
-
productInfoArray содержит все товары — не только изменённые, а все товары текущего шага. Для фильтрации используйте
changedProductsIds. -
ID валют и типов цен — это UUID из МойСклад, не ID из Битрикс. Для маппинга используйте настройки модуля.