info@webdp.org
+998 90 357-67-26

Сортировка по цене с учетом валют в 1c-Bitrix.

В стандартном функционале 1c-Bitrix увы нету сортировки по цене с учетом валют но задача сортировать товары возникает довольно часто, вот одно из оптимальных решений данной задачи.

<?
CModule::IncludeModule("iblock");
CModule::IncludeModule("catalog");

$arSelect = Array("ID");
$arFilter = Array("IBLOCK_ID"=>2, "ACTIVE"=>"Y");
$res = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect);
while($ob = $res->GetNextElement())
{
    $arFields = $ob->GetFields();

    // получаем базовую цену товара
    $ar_res = CPrice::GetBasePrice($arFields["ID"]);

    // получаем цену со скидкой если она существует
    $db_resSale = CPrice::GetList(array(),array("PRODUCT_ID" => $arFields["ID"], "CATALOG_GROUP_ID" => 5));

    // если цена со скидкой сущетвует то заменяем базовую цену новым значением для обработки в массиве
    if ($ar_resSale = $db_resSale->Fetch())
    {
        // обновляем цену
        $ar_res["PRICE"] = $ar_resSale["PRICE"];
    }

    /********************************************/
    // Валюта
    $currRub = "RUB";
    
    // Конвертация цены в выбранную валюту
    $newCurrRub = CCurrencyRates::ConvertCurrency($ar_res["PRICE"], $ar_res["CURRENCY"], $currRub);

    // Массив с новыми занчениями
    $arFieldsNewPriceRub = Array("PRODUCT_ID" => $arFields["ID"], "CATALOG_GROUP_ID" => 4, "PRICE" => $newCurrRub, "CURRENCY" => $currRub);

    // Массив обновляемого товара (ID товара и тип обновляемой цены)
    $resNewPriceRub = CPrice::GetList(array(), array("PRODUCT_ID" => $arFields["ID"], "CATALOG_GROUP_ID" => 4));

    // обновление цены если цена существует, в противном случаи она добавится
    if ($arrNewPriceRub = $resNewPriceRub->Fetch())
    {
        CPrice::Update($arrNewPriceRub["ID"], $arFieldsNewPriceRub);
    }else{
        CPrice::Add($arFieldsNewPriceRub);
    }
    
    /********************************************/
    // Валюта
    $currUsd = "USD";

    // Конвертация цены в выбранную валюту
    $newCurrUsd = CCurrencyRates::ConvertCurrency($ar_res["PRICE"], $ar_res["CURRENCY"], $currUsd);

    // Массив с новыми занчениями
    $arFieldsNewPriceUsd = Array("PRODUCT_ID" => $arFields["ID"], "CATALOG_GROUP_ID" => 3, "PRICE" => $newCurrUsd, "CURRENCY" => $currUsd);

    // Массив обновляемого товара (ID товара и тип обновляемой цены)
    $resNewPriceUsd = CPrice::GetList(array(), array("PRODUCT_ID" => $arFields["ID"], "CATALOG_GROUP_ID" => 3));

    // обновление цены если цена существует, в противном случаи она добавится
    if ($arrNewPriceUsd = $resNewPriceUsd->Fetch())
    {
        CPrice::Update($arrNewPriceUsd["ID"], $arFieldsNewPriceUsd);
    }else{
        CPrice::Add($arFieldsNewPriceUsd);
    }
}
?>

Все статьи