Обучаю битриксу программистов, интеграторов. Подробнee ⇒

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



Расширенный режим цен, это когда для 1 типа задается разная цена для разного количества. Модуль обмена не умеет выгружать такие цены, но умеет выгружать несколько типов цен.
3 типа цены выгружается из 1С
  • для 1-2шт  (id типа цены на сайте 4)
  • для 3-9шт  (id типа цены на сайте 2)
  • для 10 и более  (id типа цены на сайте 3)
Задача:
для определенных продуктов (Свойство Обработчик заполнено и равно 3)
из нескольких типов цен заполнять цену с расширенным режимом  (id типа цены на сайте 1)


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

3. в init.php обработчики и функции

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


AddEventHandler("catalog", "OnBeforePriceAdd", "MyOnBeforePriceAdd");
function MyOnBeforePriceAdd(&$arFields){    
    if (empty($arFields["QUANTITY_FROM"]) && IsNeedRecalculate($arFields["PRODUCT_ID"])) {
       $arFields["QUANTITY_FROM"] = 1;
        $arFields["QUANTITY_TO"] = 2;          
    }
}
обработчик после добавления цены
AddEventHandler("catalog", "OnPriceAdd", "MyOnPriceAdd");
function MyOnPriceAdd($id, $arFields)
{
    
    if (in_array($arFields["CATALOG_GROUP_ID"],[2,3,4]) && IsNeedRecalculate($arFields["PRODUCT_ID"])) {
        if ($arFields["QUANTITY_FROM"] == 1) {
            RecalculateBasePrice($arFields["PRODUCT_ID"]);
            $dbProductPrice = CPrice::GetListEx(
                array(),
                array("PRODUCT_ID" => $arFields["PRODUCT_ID"], "QUANTITY_FROM" => 3, "QUANTITY_TO" => 9, "CATALOG_GROUP_ID" => $arFields["CATALOG_GROUP_ID"]),
                false,
                false,
                array("ID", "CATALOG_GROUP_ID", "PRICE", "QUANTITY_FROM", "QUANTITY_TO")            
            );
            if ($arRes = $dbProductPrice->Fetch()) {
                CPrice::Update($arRes["ID"], array(
                    "PRICE" => $arFields["PRICE"],
                    "CATALOG_GROUP_ID" => $arFields["CATALOG_GROUP_ID"],
                    "CURRENCY" => "RUB",
                    "QUANTITY_FROM" => 3,
                    "QUANTITY_TO" => 9
                ));
            } 
            else {
                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);
            }

            $dbProductPrice = CPrice::GetListEx(
                array(),
                array("PRODUCT_ID" => $arFields["PRODUCT_ID"], "QUANTITY_FROM" => 10, "CATALOG_GROUP_ID" => $arFields["CATALOG_GROUP_ID"]),
                false,
                false,
                array("ID", "CATALOG_GROUP_ID", "PRICE", "QUANTITY_FROM", "QUANTITY_TO")            
            );
            if ($arRes = $dbProductPrice->Fetch()) {
                CPrice::Update($arRes["ID"], array(
                    "PRICE" => $arFields["PRICE"],
                    "CATALOG_GROUP_ID" => $arFields["CATALOG_GROUP_ID"],
                    "CURRENCY" => "RUB",
                    "QUANTITY_FROM" => 10,
                    "QUANTITY_TO" => false
                ));
            } 
            else {
                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) && in_array($arFields["CATALOG_GROUP_ID"],[2,3,4]) && IsNeedRecalculate($arFields["PRODUCT_ID"])) {
        RecalculateBasePrice($arFields["PRODUCT_ID"]);
    }
}
обработчик перед удалением цены
AddEventHandler("catalog", "OnBeforePriceDelete", "MyOnBeforePriceDelete");
function MyOnBeforePriceDelete($ID){

    $arPrice = CPrice::GetByID($ID);
    if (($arPrice["CATALOG_GROUP_ID"] == 1) && IsNeedRecalculate($arPrice["PRODUCT_ID"]) && (RecalculateBasePrice($arPrice["PRODUCT_ID"]))) {
        return false;
    }
}
функция - проверка товара на то, надо ли для данного товара заполнять цену с расширенным режимом
function IsNeedRecalculate($productId){ 
   $result = false;
   if(!empty($productId) && CModule::IncludeModule('iblock')){
      $dbItems = \Bitrix\Iblock\Elements\ElementAbsenceTable::getList([   
         'filter' =>   [           
           "ID" => $productId,
                          "OBRABOTCHIK.VALUE"=>3                    
         ],   
           'select' => ['ID'], 
            'cache' => ["ttl" => 360000]
      ]);
      
      if($arItem = $dbItems->fetch()){
         $result = true;
      }   
   }
   return $result;
}
функция - пересчет цен
function RecalculateBasePrice($productId)
{
    $return = false;
    if (($productId > 0) && CModule::IncludeModule('catalog')) {
        //получим ВСЕ цены продукта
        $dbProductPrice = CPrice::GetListEx(
            array(),
            array("PRODUCT_ID" => $productId,"CATALOG_GROUP_ID"=>[1,2,3,4]),
            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])) { //если раньше делать, то хня творится, да и экономия по ресурсам
            $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;

}
Если блог был полезным, можете угостить меня "чашечкой кофе" :)

Сбер по номеру телефона +7 (953) 585-13-09 Вероника.
Спасибо!