Битрикс — пакетное увеличение цен на проценты

18.01.2019  07:04

Достаточно рядовая задача — массово изменить все цены товаров и торговых предложений в каталоге на сайте с CMS 1С-Битрикс. Скрипт несложный, для возможности откатить я добавил поля PRICE_OLD к товарам и торговым предложениям, чтобы и сохранять старые цены и исключить повторное увеличение цен, если скрипт не сможет за 1 раз обработать все цены и упадёт.

$_SERVER["DOCUMENT_ROOT"] = realpath(dirname(__FILE__)."/..");
require_once ($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
CModule::IncludeModule("iblock");
CModule::IncludeModule("catalog");
CModule::IncludeModule("sale");
if ( !$USER->IsAdmin() ) {
    $APPLICATION->AuthForm("");
}
set_time_limit(0);
ini_set('max_execution_time', '3600');
ini_set('memory_limit', '512M');
$IBLOCK_ID = 12;// id каталога товаров 12
$IBLOCK_ID_OFFERS = 13;// id инфоблока торговых предложений 13
$PRICE_TYPE_ID = 1;
$CURRENCY = 'RUB';
$filterFields = Array(
    0 => "ID",
    1 => "IBLOCK_ID",
    2 => "NAME",
);
$c = 0;
$c2 = 0;
$arFilter = Array(
   "IBLOCK_ID"=>$IBLOCK_ID,
   "ID"=>10427,// для проверки по одному товару, чтоб не облажаться
   // "PROPERTY_PRICE_OLD" => false,
   "ACTIVE" => "Y",
);
$res = CIBlockElement::GetList(Array("ID"=>"ASC"), $arFilter, $filterFields);
while ($ar_fields = $res->GetNext()) {
	$ID = $ar_fields["ID"];
	unset($price,$newPrice,$prices);
        $resItem = CPrice::GetList(
            array(),
            array(
                "PRODUCT_ID" => $ID,
                "CATALOG_GROUP_ID" => $PRICE_TYPE_ID
            )
        );
        if ($arrItem = $resItem->Fetch())
        {
            $prices[] = $arrItem;
        }
        else
        {
            // $id = CPrice::Add($arFields);
        }
    if(!empty($prices)){
        foreach($prices as $v){
            $pricesArr[] = $v['PRICE'];
        }
		$price = $prices[0]["PRICE"];
		$price5percent = ($price * 5) / 100;
		$newPrice = ceil($price + $price5percent);
    }
	echo $price.' - '.$newPrice;exit;
	if(!empty($newPrice)) {
	$arFields = Array(
            "PRODUCT_ID" => $ar_fields["ID"],
            "CATALOG_GROUP_ID" => $PRICE_TYPE_ID,
            "PRICE" => $newPrice,
            // "EXTRA_ID" => $EXTRA_ID,//id наценки
            "CURRENCY" => $CURRENCY,
            // "QUANTITY_FROM" => 1,
            // "QUANTITY_TO" => 10
        );
	$resCat = CPrice::GetList(
            array(),
            array(
                "PRODUCT_ID" => $ar_fields["ID"],
                "CATALOG_GROUP_ID" => $PRICE_TYPE_ID
            )
        );
        if ($arrCat = $resCat->Fetch())
        {
            $id = CPrice::Update($arrCat["ID"], $arFields);
            $c++;
        }
        else
        {
            $id = CPrice::Add($arFields);
            $c++;
        }
        $arFields_update = Array(
            "ACTIVE" => "Y",
            "IBLOCK_ID" => $IBLOCK_ID,
        );
		$arProps["PRICE_OLD"] = $price;
        $obE = new CIBlockElement();
        if ($obE->Update($ar_fields["ID"], $arFields_update)){
			CIBlockElement::SetPropertyValuesEx($ID, $IBLOCK_ID, $arProps);
            // $arMessages[] = ''.$name.' update';
            // $c++;
        }
	}
}
echo 'fin '.$c;// сколько всего товаров обновлено
if($c > 0){
    // BXClearCache(true, "/");// очистка кеша
}


Скрипт по API перелопачивает все записи и всем товарам увеличивает цены на 5%.
Андрей Панёвин
Здравствуйте! Я — Андрей Панёвин и занимаюсь профессиональной разработкой сайтов на платформе 1С-Битрикс (исключительно программирование). Есть вопросы по статье? Могу подсказать и помочь по скайпу (andrey.panevin.ru), WhatsApp (+7-911-091-0670) или перепиской в ВК.
1000 р./час.



перейти в Блог

Ударим лайками по бездорожью, разгильдяйству и бюрократизму!


Ключевые слова (тэги): 1С-Битрикс 54  PHP 67  web-программирование 91  

Вам есть что сказать — ну я же чую.
Высказаться о наболевшем, я выслушаю-:
Имя


email (не публикуется)