Задать вопрос
@redesupar

Как правильно импортировать подразделения в Энтерпрайзе через 1с?

Здравствуйте! Раньше был портал коробка старый стоял на 7.1 php и bitrixvm
Так уже получилось что решили сделать новый портал на Astre, его полностью настроили ошибок не выдает, стоит php 8.0
Вопрос у нас есть старый импорт, я все сделал по аналогии со старым порталом (доп поля, временная таблица и везде ID подставил нужные), вроде показывает что отработал, но ничего не добавляет, подскажите пожалуйста куда копать
Подозреваю что ошибка идёт от

$bs->Add($arFields);       
             $added++;


Сам код импорта такой
<?php
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
/*
 * Настройки
 */
require($_SERVER["DOCUMENT_ROOT"]."/1c_exchange/core/options.php");
/*
 * Функции
 */
require($_SERVER["DOCUMENT_ROOT"]."/1c_exchange/core/functions.php");

/*
 * получение файла, проверка на открытие
*/
$reader = new XMLReader();
$xmlfile = GetXML("sections",false);
/*echo "<pre>";
var_dump($xmlfile);
echo "</pre>";*/
if (!$reader->xml($xmlfile)){
    $error_text = date("d.m.Y H:i:s")." - Импорт сотрудников: полученный ответ от веб-сервиса не удалось открыть на чтение, как xml файл";
    hlb_import_log($error_text);
    die($error_text);
}
//очищаем таблицу от предыдущих данных
$sql_delete_request = "DELETE FR OM b_dl_import_company";

        /*  todo заранее создать
         * перебор файла - сохраняем во временную таблицу b_dl_import_company
         * CRE ATE   TABLE b_dl_import_company

         (
             `ID` INT NOT NULL AUTO_INCREMENT,
             `INDEX` VARCHAR(200),
             `DELETE` VARCHAR(10),
             `NAME` VARCHAR(255),
             `XML_ID` VARCHAR(255),
             `HEAD` VARCHAR(255),
             `DEPTH_LEVEL` int,
             `PARENT_SECTION` VARCHAR(255),
        PRIMARY KEY(`ID`)
         );
         */
        //новый импорт - очищаем текущую временную таблицу
        global $DB;

        $DB->Query($sql_delete_request);

        //чтение ответа веб сервиса
        while ($reader->read()):
            if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'm:object'){
                $data = new XMLReader();
                 $data->xml($reader->readOuterXML());
                 $Fields = array();
                 while($data->read()){
                     switch ($data->name){
                         case "m:name": $v = $data->readInnerXML(); if(strlen($v)>0 && !isset($Fields["NAME"]))$Fields["NAME"] = $v;  break; //внешний код
                         case "m:loginAD": $v = $data->readInnerXML(); if(strlen(trim($v))>0)$Fields["HEAD"] = trim($v);  break; //внешний код
                         case "m:level": $v = $data->readInnerXML(); if(strlen($v)>0)$Fields["DEPTH_LEVEL"] = $v;  break; //внешний код
                         case "m:subdivisioncode": $v = $data->readInnerXML(); if(strlen($v)>0)$Fields["CODE"] = $v;  break; //внешний код

                     }

                     if ($data->nodeType == XMLReader::ELEMENT && $data->name == 'm:objectID'){
                         $dataID = new XMLReader();
                         $dataID->xml($data->readOuterXML());
                         while($dataID->read()){
                             switch ($dataID->name){
                                  case "m:id": $v = $dataID->readInnerXML(); if(strlen($v)>0 && !isset($Fields["XML_ID"]))$Fields["XML_ID"] = $v;  break; //внешний код
                      }
                         }
                     }
                }
            }
            if($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'm:parentID'){
                $dataParentID = new XMLReader();
                $dataParentID->xml($reader->readOuterXML());
                while($dataParentID->read()){
                    switch ($dataParentID->name){
                        case "m:id": $v = $dataParentID->readInnerXML(); if(strlen($v)>0)$Fields["PARENT_SECTION"] = $v;  break; //внешний код
                    }
                }
                $sql_request = "INS ERT INTO `b_dl_import_company` (`INDEX`,`NAME`,`XML_ID`,`HEAD`,`DEPTH_LEVEL`,`PARENT_SECTION`) VALUES('{$Fields["CODE"]}','{$Fields["NAME"]}','{$Fields["XML_ID"]}','{$Fields["HEAD"]}',{$Fields["DEPTH_LEVEL"]},'{$Fields["PARENT_SECTION"]}')";
                $res = $DB->Query($sql_request);
        }
        endwhile;

        /*
         * запрос из временной таблицы с сортировкой по уровню вложенности и  сортировкой по ид + ограничением из настроек
         */
        $sel ect = "SELE CT *
                FR OM `b_dl_import_company`
                WH ERE  `DEPTH_LEVEL`>0
                ORDER BY `DEPTH_LEVEL` ASC, `id` ASC";
        $res = $DB->Query($select);
        /*
         * цикл по результату запроса
          */
        $XML_ID_UPDATE = array();
        while($ar = $res->Fetch()){

            /*  todo или всегда полная выгрузка?
            * Пометка на удаление? - находим и удаляем
            */

                 $bs = new CIBlockSection;
                 /*
                  * сбор информации по подразделению
                  */
                $head_id = 0;
                 if(strlen($ar["HEAD"])>0){
                     $filter = Array("LOGIN_EQUAL"=> $ar["HEAD"]);
                     $reshead = CUser::GetList(($by="id"), ($order="desc"), $filter, array("SELECT"=>array("UF_*"), "FIELDS"=>array("ID","LOGIN")));
                     while($arhead = $reshead->fetch()){
                         if($arhead["LOGIN"]==$ar["HEAD"])
                             $head_id = $arhead["ID"];
                     }
                 }

 
            $arFields = Array(
               "ACTIVE" => "Y",
               "XML_ID" => $ar["XML_ID"],
               "CODE" => $ar["INDEX"],
               "IBLOCK_ID" => 3,
               "NAME" => $ar["NAME"],
               );
                if($head_id>0) {

                    $arFields["UF_HEAD"] = (int)$head_id;
                }else{
                    $arFields["UF_HEAD"] = '';
                }
                if($ar["DEPTH_LEVEL"]>0){

                    $arFields["IBLOCK_SECTION_ID"] = CIBlockSection::GetList(array(), array("IBLOCK_ID"=>3,"XML_ID"=>$ar["PARENT_SECTION"]), false, array("ID"))->Fetch()["ID"];
                    if(is_null($arFields["IBLOCK_SECTION_ID"]));
                }
                $XML_ID_UPDATE[] = $ar["XML_ID"];
                $resSectionFind = CIBlockSection::GetList(Array(), array("IBLOCK_ID"=>3,"XML_ID"=>$ar["XML_ID"]), Array("nPageSize"=>1), array("ID"));

         
                if($arSectionFind = $resSectionFind->Fetch()){
                     //обновляем
                     $bs->Update($arSectionFind["ID"], $arFields);
                    $updated++;

                }else{
                    //создаем
                    $bs->Add($arFields);
                    $added++;

                }


        }
       //удаление
        if(!empty($XML_ID_UPDATE)){
            $resSectionDel = CIBlockSection::GetList(Array(), array("IBLOCK_ID"=>3,">DEPTH_LEVEL"=>1, "!XML_ID"=>$XML_ID_UPDATE), false, array("ID"));
            while ($arDel = $resSectionDel->Fetch()){
                $deleted++;
                CIBlockSection::Delete($arDel["ID"]);
            }
        }

/*
 * Логируем успешное выполнение
 */
$result = array(
    "Выполшнение" => "Успешно",
    "Обработано подразделений"=>  ($deleted+$updated+$added),
    "Удалено" => $deleted,
    "Обновлено" => $updated,
    "Добавлено" => $added,
);
hlb_import_log($result,"ok");
 /*
  * Очищаем таблицу b_dl_import_company, возвращаем success
  */
//$DB->Query($sql_delete_request);
die("success");
  • Вопрос задан
  • 52 просмотра
Подписаться 1 Простой 3 комментария
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы