В 12 версии БУС появился интересный компонент bitrix:catalog.store.amount. Он позволяет отобразить остатки по складам для данного товара. Но не умеет учитывать остатки указанные в торговых предложениях.
Вот код обработчика который позволит синхронизировать остатки. То есть в момент редактирования количества на складе для торгового предложения мы подсчитываем все остатки по остальным предложениям и сохраняем их у товара.
Вот код обработчика который позволит синхронизировать остатки. То есть в момент редактирования количества на складе для торгового предложения мы подсчитываем все остатки по остальным предложениям и сохраняем их у товара.
<? AddEventHandler("catalog", "OnStoreProductUpdate","MyOnStoreProductSave"); AddEventHandler("catalog", "OnStoreProductAdd","MyOnStoreProductSave"); define("LOG_FILENAME", $_SERVER["DOCUMENT_ROOT"]."/log.txt"); function MyOnStoreProductSave($id, $arFields){ $allAmount = $arFields['AMOUNT']; if(CModule::IncludeModule('catalog') & CModule::IncludeModule('iblock')){ //Получаем информацию о товаре привязанном к данному приложения, вмести с этим проверяем не является ли это товаром. $arProductInfo = CCatalogSKU::GetProductInfo($arFields['PRODUCT_ID']); if(is_array($arProductInfo)){ //Получаем данные о инфоблоке Торговых предложений $arOffersInfo = CCatalogSKU::GetInfoByProductIBlock($arProductInfo['IBLOCK_ID']); $arFilter = Array( 'IBLOCK_ID'=>$arOffersInfo['IBLOCK_ID'], "PROPERTY_".$arOffersInfo['SKU_PROPERTY_ID']=>$arProductInfo['ID'], "!ID"=>$arFields['PRODUCT_ID'] ); //Получаем список торговых предложений. $obOffersList = CIBlockElement::GetList(Array("SORT"=>"ASC"),$arFilter,false,false,array()); $arOffers = array(); while($arOffers = $obOffersList->Fetch()){ //Получаем данные об остатках на складе для торгового предложения. $obStoreOffer = CCatalogStoreProduct::GetList(array(), array('STORE_ID'=>$arFields['STORE_ID'], 'PRODUCT_ID' =>$arOffers['ID']), false,false,array()); while($arStore = $obStoreOffer->Fetch()){ $arAllStore[] = $arStore; $allAmount = $allAmount + $arStore['AMOUNT']; } } //Получаем данные о складе товара и формируем массив для обновления данных. $obStoreProduct = CCatalogStoreProduct::GetList(array(), array('STORE_ID'=>$arFields['STORE_ID'], 'PRODUCT_ID' =>$arProductInfo['ID']), false,false,array()); $arFieldsProduct = array ( 'PRODUCT_ID' => $arProductInfo['ID'], 'STORE_ID' => $arFields['STORE_ID'], 'AMOUNT' => $allAmount, ); $result = FALSE; if($arStoreProduct = $obStoreProduct->Fetch()){ $result = CCatalogStoreProduct::Update($arStoreProduct["ID"],$arFieldsProduct); }else{ $result = CCatalogStoreProduct::Add($arFieldsProduct); } if($result){ $obStoreProduct = CCatalogStoreProduct::GetList(array(), array('PRODUCT_ID' =>$arProductInfo['ID']), false,false,array()); while($arStoreProduct = $obStoreProduct->Fetch()){ $allAmountProduct = $allAmountProduct + $arStoreProduct['AMOUNT']; } $arFieldsProduct = array( "QUANTITY" => $allAmountProduct, ); CCatalogProduct::Update ($arProductInfo['ID'],$arFieldsProduct); } } } } ?> |