Дополнительные поля при обмене 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'
        );
      }
 
    }
  }
}