Спасибо. На основе вашего поста сделал програмку и повесил на событие обновление элемента
Рабочий вариант:
Код |
---|
//=============================================================
// Товары из нескольких сладов перекладываем в один склад
\Bitrix\Main\EventManager::getInstance()->addEventHandler('catalog','\Bitrix\Catalog\Product::OnBeforeUpdate','onBeforeProductUpdate');
function onBeforeProductUpdate(\Bitrix\Main\Entity\Event $event){
$result = new \Bitrix\Main\Entity\EventResult();
/**
* получаем ID товара
*/
$ind = $event->getParameter('primary')['ID'];
//Контрольный вывод ID обрабатываемого товара
echo $ind";
// Перебираем склады со 136 по 149 и проверяем есть ли товар на этих складах
$rsStoreProduct = \Bitrix\Catalog\StoreProductTable::getList(array(
'filter' => array('=PRODUCT_ID'=>$ind,'>AMOUNT'=>0,'>=STORE_ID'=>136, '<=STORE_ID'=>149),//,'STORE.ACTIVE'=>'Y',),
'select' => array('ID','AMOUNT','STORE_ID'),
));
// Если товар есть, суммируем в переменную
$SUMamout=0;
while($arStoreProduct =$rsStoreProduct->fetch())
{
$SUMamout += $arStoreProduct['AMOUNT'];
}
// для контроля
echo "Итого в ТЦ - ".$SUMamout."/n/r";
// Если есть остатки, все складываем на склад 1
if ($SUMamout >0)
{
$rsStoreProduct = \Bitrix\Catalog\StoreProductTable::getList(array(
'filter' => array('=PRODUCT_ID'=>$ind,'=STORE_ID'=>1),
'select' => array('ID'),
));
if ($arStore = $rsStoreProduct->Fetch())
{
$arFieldss = Array(
"PRODUCT_ID" => $ind,
"STORE_ID" => 1,
"AMOUNT" => $SUMamout,
);
if(CCatalogStoreProduct::Update($arStore['ID'], $arFieldss))
{
echo "Такой уже есть, обновляем, ";
}else{
echo "Не получилось обновить";
}
}
else
{
$arFieldss = Array(
"PRODUCT_ID" => $ind,
"STORE_ID" => 1,
"AMOUNT" => $SUMamout,
);
if(CCatalogStoreProduct::Add($arFieldss))
{
echo "Добавляем новый ";
}else{
echo "Не получилось добавить товар - ".$arFieldss['PRODUCT_ID']." в склад - ".$arFieldss['STORE_ID']." в количестве - ".$arFieldss['AMOUNT'] ;
}
}
}
$result->modifyFields($arFields);
return $result;
}
//============================================================= |
Когда наблюдал логи от загрузки данных из 1С на сайт, обнаружил, что программа вызывается несколько раз для каждого товара, событие onBeforeProductUpdate для каждого элемента срабатывает несколько раз. И каждый раз вызывается программа и делает одно и тоже.
В результате время обмена увеличивается.
Вопрос: Как во время выгрузки товара из 1С на сайт вызывать событие только один раз?