Ковырял выгрузку, дошел до файлика /bitrix/modules/iblock/classes/general/cml2.php. Тут у нас располагается класс CIBlockCMLImport, который, как я понял, используется при обмене с 1с. В частности меня интересовала установка цен на товары:
[spoiler]
Вроде все понятно и логично, но на последних строчках:
сразу появился вопрос "зачем?". Или может я не так все понял? Мы вытаскиваем все цены для товара из нашей базы, затем обрабатываем все цены, пришедшие из 1с, и, если находим совпадение типа цен, то обновляем ценовое предложение, а если нет, то создаем новое ценовое предложение. А затем удаляет все цены, которые не обновились из 1с. Или нет?
[spoiler]
function SetProductPrice($PRODUCT_ID, $arPrices, $arDiscounts = false)
{
if(is_array($arDiscounts) && count($arDiscounts) > 0)
{
if(!array_key_exists(1, $arDiscounts))
$arDiscounts[1] = 0;
ksort($arDiscounts);
$prev = 0;
foreach($arDiscounts as $volume => $percent)
{
if($prev > 0)
{
$arDiscounts[$prev] = array(
"QUANTITY_FROM" => $prev,
"QUANTITY_TO" => $volume - 1,
"PERCENT" => $arDiscounts[$prev],
);
}
$prev = $volume;
}
$arDiscounts[$prev] = array(
"QUANTITY_FROM" => $prev,
"QUANTITY_TO" => "",
"PERCENT" => $arDiscounts[$prev],
);
}
else
{
$arDiscounts = array(
array(
"QUANTITY_FROM" => "",
"QUANTITY_TO" => "",
"PERCENT" => 0,
),
);
}
$arDBPrices = array();
$rsPrice = CPrice::GetList(array(), array("PRODUCT_ID" => $PRODUCT_ID));
while($ar = $rsPrice->Fetch())
$arDBPrices[$ar["CATALOG_GROUP_ID"].":".$ar["QUANTITY_FROM"].":".$ar["QUANTITY_TO"]] = $ar["ID"];
if(!is_array($arPrices))
$arPrices = array();
foreach($arPrices as $key=>$price)
{
if(!isset($price[GetMessage("IBLOCK_XML2_CURRENCY")]))
$price[GetMessage("IBLOCK_XML2_CURRENCY")] = $price["PRICE"]["CURRENCY"];
$arPrice = Array(
"PRODUCT_ID" => $PRODUCT_ID,
"CATALOG_GROUP_ID" => $price["PRICE"]["ID"],
"^PRICE" => $this->ToFloat($price[GetMessage("IBLOCK_XML2_PRICE_FOR_ONE")]),
"CURRENCY" => $this->CheckCurrency($price[GetMessage("IBLOCK_XML2_CURRENCY")]),
);
foreach($arDiscounts as $arDiscount)
{
$arPrice["QUANTITY_FROM"] = $arDiscount["QUANTITY_FROM"];
$arPrice["QUANTITY_TO"] = $arDiscount["QUANTITY_TO"];
if($arDiscount["PERCENT"] > 0)
$arPrice["PRICE"] = $arPrice["^PRICE"] - $arPrice["^PRICE"]/100*$arDiscount["PERCENT"];
else
$arPrice["PRICE"] = $arPrice["^PRICE"];
$id = $arPrice["CATALOG_GROUP_ID"].":".$arPrice["QUANTITY_FROM"].":".$arPrice["QUANTITY_TO"];
if(array_key_exists($id, $arDBPrices))
{
CPrice::Update($arDBPrices[$id], $arPrice);
unset($arDBPrices[$id]);
}
else
{
CPrice::Add($arPrice);
}
}
}
foreach($arDBPrices as $key=>$id)
CPrice::Delete($id);
} |
Вроде все понятно и логично, но на последних строчках:
foreach($arDBPrices as $key=>$id) CPrice::Delete($id); |
сразу появился вопрос "зачем?". Или может я не так все понял? Мы вытаскиваем все цены для товара из нашей базы, затем обрабатываем все цены, пришедшие из 1с, и, если находим совпадение типа цен, то обновляем ценовое предложение, а если нет, то создаем новое ценовое предложение. А затем удаляет все цены, которые не обновились из 1с. Или нет?