Ковырял выгрузку, дошел до файлика /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с. Или нет?