Самописное обновление цен на сайте под управлением 1С-Битрикс

Иногда бывает, что нет возможности использовать родной механизм синхронизации данных с 1С, тогда приходится писать самописные скрипты используя API CMS.

В качестве примера покажу, как это делал на одном из проектов под управлением 1С-Битрикс.

У меня был xml-файлик с кодами товаров и привязанными к ним ценами примерно следующей структуры:



	
		00-00000001
		287
	
	
		00-00000002
		171
	

Стояла задача поставить на каждодневное обновление на сайте этих данных.

В коде нет ничего необычного, но так как задача довольно популярна, выкладываю её сюда, чтобы не потерять.


define("NO_KEEP_STATISTIC", true); // отключаем статистику
require_once($_SERVER['DOCUMENT_ROOT'] . "/bitrix/modules/main/include/prolog_before.php");

//подключаем нужные модули
CModule::IncludeModule("iblock");
CModule::IncludeModule("sale");
CModule::IncludeModule("catalog");

// путь на сервере до файла
$xml =  simplexml_load_file('/1c/price.xml');

// 2 служебных массива для сбора данных
$arCodePrice = array();
$arCode = array();

// запишем все коды в массив, чтобы не дергать поочереди каждый
foreach ($xml as $product){
	$code = trim((string) $product->id);
	$price = (string) $product->price;
	$arCodePrice[$code] = $price;
	$arCode[] = $code;
}


if(!empty($arCodePrice)){
	
	$arSelect = Array("ID", "IBlOCK_ID", "NAME", "PROPERTY_CODE");
	// в моем случае ищем в двух ИБ (основной каталог и каталог с ТП)
	$arFilter = Array("IBLOCK_ID"=>array(2,3), "PROPERTY_CODE" => $arCode);
	$res = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect);
	while($ob = $res->Fetch())
	{
		
		// если нужно переводим в другую валюту
		//$priceRub = CCurrencyRates::ConvertCurrency($arCodePrice[$ob["PROPERTY_CODE_VALUE"]], "USD", "RUB");
		
		$arFields = Array(
			"PRODUCT_ID" => $ob["ID"],
			"CATALOG_GROUP_ID" => 1,
			"PRICE" => $arCodePrice[$ob["PROPERTY_CODE_VALUE"]],
			"CURRENCY" => "USD",
			"QUANTITY_FROM" => 1,
			"QUANTITY_TO" => 100
		);

		$resPrice = CPrice::GetList(
				array(),
				array(
						"PRODUCT_ID" => $ob["ID"],
						"CATALOG_GROUP_ID" => 1
					)
			);

		// само обновление/добавление
		if ($arr = $resPrice->Fetch())
		{
			CPrice::Update($arr["ID"], $arFields);
		}
		else
		{
			CPrice::Add($arFields);
		}
		
	}
}

После, можно поставить этот скрипт на cron через допустим wget.

Вот и всё, пользуйтесь на здоровье!:)


Возврат к списку