Содержание
Дополнительные поля при обмене 1С с Битрикс
Иногда в выгрузку необходимо добавить собственные поля для товаров, например, рекомендуемую оптовую цену (РОЦ) в процентах. Для заполнения нового свойства PROPERTY_ROC
из выгрузки необходимо сделать следующее.
Исправить скрипт выгрузки
Нужно создать свой компонент импорта копированием штатного catalog.import.1c
, затем доработать его (третья строчка):
- catalog.import.1c/component.php
$strMessage = GetMessage("CC_BSC1_DEA_DONE"); $NS["STEP"] = 9; if(isset($_GET["filename"]) && $_GET["filename"] == 'offers.xml') { CustomBehaviour::updateROC(); }
Таким образом, на последнем шаге импорта выгрузки Битрикса запускается дополнительный обработчик.
Создать собственный обработчик
Этот обработчик будет использовать таблицу b_xml_tree
как «разложенный» файл импорта (возможно использовать и исходный файл):
- CustomBehaviour.php
define('SHOP_ITEMS_ID', 10); // код инфоблока class CustomBehaviour { public static function updateROC() { global $DB; $query = "SELECT `VALUE` FROM `b_xml_tree` WHERE `DEPTH_LEVEL` = 2 AND `NAME` = 'Наименование'"; $results = $DB->Query($query); $val = $results->Fetch(); if($val['VALUE'] != 'Пакет предложений') return; $query = "SELECT code.VALUE AS `CODE`, value.VALUE AS `ROC` FROM `b_xml_tree` AS `item` JOIN `b_xml_tree` AS `value` ON ( value.LEFT_MARGIN BETWEEN item.LEFT_MARGIN AND item.RIGHT_MARGIN AND value.DEPTH_LEVEL = 6 AND value.NAME = 'РОЦ') JOIN `b_xml_tree` AS `code` ON ( code.LEFT_MARGIN BETWEEN item.LEFT_MARGIN AND item.RIGHT_MARGIN AND code.DEPTH_LEVEL = 4 AND code.NAME = 'Ид') WHERE item.DEPTH_LEVEL = 3 AND item.NAME = 'Предложение'"; $results = $DB->Query($query); $val = $results->Fetch(); if($results->SelectedRowsCount() == 0) return; if(!CModule::IncludeModule("iblock")) return; $arSort = array("SORT" => "ASC"); $arSelect = array("ID", "CODE", "NAME"); $arFilter = array("IBLOCK_ID" => SHOP_ITEMS_ID); while($xmlItem = $results->Fetch()) { $arFilter['XML_ID'] = $xmlItem['CODE']; $itemsList = CIBlockElement::GetList($arSort, $arFilter, false, false, $arSelect); if ($itemsList->SelectedRowsCount() > 0) { $item = $itemsList->Fetch(); CIBlockElement::SetPropertyValues( $item['ID'], SHOP_ITEMS_ID, $xmlItem['ROC'], 'ROC' ); } } } }