Бортовой журнал Ктулху

Битрикс: количество товара на складах

Как получить количество товара на нескольких складах, товар может быть простым и с торговыми предложениями.

 

Для получения списка складов нужно использовать функцию CCatalogStore::GetList.

$select_fields = Array();
 $filter = Array("ACTIVE" => "Y");
 $resStore = CCatalogStore::GetList(array(),$filter,false,false,$select_fields);
while($sklad = $resStore->Fetch())
{
 $stores[] = $sklad;
 }
 echo "<pre>";
 print_r($stores);
 echo "</pre>";

Функция много чего выдаст:

[ID] => 2
[ACTIVE] => Y
[TITLE] => Склад № 2 (Салон)
[PHONE] => 8-000000-0-00-00
[SCHEDULE] => С 9-00 до 16-30 ч. без перерыва на обед
[ADDRESS] => 000000, Усть-Пердюйская область, г. Усть-Пердюйск, ул. Леннона, д.13
[DESCRIPTION] =>
[GPS_N] => 0
[GPS_S] => 0
[IMAGE_ID] => 481497
[DATE_CREATE] => 16.04.2015 12:48:20
[DATE_MODIFY] => 26.11.2015 22:59:23
[USER_ID] => 1
[XML_ID] => 84ee816c-ad2f-11e0-a62e-0030482d5029
[SORT] => 100
[EMAIL] =>
[ISSUING_CENTER] => Y
[SHIPPING_CENTER] => Y
[SITE_ID] => s1

но сейчас нужен только список ID складов.

После получения массива с ID складов можно приступать к проверке количества товара на складе.

Для этого понадобится функция CCatalogStoreProduct::GetList.

$arFilter = Array("PRODUCT_ID"=>$pid,"STORE_ID"=>$stores);
 $res = CCatalogStoreProduct::GetList(Array(),$arFilter,false,false,Array());
 
 while($arRes = $res->GetNext())
 
 {
$sum[] = $arRes['AMOUNT'];
 }

Эта функция также возвращает массив значений из которых нужно только количество ($arRes['AMOUNT']).

На базе этого была написана рекурсивная функция которая учитывала простые товары и торговые предложения.

function collectCountProductsOnStorages($pid, $arResult) 
 {
 if(CModule::IncludeModule('catalog')){
// список ID складов
 $select_fields = Array('ID', 'ACTIVE');
 $filter = Array("ACTIVE" => "Y");
 $resStore = CCatalogStore::GetList(array(),$filter,false,false,$select_fields);
while($sklad = $resStore->Fetch())
{
 $stores[] = $sklad['ID'];
 }
// собственно сами склады
 $arFilter = Array("PRODUCT_ID"=>$pid,"STORE_ID"=>$stores);
 $res = CCatalogStoreProduct::GetList(Array(),$arFilter,false,false,Array());
 
 while($arRes = $res->GetNext())
 
 {
$sum[] = $arRes['AMOUNT'];
 }
if(count($arResult['OFFERS']) > 0)
 {
 
 foreach ($arResult['OFFERS'] as $item) 
 {
 $offer_sum[] = round(collectCountProductsOnStorages($item['ID']), 0);
 }
 
 return array_sum($offer_sum);
 }
 else
 {
 return array_sum($sum);
 }
 
 }
}

На входе ID товара и массив $arResult.

Уже в процессе написания статьи я понял что ID отдельно можно было не передавать, все значения содержатся в $arResult, но не хочется прямо сейчас переписывать.

Функция проверяет наличие элемента OFFERS в массиве и если его находит, вызывает сама себя и обходит предложения.

По ID товара идет запрос к складам и вытягивается количество, которое в моем случае суммируется (так было нужно). Числа с десятичной частью округлялись до целых (не спрашивайте почему на складе 2,75 резинового фаллоимитатора и 1,6 пластмассового =))). Просто некоторые товары были не штучные а весовые что-ли, как-то так.