Если у вас возникли какие либо вопросы которые вы не смогли решить по нашим публикациям самостоятельно,
то ждем ваше обращение в нашей службе тех поддержки.
Импорт каталога из 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 и сбросим шаг импорта, который хранится в сессии:
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С.