Фильтрация по наличию на складах

Умный фильтр Битрикса не поддерживает фильтрацию по складам (потому как работает только со свойствами элементов). Следовательно, чтобы добавить в возможность фильтровать товар по наличию на складах, нужно добавить соответствующие свойства в карточку элемента. Для этого напишем обработчик в init.php, который при изменении количества товара на складе будет проставлять нужные свойства в карточку элемента.
[spoiler]
Примерный код:

AddEventHandler("catalog", "OnStoreProductUpdate", Array("MyClass", "NalichieNaSkladah"));

class MyClass
{
    // создаем обработчик события 
    function NalichieNaSkladah($ID,$arFields)
    {
        if($ID>0)
     {
         $elem = $arFields[PRODUCT_ID];
         CModule::IncludeModule('catalog'); //

        
         $in_nal = NULL;
         $out_nal = NULL;

         $arFilter = Array("PRODUCT_ID"=>$elem, '>PRODUCT_AMOUNT' => 0);
         $arSelectFields = Array( "ID", "ACTIVE", "TITLE", "PHONE", "SCHEDULE", "ADDRESS", "DESCRIPTION", 
         "GPS_N", "GPS_S", "IMAGE_ID", "DATE_CREATE", "DATE_MODIFY", "USER_ID", "XML_ID", "PRODUCT_AMOUNT");
         $res = CCatalogStore::GetList(Array(),$arFilter,false,false,$arSelectFields);
         while ($arRes = $res->GetNext()) {
            $STORE_LIST[]=$arRes['ID']; // получим данные о наличии на складах данного товара
         }
         $in_store = array(12, 13, 14, 16); // проверяем на наличие на "своих складах"
         foreach ($in_store as $value) {
         $in_nal = in_array($value, $STORE_LIST);
         if($in_nal === TRUE){ 
            $nal_prop_array[] = 20204; // добавляем в массив свойство "свои склады"

            break;
         }
         }
         $out_store = array(1,2,3,4,5,6,7,8,9,10,11); // проверяем на наличие на "чужих складах"

         foreach ($out_store as $value) {
         $out_nal = in_array($value, $STORE_LIST);
         if($out_nal === TRUE){
            $nal_prop_array[] = 20203; // добавляем в массив свойство "чужие склады"

            break;
         }   
         }
         if($out_nal=== NULL && $in_nal === NULL){
         $nal_prop_array[] = 20205; // добавляем в массив свойство "нет на складе"

         }


         CIBlockElement::SetPropertyValuesEx($elem, 12, array(5197 => $nal_prop_array)); // запишем свойство 

   }
   else 
   {
        echo '<pre>', print_r('Ошибка изменения элемента'), '</pre>';
   }
    }
}
 
0
Dim
16.09.2019 11:01:01
Код неполный относительно-необходимо учитывать, что в поле количество на складе мы можем не число записать, а прислать пустое поле. Вдобавок к этому надо еще на событии до удаления товара со склада проверять-есть ли удаление, и потом на событии после удаления товара со склада-собрать свой массив, и передать его уже в эту функцию.
0
Kler
16.09.2019 11:16:03
Рабочий код +