+7 495 008 8452 пн.-пт. 10:00 – 17:00
Если у вас возникли какие либо вопросы которые вы не смогли решить по нашим публикациям самостоятельно,
то ждем ваше обращение в нашей службе тех поддержки.


Импорт каталога из xml-файлов CML2.0 без прямого обмена с 1С 8.1

Частый вопрос в ТП "А как импортировать каталог товаров из файлов CommerceML 2.0, которые сформированы в 1С 8.1?". Стандартно каталог CommerceML 2.0 можно импортировать только с помощью механизма прямого обмена с 1С 8.1. В 1С каталог можно выгрузить не только на сайт, но и в отдельные файлы, которые бы многие хотели загружать на сайт отдельно, без 1С.

Для начала нужно сформировать файлы каталога в 1С:



В указанной папке будут сформированы файлы import.xml, offers.xml и создана папка с файлами import_files. Полученные файлы и папку заливаем в /upload/1c_catalog своей сайта.

Следующим шагом является написание скрипта, которые бы имитировал работу 1С, т.е. делал бы аналогичные запросы к странице /bitrix/admin/1c_exchange.php, на которой расположен стандартный компонент bitrix:catalog.1c.import.

1. Подключим ядро продукта, определим заголовок Content-type и сбросим шаг импорта, который хранится в сессии:

 <?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
header("Content-type:text/html; charset=windows-1251");
$_SESSION["BX_CML2_IMPORT"]["NS"]["STEP"]=0;
?>


Собственно, это весь php-код. Дальше немного HTML.
2. HTML и СSS "по вкусу", я сделал так:

<a  href="javascript:start('import.xml')">импорт import.xml</a>
<a href="javascript:start('offers.xml')">импорт offers.xml</a>
<a href="javascript:start('company.xml')"> импорт company.xml</a>
<a style='color:red;' href="javascript:reset()">обнулить шаг</a>
<a style='color:red;' href="javascript:status='stop'">остановить импорт</a><hr>
<div id='main' style='display:none;width:400;font-size:12;border:1px solid #ADC3D5; padding:5'>
<div id="log"></div>
<div align=right id="load"></div>
</div>
<div id="timer"></div> 


Получился простенький интерфейс:


Остальное пишем на javascript.
3. Объявим переменные и напишем функцию создания объекта XMLHttpRequest()(о великий AJAX).

var 
log=document.getElementById("log");
timer=document.getElementById("timer");
load=document.getElementById("load");
var zup_import=false;
//переменные таймера
m_second=0;
seconds=0;
minute=0;
//переменные импорта
i=1;
a='';
proccess=true;
status="continue";


function createHttpRequest() 

   {
   var httpRequest;
      if (window.XMLHttpRequest) 
      httpRequest = new XMLHttpRequest();  
      else if (window.ActiveXObject) {    
      try {
      httpRequest = new ActiveXObject('Msxml2.XMLHTTP');  
      } catch (e){}                                   
      try {                                           
      httpRequest = new ActiveXObject('Microsoft.XMLHTTP');
      } catch (e){}
      }
   return httpRequest;

}


4. Функция start(), в которой происходит обнуление переменных, запуск таймера и дёргается функция 1с_query():

function start(file)
      {
      document.getElementById("main").style.display='block';
      load.innerHTML="<b>Загрузка</b>...<img align='center'                 src='http://gifanimation.ru/images/ludi/17_3.gif' width='30'/>"
             i=1;
      a="";
      m_second=0;
        seconds=0;
      proccess=true;
      start_timer();
      timer.innerHTML="";
      if (file=="company.xml") {zup_import=true;}
      log.innerHTML="<b>Импорт "+file+"</b><hr>";
      query_1c(file)
      }

5. 1с_query() - функция, которая осуществляется запросы к странице /bitrix/admin/1c_exchange.php и обрабатывает ответы - в общем эмулирует действия 1С.

function query_1c(file)
      {
      var import_1c=createHttpRequest();
      if (zup_import==true)
      {
      r="/bitrix/admin/1c_intranet.php?type=catalog&mode=import&filename="+file;
      } else{r="/bitrix/admin/1c_exchange.php?type=catalog&mode=import&filename="+file;}
                     load.style.display="block";
            import_1c.open("GET", r, true);
      import_1c.onreadystatechange = function() 
            {
            a=log.innerHTML;
            if (import_1c.readyState == 4 && import_1c.status == 0)
                  {
                  error_text="<em>Ошибка в процессе выгрузки</em><div style='width:270;font-size:11;border:1px solid             black;background-color:#ADC3D5;padding:5'>Сервер упал и не вернул заголовков.</div>"
                     log.innerHTML=a+"Шаг "+i+": "+error_text;
                     load.style.display="none";
                     status="continue"
                     alert("Import is crashed!");
                  }
            
                  if (import_1c.readyState == 4 && import_1c.status == 200)  
                     {
                        if ((import_1c.responseText.substr(0,8 )!="progress")&&(import_1c.responseText.substr(0,7)!="success"))
                        {
                           error_text="<em>Ошибка в процессе выгрузки</em><div style='width:270;font-size:11;border:1px solid black;background-color:#ADC3D5;padding:5'>"+import_1c.responseText+"</div>"
                           log.innerHTML=a+"Шаг "+i+": "+error_text;
                           status="error";
                        }
                        else
                        {
                           n=import_1c.responseText.lastIndexOf('s')+1;
                           l=import_1c.responseText.length;
                           mess=import_1c.responseText.substr(n,l);
                           log.innerHTML=a+"Шаг "+i+": "+mess+" ("+seconds+" сек.)"+"<br>";
                           seconds=0;
                           load.style.display="none";
                           i++;
                        }
                        if ((import_1c.responseText.substr(0,7)=="success")||(status=="error")||(status=="stop"))
                        {
                           load.style.display="none";
                           status="continue"
                           proccess=false;
                           timer.innerHTML="<hr>Время выгрузки: <b>"+minute+" мин. "+m_second+" сек.</b>";
                        }
                        else 
                        { 
                           query_1c(file);
                        }
                     } 
                  
                  

            }; 
import_1c.send(null);
      }


6. Функция таймера и функция сброса шага импорта:

function start_timer()
      {
         if (m_second==60)
         {
         m_second=0;
         minute+=1;
         }
         if (proccess==true)
         {
         seconds+=1;
         m_second+=1;

         setTimeout("start_timer()",1000);
      }
      }
      
function reset()
            {
            var rest=createHttpRequest();
               q="bx_1c_import_lite.php";
               rest.open("GET", q, true);
               rest.onreadystatechange=function()
                        {
                        if (rest.readyState == 4 && rest.status == 200)  
                           alert("Шаг импорта обнулён!");
                        }
               
               rest.send(null);
               
            }      

В функции reset() осуществляется запрос к файлу bx_1c_import_lite.php, ваш скрипт может называться по-другому.
Внимание: весь код javascript нужно поместить в <script></script>

Ну и результат примерно такой:




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

Скачать скрипт можно тут:
http://dev.1c-bitrix.ru/upload/exampl...t_lite.zip

Пища для размышлений:
http://dev.1c-bitrix.ru/api_help/sale...otocol.php
http://dev.1c-bitrix.ru/api_help/sale...otocol.php


Внимание! Скрипт, который описывается в данной статье является обрезанной версией диагностического скрипта из статьи:

https://dev.1c-bitrix.ru/community/blogs/carter/2285.php

Рекомендуется использовать именно полную версию.

Назад в раздел

Подписаться на новые материалы раздела:












CAPTCHA