Иногда бывает, что нет возможности использовать родной механизм синхронизации данных с 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.
Вот и всё, пользуйтесь на здоровье!:)