Выгрузка из 1С на сайт цен с расширенным режимом


Расширенный режим цен, это когда для 1 типа задается разная цена для разного количества
Модуль обмена не умеет выгружать такие цены, но умеет выгружать несколько типов цен

Задача:
из нескольких типов цен заполнять расширенный

у меня 3 типа цены выгружается из 1С
  • для 1-2шт  (id типа цены на сайте 4)
  • для 3-9шт  (id типа цены на сайте 2)
  • для 10 и более  (id типа цены на сайте 3)
Решение:

1. на сайте завести 4 цены (3 выгружаются, 1 заполняется и по енй работает каталог на сайте)
2. включить поддержку старых событий в модуле Каталог

3. в init.php обработчики

перед добавлением, и изменением цены
AddEventHandler("catalog", "OnBeforePriceUpdate", "MyOnBeforePriceUpdate");
function MyOnBeforePriceUpdate($id,&$arFields){  
    if(empty($arFields["QUANTITY_FROM"])){       
        $arFields["QUANTITY_FROM"] = 1;
        $arFields["QUANTITY_TO"] = 2;       
    }  
}

AddEventHandler("catalog", "OnBeforePriceAdd", "MyOnBeforePriceAdd");
function MyOnBeforePriceAdd(&$arFields){      
    if(empty($arFields["QUANTITY_FROM"])){
        $arFields["QUANTITY_FROM"] = 1;
        $arFields["QUANTITY_TO"] = 2;         
    }    
}
последобавления и изменения цены
AddEventHandler("catalog", "OnPriceAdd", "MyOnPriceAdd");
function MyOnPriceAdd($id,$arFields){    
    if(($arFields["CATALOG_GROUP_ID"]!=1) && CModule::IncludeModule('catalog')) {                       
        if($arFields["QUANTITY_FROM"]==1){            
            RecalculateBasePrice($arFields["PRODUCT_ID"]); 
            CPrice::Add(array(
                "PRODUCT_ID" => $arFields["PRODUCT_ID"],
                "CATALOG_GROUP_ID" => $arFields["CATALOG_GROUP_ID"],
                "PRICE" => $arFields["PRICE"],
                "CURRENCY" => "RUB",
                "QUANTITY_FROM" => 3,
                "QUANTITY_TO" => 9 
            ),false);
            CPrice::Add(array(
                "PRODUCT_ID" => $arFields["PRODUCT_ID"],
                "CATALOG_GROUP_ID" => $arFields["CATALOG_GROUP_ID"],
                "PRICE" => $arFields["PRICE"],
                "CURRENCY" => "RUB",
                "QUANTITY_FROM" => 10,
                "QUANTITY_TO" => false 
            ),false);  
        }
    }

}
AddEventHandler("catalog", "OnPriceUpdate", "MyOnPriceUpdate");
function MyOnPriceUpdate($id,$arFields){   
    if(isset($arFields["CATALOG_GROUP_ID"]) && ($arFields["QUANTITY_FROM"]==1)&&($arFields["CATALOG_GROUP_ID"]!=1)){        
        RecalculateBasePrice($arFields["PRODUCT_ID"]);        
    }    
}
функция пересчета RecalculateBasePrice
function RecalculateBasePrice($productId){ 
    $return = false;   
    if(($productId > 0) && CModule::IncludeModule('catalog')){       
        //получим ВСЕ цены продукта
        $dbProductPrice = CPrice::GetListEx(
            array(),
            array("PRODUCT_ID" => $productId),
            false,
            false,
            array("ID", "CATALOG_GROUP_ID", "PRICE", "QUANTITY_FROM", "QUANTITY_TO")
            //array()
        );
        $arPrices = array();
        $arPrices1 = array();
        $arBasePrices = array();        
        $arBasePrices1 = array();        
        while($arRes = $dbProductPrice->Fetch()){
            if($arRes["CATALOG_GROUP_ID"]==1){
                $arBasePrices[$arRes["ID"]] = $arRes;
                $arBasePrices1[$arRes["QUANTITY_FROM"]] = $arRes["PRICE"];        
            }
            elseif($arRes["QUANTITY_FROM"]==1){
                $arPrices[$arRes["CATALOG_GROUP_ID"]] = $arRes["PRICE"];
                $arPrices1[$arRes["CATALOG_GROUP_ID"]] = $arRes;
            }
        }
        $return = isset($arPrices[4]) || isset($arPrices[2]) || isset($arPrices[3]);
        
        if(isset($arPrices[4]) && isset($arPrices[2]) && isset($arPrices[3])){ //когда все 3 цены заполнены, если раньше делать, то хня творится, да и экономия по ресурсам
            $price = $arPrices[4];  //Обмен с сайтом (1) от 1 до 2 шт       
            $b = false;                                         
            foreach ($arBasePrices as $id => $arBasePrice) {
                if($arBasePrice["QUANTITY_FROM"]==1){                                
                    if($arBasePrice["PRICE"]!=$price){                                   
                        CPrice::Update($id, array(
                            "PRICE"=>$price,
                            "CATALOG_GROUP_ID" => 1,
                            "CURRENCY"=>"RUB",
                            "QUANTITY_FROM" => 1,
                            "QUANTITY_TO" => 2 
                        ));
                    }
                    $b = true;
                    break;
                }
            }
            if(!$b){                            
                CPrice::Add(array(
                    "PRODUCT_ID" => $productId,
                    "CATALOG_GROUP_ID" => 1,
                    "PRICE" => $price,
                    "CURRENCY" => "RUB",
                    "QUANTITY_FROM" => 1,
                    "QUANTITY_TO" => 2 
                ),false);
            }
            $price = $arPrices[2]; //обмен с сайтом (3) от 3 до 9шт
            $b = false;   
            foreach ($arBasePrices as $id => $arBasePrice) {
               if($arBasePrice["QUANTITY_FROM"]==3){                                
                    if($arBasePrice["PRICE"]!=$price){                                    
                        CPrice::Update($id, array(
                            "PRICE"=>$price,
                            "CATALOG_GROUP_ID" => 1,
                            "CURRENCY"=>"RUB",
                            "QUANTITY_FROM" => 3,
                            "QUANTITY_TO" => 9 
                        ));
                    }
                    $b = true;
                    break;
                }
            }
            if(!$b){
              
                CPrice::Add(array(
                    "PRODUCT_ID" => $productId,
                    "CATALOG_GROUP_ID" => 1,
                    "PRICE" => $price,
                    "CURRENCY" => "RUB",
                    "QUANTITY_FROM" => 3,
                    "QUANTITY_TO" => 9 
                ),false);
            }
            $price = $arPrices[3]; //обмен с сайтом (10) от 10 и более
            $b = false;                         
            foreach ($arBasePrices as $id => $arBasePrice) {
                if($arBasePrice["QUANTITY_FROM"]==10){                                
                    if($arBasePrice["PRICE"]!=$price){                        
                        CPrice::Update($id, array(
                            "PRICE"=>$price,
                            "CATALOG_GROUP_ID" => 1,
                            "CURRENCY"=>"RUB",
                            "QUANTITY_FROM" => 10,
                            "QUANTITY_TO" => null
                        ));    
                    }                        
                    $b = true;
                    break;
                }
            }
            if(!$b){                            
                CPrice::Add(array(
                    "PRODUCT_ID" => $productId,
                    "CATALOG_GROUP_ID" => 1,
                    "PRICE" => $price,
                    "CURRENCY" => "RUB",
                    "QUANTITY_FROM" => 10,
                    "QUANTITY_TO" => null 
                ),false);
            }
        }
    }
    return $return; //если хотя бы одна цена с 1С заполнена, то базовая не удаляется
    
}
на удаление цены
AddEventHandler("catalog", "OnBeforePriceDelete", "MyOnBeforePriceDelete"); 
function MyOnBeforePriceDelete($ID) {     
    $arPrice = CPrice::GetByID($ID);
    if (($arPrice["CATALOG_GROUP_ID"] == 1) && (RecalculateBasePrice($arPrice["PRODUCT_ID"]))){ 

        return false; 
    } 
}