Выгрузка наборов товаров из 1C

В Битриксе есть отличная функция, которая называется наборы товаров. Вот только до сих пор не была реализована выгрузка наборов из 1С. В этой статье мы попробуем это исправить.

Автор . Дата: 29.10.2014

В Битриксе есть отличная функция, которая называется наборы товаров. Вот только до сих пор не была реализована выгрузка наборов из 1С. Сейчас мы попробуем это исправить. Для начала найдем метод ImportProductSets класса CIBlockCMLImport и заменим его содержимое на:

    function ImportProductSets()
    {
        $result = true;

        if ($this->next_step["XML_ELEMENTS_PARENT"])
        {
            $rsParents = $this->_xml_file->GetList(
                array("ID" => "asc"),
                array("PARENT_ID" => $this->next_step["XML_ELEMENTS_PARENT"]),
                array("ID", "LEFT_MARGIN", "RIGHT_MARGIN")
            );
            while ($arParent = $rsParents->Fetch())
            {
                $arXMLElement = $this->_xml_file->GetAllChildrenArray($arParent);

                if (isset($arXMLElement[$this->mess["IBLOCK_XML2_ID"]]))
                {
                    $rsElement = CIBlockElement::GetList(
                        array(),
                        array("=XML_ID" => $arXMLElement[$this->mess["IBLOCK_XML2_ID"]], "IBLOCK_ID" => $this->next_step["IBLOCK_ID"]),
                        false, false,
                        array("ID", "IBLOCK_ID")
                    );

                    if ($arDBElement = $rsElement->Fetch())
                    {
                        CCatalogProductSet::deleteAllSetsByProduct($arDBElement["ID"], CCatalogProductSet::TYPE_GROUP);
                        if (isset($arXMLElement[$this->mess["IBLOCK_XML2_PRODUCT_SETS"]]))
                        {
                            $arFields = array(
                                "ITEM_ID" => $arDBElement["ID"],
                                "TYPE" => CCatalogProductSet::TYPE_GROUP,
                                "ITEMS" => array(),
                            );
                            foreach ($arXMLElement[$this->mess["IBLOCK_XML2_PRODUCT_SETS"]] as $xmlSet)
                            {
                                if ($this->GetElementByXML_ID($arDBElement["IBLOCK_ID"], $xmlSet[$this->mess["IBLOCK_XML2_VALUE"]]) > 0)
                                {
                                    $arFields["ITEMS"][] = array(
                                        "ITEM_ID" => $this->GetElementByXML_ID($arDBElement["IBLOCK_ID"], $xmlSet[$this->mess["IBLOCK_XML2_VALUE"]]),
                                        "SORT" => intval($xmlSet[$this->mess["IBLOCK_XML2_SORT"]]),
                                    );
                                }
                            }

                            if (!CCatalogProductSet::add($arFields))
                                $result = false;
                        }
                    }
                }
            }
        }

        return $result;
    }

Затем в файле /bitrix/components/bitrix/catalog.import.1c/component.php найдем следующие строки:

    elseif ($NS["STEP"] == 8)
    {
        $obCatalog = new CIBlockCMLImport;
        $obCatalog->Init($NS);
        $result = $obCatalog->DeactivateElement($arParams["ELEMENT_ACTION"], $start_time, $arParams["INTERVAL"]);

        $counter = 0;
        foreach ($result as $key=>$value)
        {
            $NS["DONE"][$key] += $value;
            $counter+=$value;
        }

        if (!$counter)
        {
            $strMessage = GetMessage("CC_BSC1_DEA_DONE");
            $NS["STEP"] = 9;
        }
        else
        {
            $strMessage = GetMessage("CC_BSC1_PROGRESS", array("#TOTAL#"=>$NS["DONE"]["ALL"],"#DONE#"=>$NS["DONE"]["NON"]));
        }
    }

и после них добавим:

    elseif ($NS["STEP"] == 9)
    {
        $obCatalog = new CIBlockCMLImport;
        $obCatalog->InitEx($NS, array(
            "files_dir" => $WORK_DIR_NAME,
            "use_crc" => $arParams["USE_CRC"],
            "preview" => $preview,
            "detail" => $detail,
            "use_offers" => $arParams["USE_OFFERS"],
            "force_offers" => $arParams["FORCE_OFFERS"],
            "use_iblock_type_id" => $arParams["USE_IBLOCK_TYPE_ID"],
            "translit_on_add" => $arParams["TRANSLIT_ON_ADD"],
            "translit_on_update" => $arParams["TRANSLIT_ON_UPDATE"],
            "translit_params" => $arTranslitParams,
            "skip_root_section" => $arParams["SKIP_ROOT_SECTION"],
        ));

        $obCatalog->ImportProductSets();
        echo "success\nImport Product Sets OK.";
        $NS["STEP"]++;
    }

Теперь мы имеем рабочую выгрузку наборов продуктов из 1С.