Содержание:
1. XML – расширяемый язык разметки
2. Устранение Ошибки разбора XML в 1С
3. «Обход» Ошибки разбора XML в 1С
1. XML – расширяемый язык разметки
В данной статье речь пойдёт о причинах возникновения фатальной ошибки «Ошибка разбора XML» и способах устранения данной неполадки. Также будет дана инструкция не по устранению, но «обходу» ошибки, то есть действиям на опережение.
XML (с английского – extensible markup language – расширяемый язык разметки) – это язык разметки, который рекомендует Консорциум Всемирной паутины. Обычно язык разметки XML служит для описания документации, соответствующего типа, а также описывает действия соответствующих процессоров. Расширяемый язык разметки имеет довольно простой синтаксис, поэтому используется по всему миру, чтобы создавать и обрабатывать документацию программным способом. Он создавался именно для использования в Интернете. XML назвали именно расширяемым языком разметки, так как в нём нет фиксации разметки, которая содержится внутри документа, а именно: программист может создавать любую разметку, а ограничения будут встречаться лишь в синтаксисе.
2. Устранение Ошибки разбора XML в 1С
«Ошибка разбора XML» возникает исключительно в тонком клиенте 1С. Также стоит отметить, что «Ошибка разбора XML» также довольна схожа с ошибкой по формату потока, которая возникает в толстом клиенте. Обычно в 1С «Ошибка разбора XML» возникает по причине наличия кэша метаданных. И если очистить кэш, то ошибка будет устранена. Выглядит окно с ошибкой, а также окно с комментариями от технической поддержки следующим образом:
Рис. 1 Окно Ошибки разбора XML в 1С
XML данные читаются по потокам, так что в каждый из моментов времени объект «сосредоточен» в некотором узле XML. Из-за этого также может возникать фатальная ошибка «Ошибка разбора XML». Для того чтобы её устранить, можно вызвать функцию «ИсключениеЧтенияXml», как показано на скриншоте примера ниже:
Рис. 2 Вызов функции ИсключениеЧтенияXML для устранения Ошибки разбора XML в 1С
3. «Обход» Ошибки разбора XML в 1С
Данные два способа (очистка кэша метаданных и функция «ИсключениеЧтенияXml») – не все возможные варианты устранения ошибки разбора XML. Далее рассмотрим нестандартный подход, который позволит избежать ошибки еще до её возникновения.
Для наглядности будем работать в конфигурации 1С:Бухгалтерия предприятия, одной из наиболее распространенных программ фирмы 1С. У многих людей, которые пользуются программой 1С:Отчётность появляются неполадки при попытках открыть данные/файлы от налоговой. Чтобы открыть такой файл повторяем следующие действия:
· Переходим по пути: «Настройки 1С:Отчётности → Журнал обмена с контролирующими органами», как показано на скриншоте ниже:
Рис. 3 Настройка 1С Отчетности
· Далее кликаем на «Запросы» и выделяем ту выписку, которую не было возможности открыть из-за ошибки, как продемонстрировано на скриншоте ниже:
Рис. 4 Выбор выписки с Ошибкой разбора XML в 1С
· Обращаем внимание на стадию отправки, которая располагается внизу этого сообщения, и кликаем два раза на зелёный круг:
Рис. 5 Стадия отправки документа с Ошибкой разбора XML в 1С
· Появляется транспортное сообщение, в нём кликаем на «Выгрузить» и выбираем папку, куда необходимо провести выгрузку, после чего сохраняем данный файл. Пробуем открыть его, при помощи любого из графических редакторов, который может поддерживать формат PDF, как показано на скриншоте ниже:
Рис. 6 Результат обхода Ошибки разбора XML в 1С
· Всё успешно открылось, а ошибка даже не успела возникнуть.
Специалист компании «Кодерлайн»
Айдар Фархутдинов
|
Александр Денисюк
Администратор Сообщений: 4916 |
#101 0 29.06.2015 12:48:45
Наверн какой то справочник без указанных выгружаемых полей. |
||
|
Администратор Сообщений: 4916 |
#102 0 29.06.2015 12:52:06 На нашем сайте: http://1c.1c-bitrix.ru/ecommerce/download.php Появились новые версии модулей: Появились модули обмена версии 5.0.0.2 для модулей Казахстана(УТП 20, УПП 1.3 и УТ 3.0) и Беларуси(УТ 2.0 и УТ 3.1). |
|
Пользователь 206084 Заглянувший Сообщений: 9 |
#103 0 29.06.2015 14:11:49 А какие справочники выгружаются? Как посмотреть? |
|
Пользователь 206084 Заглянувший Сообщений: 9 |
#104 0 29.06.2015 15:30:59 Где указываются выгружаемые поля? |
|
Александр Денисюк
Администратор Сообщений: 4916 |
#105 0 29.06.2015 15:34:33
Там в настройках обмена с сайтом на форме настроек пользовательских справочников. |
||
|
Пользователь 346457 Заглянувший Сообщений: 16 |
#106 0 30.06.2015 07:14:06
Добрый день Денис, а какие изменения относительно предыдущей версии? |
||
|
Александр Денисюк
Администратор Сообщений: 4916 |
#107 0 30.06.2015 13:29:48
Очень много изменений.. |
||
|
Пользователь 346457 Заглянувший Сообщений: 16 |
#108 0 30.06.2015 14:33:52 Александр, есть ли в планах строить пользовательское дерево для выгрузки в битрикс на основании видов номенклатур, а не групп? |
|
Александр Денисюк
Администратор Сообщений: 4916 |
#109 0 30.06.2015 17:46:54
нет |
||
|
Пользователь 361545 Заглянувший Сообщений: 3 |
#110 0 20.07.2015 11:05:17 Всем доброго времени суток! 1С:Предприятие 8.3 «1С: Бухгалтерия предприятия», редакция 3.0 (2.76 Мб) З.Ы. С 1С вообще ранее не работал, но в связи с ситуацией пришлось… |
|
Александр Денисюк
Администратор Сообщений: 4916 |
#111 0 20.07.2015 11:59:31
Модуль только для последних версий бухгалтерии 3.0 редакции. |
||
|
Пользователь 361545 Заглянувший Сообщений: 3 |
#112 0 20.07.2015 12:11:26
Заранее извиняюсь за может быть глупый вопрос, а для редакции 2.0 нет ли модуля? )))) |
||||
|
Александр Денисюк
Администратор Сообщений: 4916 |
#113 0 20.07.2015 12:30:00
нет. И скорее всего не будет. |
||||||
|
Пользователь 361545 Заглянувший Сообщений: 3 |
#114 0 20.07.2015 12:44:10
Спасибо за понимание и быстрое реагирование!!! |
||||||||
|
Пользователь 368626 Заглянувший Сообщений: 6 |
#115 0 09.08.2015 16:50:36 Добрый день. Использую версию 5.0.0.3_UT10.3.32.2 09.08.2015 16:28:11—Завершение выгрузки пакета с общей информацией каталога: Товары Подскажите в каком направлении копать ? Может ли это быть как то связано с нехваткой прав , у пользователя который осуществляет обмен. И какие права для этого необходимы. Ранее все работало без этой проблемы. Количество товаров не изменилось. Заранее спасибо за любой ответ. |
|
Александр Денисюк
Администратор Сообщений: 4916 |
#116 0 10.08.2015 11:13:32
А количество свойств? Вообще, если бы были проблемы с правами, то, по идеи, должна была бы вылезть ошибка.. |
||
|
Пользователь 368626 Заглянувший Сообщений: 6 |
#117 0 10.08.2015 15:03:46 Изначально количество свойств было 4 , потом убрал их вообще. Проблема все еще актуальна. |
|
Пользователь 90197 Эксперт Сообщений: 739 |
#118 0 11.10.2015 09:40:50 Здравствуйте. Вопрос №2. Вопрос№3 |
|
Александр Денисюк
Администратор Сообщений: 4916 |
#119 0 12.10.2015 09:37:39
Ошибка в модуле. Для Украины, пока, версии модулей нужно на сайте.
Появится скорее всего у версии 5.0.0.5 для УТ Украины 2.3
В настройке обмена, где загружаются заказы? Вы настраивали расписание для фонового задания реального времени(там нужно указать дату и время начала/завершения работы фонового задания)? |
||||||
|
Пользователь 90197 Эксперт Сообщений: 739 |
#120 0 12.10.2015 10:21:23
Когда планируется?
Первый раз слышу что в настройках регламентных заданий нужно дату начала и дату окончания ставить? У меня даже на прошлом автообмене это не стояло. Просто два параметра: Повторять каждый день на вкладке общие, и дневное повторять через n секунд. Мой модуль Битрикс: Мультиязычность — инфоблоки на разных языках https://proger.com.ua/~ao9ln |
||||
|
Александр Денисюк
Администратор Сообщений: 4916 |
#121 0 12.10.2015 10:55:29
В регламентном задании для реал тайм обмена желательно, но вродь не обязательно. |
||
|
Пользователь 90197 Эксперт Сообщений: 739 |
#122 0 12.10.2015 11:03:24
И это верный ответ! Мой модуль Битрикс: Мультиязычность — инфоблоки на разных языках https://proger.com.ua/~ao9ln |
||
|
Пользователь 90197 Эксперт Сообщений: 739 |
#123 0 23.10.2015 02:50:12 Чаще всего на сайт выгружаем цены и остатки товаров. Сами же товары не меняются (изображения,описания). В новом модуле вижу что можно выгружать только цены и остатки. Будет ли при этом сбрасываться кеш? |
|
Пользователь 256719 Заглянувший Сообщений: 1 |
#124 0 27.10.2015 13:42:55 Подскажите пожалуйста, как посмотреть какая версия модуля обмена установлена в 1С? |
|
Пользователь 162014 Заглянувший Сообщений: 7 |
#125 0 16.11.2015 19:33:09 ут10.3.34.1 |
Нельзя просто взять и интегрировать сайт с 1С. (с) Народное творчество.
Цель написания поста – изложить всю информацию по теме человеческим языком.
Интеграция сайта на 1С-Битрикс: Управление сайтом и 1С — неисчерпаемый источник вопросов и проблем. На сайте идей для Битрикс в соответствующем разделе 16 страниц, на форуме про это больше 23 000 сообщений. В форме обращения в техподдержку Битрикса есть даже отдельный тип заявки «Обмен с 1С».
Считается, что интеграция 1С и сайта на Битриксе должна работать из коробки. Самые простые функции действительно можно запустить за час-два. А вот на доработку обмена можно потратить и 10, и 100 часов.
Доработка обмена сайта и 1С — это уже магия уровня «эксперт», пугает даже бородатого опытного разработчика. В этой статье мы поговорим о том, как происходит обмен данными между этими двумя монстрами и как можно расширять возможности этого обмена. Статья содержит множество технических деталей обмена и будет полезна в основном программистам, которые хотят разобраться в предмете.
В данной статье будет рассмотрена общая теория обмена между двумя IT-системами и два стандартных обмена между 1С и сайтом на 1С-Битрикс: обмен товарами и обмен справочниками.

Немного теории
Интеграция — обмен информацией между двумя IT-системами. Иногда называют просто обмен. Определяется форматом данных, протоколом (стандартом) передачи данных, алгоритмом работы
Формат = как выглядят данные (например, XML, YML, JSON, CSV).
Протокол = как данные оказываются в другом месте (например, HTTP, SIP, SMTP, FTP).
Алгоритм = что при этом происходит. Представляется блок-схемой или диаграммой UML Activity.
Примеры интеграций:
-
обмен товарами между самописной учетной системой и сайтом (протокол FTP, формат CSV);
-
парсинг курсов валюты с сайта ЦБ РФ (протокол HTTP, формат XML);
-
интеграция сайта с Яндекс.Маркет (протокол HTTP, формат YML).
Процедуру обмена можно разделить на 3 части:
-
Экспорт данных из системы А в требуемый формат
-
Передача данных
-
Импорт данных требуемого формата в систему Б.
Часто весь обмен называют «импорт» («загрузка») и «экспорт» («выгрузка»). Это не ошибка, по такой формулировкой говорящий показывает, точка зрения какой системы ему ближе. То, что для 1С экспорт товаров, для Битрикса импорт. В дальнейшем тексте статьи мы не будем использовать эти понятия, чтобы не порождать двусмысленности.
И еще одно важное уточнение. «1С» — в зависимости от контекста, это может быть компания-легенда «ООО 1С», их разработка «1С:Предприятие» или конкретная конфигурация (например, «1С: Управление торговлей» или «1С:ERP Управление предприятием») с установленным модулем обмена с сайтом . В мире веб-разработки имеется в виду как раз последнее определение. В статье будет действовать аналогичное соглашение. Так же и с сайтом на платформе 1С-Битрикс: Управление сайтом — обычно это просто «Битрикс».
Резюме
Интеграция — обмен данными между двумя системами.
Формат — как выглядят данные.
Протокол — как передаются данные.
1С — софт.
Битрикс — сайт.
Краткость — сестра.
Стандартные возможности обмена 1С и Битрикса
«Из коробки» (без доработок программиста) работают 4 типа обмена:
-
товары из 1С на сайт (тип «catalog»);
-
справочники из 1С на сайт (тип «reference»);
-
пользователей/контрагентов из 1С на сайт (тип «sale»);
-
заказы (тип «sale»):
-
из 1С на сайт;
-
из сайта в 1С.
-
Протокол
Все взаимодействия между 1С и Битриксом проводятся по HTTP, синхронно. Т.о. 1С подобна браузеру, она «открывает» специальную страницу, отправляет данные (методами POST и GET) и получает текстовый ответ. Есть даже способ имитировать выгрузку из 1С браузером (и мы часто используем этот трюк во время разработки и отладки). Подробнее про отладку мы рассказали в предыдущей статье «Типовые ошибки интеграции между 1С и 1С-Битрикс».
В терминах сетевых взаимодействий 1С — клиент, а сайт — сервер. Обращения всегда инициируются на стороне 1С. В 1С есть настройки адреса сайта, сайт про 1С не знает ничего.
Протокол синхронный. 1С отправляет следующий запрос на сайт только после получения ответа на предыдущий (или получения ошибки таймаута).
Формат
Данные передаются в двух форматах.
Первый формат — текстовый для ответов сайта на запросы из 1С. Сайт выводит в первой строке ответа «success», если завершил некую процедуру, «progress», если продолжает ее выполнять и «error» или «failure», если была ошибка. В последующих строках могут быть дополнительные данные (зависит от каждого конкретного запроса).
Второй формат — CommerceML 2 . Основан на XML, в этом формате передаются товары, предложения, цены, склады, заказы и контрагенты (пользователи+платежные профили).
Алгоритм
Подготовка к обмену
Выше мы уже сказали, что протокол обмена — синхронный HTTP. Все перечисленные типы обмена подразумевают выполнение нескольких запросов (шагов обмена) друг за другом. Первые два шага одинаковы для любого типа обмена, различия начинаются дальше
Авторизация
|
Запрос |
|
|
GET-параметры: |
type=<тип обмена> |
|
mode=checkauth |
|
|
Basic access логин: |
Логин сайта из настроек 1С |
|
Basic access пароль: |
Пароль сайта из настроек 1С |
|
Ответ |
|
|
Если успех: |
success <имя Cookie авторизации> <значение Cookie авторизации> sessid=<ID сессии> <параметр1>=<значение1> <параметр2>=<значение2> … |
|
Если ошибка: |
failure <текст ошибки> |
Любой обмен начинается с авторизации 1С на сайте методом Basic access. В случае успеха сайт выводит «success», имя и значение Cookie (которую будет проверять во всех последующих запросах), id сессии и прочие параметры (зависят от type — типа обмена).
Возможные ошибки
|
Текст ошибки |
Что делать |
|
Ошибка авторизации. Неверное имя пользователя или пароль. |
Проверить логин и пароль в Битрикс |
|
У Вас нет прав для импорта каталога. Проверьте настройки компонента импорта. |
Проверить права пользователя в Битрикс |
|
Ошибка проверки источника запроса. Обновите модуль обмена или отключите проверку в настройках компонента |
Обновить модуль обмена в 1С или выполнить php-код на сайте: COption::SetOptionString(«catalog», «DEFAULT_SKIP_SOURCE_CHECK», «Y»); COption::SetOptionString(«sale», «secure_1c_exchange», «N»); |
|
Модуль Информационных блоков не установлен. |
Проверить модуль iblock в Битрикс. Должен быть скачан и установлен |
|
Включена смена идентификатора сессий. В файле подключения компонента обмена, до подключения пролога определите константу BX_SESSION_ID_CHANGE: define(‘BX_SESSION_ID_CHANGE’, false); |
Выполнить предложенное действие |
|
Время на сервере базы данных отличается от времени на веб-сервере больше, чем на 10 минут. Вероятно неправильно настроены временные зоны. Выполните настройку и повторите обмен. |
Проверить настройку часовых поясов на веб-сервере и на сервере БД |
Запрос настроек сайта
|
Запрос |
|
|
GET-параметры: |
type=<тип обмена> |
|
mode=init |
|
|
sessid=<ID сессии> |
|
|
Cookie: |
<имя Cookie авторизации>=<значение Cookie авторизации> |
|
Ответ |
|
|
Если успех: |
zip=<yes|no> file_limit=<число> |
На этом шаге 1С узнает важные для обмена настройки сайта. Управление этими параметрами на сайте происходит на странице «Интеграция с 1С» в панели управления сайтом.

|
Параметр |
Назначение |
Возможные значения |
|
zip |
Сайт умеет распаковывать zip-архивы. Если yes — 1С будет загружать файлы обмена в архивах, что сильно экономит время и трафик. |
yes no |
|
file_limit |
Максимально допустимый размер файла в байтах для передачи за один HTTP-запрос. Если системе 1С понадобится передать файл большего размера, они будут разбиты на несколько частей. |
целое число >= 0 |
Получив эти параметры, 1С начинает формирование данных для передачи на сайт. Если «zip=yes», то все файлы будут переданы как zip-архив. Иначе каждый выгружается по отдельности. Желательно включать всегда.
Возможные ошибки
|
Текст ошибки |
Что делать |
|
Ошибка инициализации временного каталога |
При создании каталога для хранения файлов выгрузки произошла ошибка. Проверить права и путь для хранения файлов или закончилось место на диске. По умолчанию сайт складывает файлы в папку /upload/1c_catalog/. |
Обмен товарами (1С -> Битрикс)
Данный тип обмена (type=catalog) используется для создания и обновления на сайте следующих сущностей:
-
инфоблок товаров;
-
UF-поля разделов в этом инфоблоке;
-
свойства элементов в этом инфоблоке;
-
инфоблок SKU;
-
типы цен;
-
склады;
-
разделы в инфоблоке товаров;
-
элементы в инфоблоке товаров (товары);
-
цены товаров;
-
наличие товаров по складам.
При обмене товарами 1С формирует XML-файлы, передает их на сайт и контролирует их обработку сайтом. 1С может передать 4 вида файлов:
В файлах с префиксом import_ — разделы каталога, товары, свойства товаров.
В файлах с префиксом offers_ — SKU.
В файлах с префиксом prices_ — цены товаров и предложений.
В файлах с префиксом rests_ — остатки товаров и предложений по складам.
На шаге авторизации в случае успеха сервер вернет дополнительный параметр timestamp (текущее время). 1С сохранит timestamp и передаст на сайт на последнем шаге обмена товарами.

Шаг 1. Передача файла (повторяющийся)
|
Запрос |
|
|
GET-параметры: |
type=catalog |
|
mode=file |
|
|
sessid=<ID сессии> |
|
|
filename=<имя файла> |
|
|
POST: |
Содержимое файла в виде строки |
|
Cookie: |
<имя Cookie>=<значение Cookie> |
|
Ответ |
|
|
Если успех: |
success |
|
Если ошибка: |
failure <текст ошибки> |
Шаг может выполняется несколько раз. Каждый файл выгружается частями не более file_limit байт (см. предыдущий шаг) в бинарном виде через сырой POST-запрос. Сайт создает файл, если его нет. Имя файла берет из GET-параметра filename и дописывает в него переданный контент. Так продолжается до тех пор, пока 1С не передаст все части этого файла.
Возможные ошибки
|
Текст ошибки |
Что делать |
|
Ошибка чтения HTTP данных |
Проверить сетевое соединение между сайтом и 1С. |
|
Ошибка открытия файла <имя файла> для записи |
Проверить права на файл и папку файла у пользователя apache, под которым работает Битрикс. |
|
Ошибка записи в файл <имя файла> |
Проверить права на файл и папку файла у пользователя apache, под которым работает Битрикс. |
Шаг 2. Основной
|
Запрос |
|
|
GET-параметры: |
type=<тип обмена> |
|
mode=import |
|
|
sessid=<ID сессии> |
|
|
filename=<имя файла> |
|
|
Cookie: |
<имя Cookie>=<значение Cookie> |
|
Ответ |
|
|
Если импорт завершен: |
success |
|
Если импорт продолжается: |
progress <текущий статус> |
|
Если ошибка: |
failure <текст ошибки> |
Этот шаг — особенный. Файл уже целиком загружен на сайт и Битрикс готов его обработать. Его обработка может состоять из 11 более мелких операций, о которых 1С ничего не знает. Поэтому в параметре GET приходит mode=import (один и тот же запрос!), но сайт выполняет совершенно разные операции. Текущий прогресс Битрикс сохраняет в сессии в переменной $_SESSION[BX_CML2_IMPORT][NS]. Например, узел STEP в этом массиве отвечает как раз за номер внутренней операции импорта.
Шаг 2.1 Распаковка архива (повторяющийся, необязательный)
|
Ответ |
|
|
Если файл распакован: |
progress Идет распаковка архива |
|
Если файл распаковывается: |
progress Распаковка архива завершена |
|
Если ошибка: |
failure <текст ошибки> |
Шаг исполняется, только если 1С передала файл в формате ZIP. Распаковка происходит в той же директории, где лежат все файлы обмена товарами (по умолчанию — /upload/1c_catalog/). Эта операция не нумеруется внутри Битрикса (значение STEP в сессии не изменяется).
Возможные ошибки
|
Текст ошибки |
Что делать |
|
Ошибка распаковки архива |
Проверьте работоспособность функции PHP zip_open и расширение Zip . Если все корректно — скачайте архив с сайта и проверьте его корректность вручную. |
Шаг 2.2 Удаление временных таблиц
|
Ответ |
|
|
Если успех: |
progress Временные таблицы удалены |
|
Сессия ($_SESSION[BX_CML2_IMPORT][NS]) |
|
|
STEP |
0 |
Работать напрямую с файлом XML (тем более, если он большой) неудобно и неэффективно. Поэтому все данные прочитываются во временную таблицу b_xml_tree. На этом подготовительном шаге таблица b_xml_tree, если она существует, удаляется.
Шаг 2.3 Создание временных таблиц
|
Ответ |
|
|
Если успех: |
progress Временные таблицы созданы |
|
Сессия ($_SESSION[BX_CML2_IMPORT][NS]) |
|
|
STEP |
1 |
Таблица b_xml_tree создается. Если объявлена PHP константа BX_XML_CREATE_INDEXES_IMMEDIATELY, таблица сразу же индексируется. В конце этого шага Битрикс испускает событие OnBeforeCatalogImport1C .
Возможные ошибки
|
Текст ошибки |
Что делать |
|
Ошибка создания временных таблиц |
Проверить права и подключение СУБД. |
Шаг 2.4 Загрузка файла во временную таблицу (повторяющийся)
|
Ответ |
|
|
Если файл читается: |
progress Обработано <число>% файла |
|
Если файл прочитан: |
progress Файл импорта прочитан |
|
Если ошибка: |
failure <текст ошибки> |
|
Сессия ($_SESSION[BX_CML2_IMPORT][NS]) |
|
|
STEP |
2 |
Битрикс шаг за шагом начинает читать переданный из 1С файл, добавляя записи в таблицу b_xml_tree. Чтобы избежать проблем с временем исполнения, процесс происходит пошагово. Управление продолжительностью шага происходит на странице «Интеграция с 1С» в панели управления сайтом.
![]()
Возможные ошибки
|
Текст ошибки |
Что делать |
|
Ошибка открытия файла импорта |
Проверить доступ к файлу |
Шаг 2.5 Индексация временных таблиц
|
Ответ |
|
|
Если успех: |
progress Временные таблицы проиндексированы |
|
Если ошибка: |
failure <текст ошибки> |
|
Сессия ($_SESSION[BX_CML2_IMPORT][NS]) |
|
|
STEP |
3 |
Для повышения скорости работы импорта таблица b_xml_tree индексируется после прочтения файла.
Возможные ошибки
|
Текст ошибки |
Что делать |
|
Ошибка создания индекса для временных таблиц |
Возможная причина: проблемы с СУБД, правами в ней или подключением. |
Шаг 2.6 Импорт метаданных
|
Ответ |
|
|
Если успех: |
progress Метаданные импортированы успешно |
|
Если ошибка: |
failure Ошибка импорта метаданных <текст ошибки> |
|
Сессия ($_SESSION[BX_CML2_IMPORT][NS]) |
|
|
STEP |
4 |
На этом шаге создаются или обновляются следующие данные:
-
Инфоблоки товаров и SKU
-
Служебные свойства каталога (с префиксом CML2_: CML2_BAR_CODE, CML2_ARTICLE, CML2_ATTRIBUTES…)
-
Торговый каталог
-
Свойства инфоблоков
-
UF-поля разделов инфоблоков
-
Типы цен
-
Склады
-
Единицы измерения
Важно: никакие сущности при импорте метаданных не удаляются. Случайно выгруженный из 1С склад или тип цены остается на сайте, пока администратор не удалит его вручную.
Возможные ошибки
|
Текст ошибки |
Что делать |
|
Отсутствует модуль «Торговый каталог». Импорт торговых предложений и цен невозможен |
Пояснения не требуются |
|
Ошибка создания типа информационных блоков |
После этого сообщения следует текст ошибки API, который пояснит причину ошибки. |
|
Ошибка добавления новой единицы измерения (код единицы: <код>) |
Текст ошибки Битрикс не выведет, необходимо разобрать XML файл самостоятельно и найти причину ошибки. |
|
Количество импортированных складов превышает разрешенное для данной редакции |
Пояснения не требуются |
|
Ошибка импорта пользовательского свойства (xml_id: <код>) |
Проверить параметры пользовательского свойства |
|
Название справочника должно начинаться с буквы и состоять только из латинских букв и цифр. |
Пояснения не требуются |
|
В выгрузке настроены цены с одинаковым названием. Продолжение обмена невозможно. |
Пояснения не требуются |
|
В редакции Малый Бизнес нет возможности иметь более одного типа цены. Настройте выгрузку из 1С или перейдите на другую редакцию БУС. |
Пояснения не требуются |
Шаг 2.7 Импорт разделов каталога
|
Ответ |
|
|
Если успех: |
progress Группы импортированы |
|
Если ошибка: |
failure Ошибка импорта метаданных <текст ошибки> |
|
Сессия ($_SESSION[BX_CML2_IMPORT][NS]) |
|
|
STEP |
5 |
На этом шаге в инфоблоке создаются и обновляются все разделы каталога, которые были в XML файле. Сопоставление разделов из XML-файла и в БД происходит по XML_ID.
Если на сайте нет раздела с XML_ID из файла, он создается. Если есть, то выполняется сравнение полей из XML файла с аналогичными полями в БД. Если изменения нет, то Битрикс только обновляет поле TIMESTAMP_X и пропускает раздел. Если изменения есть — происходит полноценное обновление. Это происходит независимо от настроек сайта.
Для экономии ресурсов сервера добавление разделов происходит без пересчета дерева (речь о полях LEFT_MARGIN и RIGHT_MARGIN).
Возможные ошибки
Так как импорт разделов не пошаговый, при обмене большом дереве разделов на сайте может возникать ошибка превышения времени исполнения. Решения три.
-
Увеличить время исполнения на странице «Интеграция с 1С» и в настройках сервера (nginx).
-
Доработать 1С, чтобы ошибки на этом этапе игнорировались пока не будет получен ответ «progress».
-
Повторить всю выгрузку несколько раз.
Объясним, как поможет повтор шага или всей выгрузки. Допустим, в XML-файле и на сайте 20001 раздел. Пусть за один проход Битрикс успевает импортировать только 10000 разделов.
|
№ Обмена/шага |
Пропущено т.к. нет изменений |
Обработано |
Ответ |
|
1 |
0 |
10000 |
Ошибка сервера |
|
2 |
10000 |
10000 |
Ошибка сервера |
|
3 |
20000 |
1 |
progress Группы импортированы |
Битрикс каждый раз обрабатывает столько разделов, сколько успевает. При повторении выгрузки первые 10000 разделов он пропустит (обновит только TIMESTAMP_X) и обновит еще 10000 разделов, пока не наступил тайм-аут. И только на 3-ей выгрузке из 1С шаг будет завершен корректно.
Шаг 2.8 Пересчет дерева разделов
|
Ответ |
|
|
Если успех: |
progress Деактивация/удаление групп завершено |
|
Если ошибка: |
failure Ошибка импорта метаданных <текст ошибки> |
|
Сессия ($_SESSION[BX_CML2_IMPORT][NS]) |
|
|
STEP |
6 |
На этом шаге Битрикс выполняет две задачи:
-
Удаление/деактивация разделов (в старых версиях модуля обмена в 1С)
-
Перестройка дерева разделов
В старых версиях 1С отличить полную выгрузку от частичной просто: при частичной в узле «Классификатор» был атрибут СодержитТолькоИзменения=»true», при полной его не было.
В 2019 году 1С всегда выгружает этот атрибут. Если этого атрибута нет, Битрикс мог (и до сих пор может, просто этот код не используется) удалить, деактивировать старые разделы (или пропустить их). На выбор влиял параметр на странице «Интеграция с 1С». Сейчас эта настройка уже ни на что не влияет и ни деактивации, ни удаления не происходит.
![]()
Также на этом шаге пересчитываются служебные поля LEFT_MARGIN и RIGHT_MARGIN всех разделов.
Шаг 2.9 Импорт товаров (повторяющийся)
|
Ответ |
|
|
Если идет процесс импорта: |
progress Обработано <число> из <число> элементов |
|
Если импорт завершен: |
progress Загрузка элементов завершена |
|
Если ошибка: |
failure <текст ошибки> |
|
Сессия ($_SESSION[BX_CML2_IMPORT][NS]) |
|
|
STEP |
7 |
|
DONE |
Ассоциативный массив, счетчик обработанных товаров и всех товаров в файле |
На этом шаге в инфоблоке создаются и обновляются все товары, которые были в XML файле. Сопоставление товаров в файле товарам на сайте происходит по полю XML_ID.
Если на сайте нет товара с XML_ID из файла, он создается. Если есть, то выполняется сравнение полей из XML файла с аналогичными полями в БД.
![]()
Если изменения нет, и задан параметр «Использовать контрольные суммы элементов для оптимизации обновления каталога», Битрикс только обновляет поле TIMESTAMP_X и пропускает товар. Иначе происходит полноценное обновление.
При импорте товара заполняется поле TMP_ID. Значение для этого поля хранится в узле <НомерВерсии>. Если узла нет — Битрикс вычисляет контрольную сумму от всей информации о товаре из XML файла.
Возможные ошибки
|
Текст ошибки |
Что делать |
|
Временная таблица не существует |
Ошибка возникает если с сайтом работает несколько 1С или одна 1С присылает несколько запросов одновременно. В одном потоке выполняется шаг 4.9, а другой запустил шаг 4.2. |
Шаг 2.10 Деактивация/удаление товаров (повторяющийся)
|
Ответ |
|
|
Если идет обработка: |
progress Обработано <число> из <число> элементов |
|
Если обработка завершена: |
progress Деактивация/Удаление элементов завершены |
|
Если ошибка: |
failure <текст ошибки> |
|
Сессия ($_SESSION[BX_CML2_IMPORT][NS]) |
|
|
STEP |
8 |
|
DONE |
Ассоциативный массив, счетчик обработанных товаров и всех товаров в файле |
На этом шаге раньше (как и на шаге 2.8 Пересчет дерева разделов ) Битрикс проводил чистку товаров. Чистка товаров происходила только если в узле “Классификатор” XML файла не было пометки СодержитТолькоИзменения=»true» (старый формат выгрузки). Есть аналогичная настройка для выбора, что делать с товарами.
![]()
В 2019 году на этом шаге ничего не происходит.
Шаг 2.11 Завершение импорта
|
Ответ |
|
|
Если успех: |
success Импорт успешно завершен |
|
Если ошибка: |
failure <текст ошибки> |
|
Сессия ($_SESSION[BX_CML2_IMPORT][NS]) |
|
|
STEP |
9 |
Служебный шаг. Обработки данных нет, только испускается событие OnSuccessCatalogImport1C .
Шаг 3. Деактивация старых данных
|
Запрос |
|
|
GET-параметры: |
type=<тип обмена> |
|
mode=deactivate |
|
|
sessid=<ID сессии> |
|
|
timestamp=<время на сервере> |
|
|
Cookie: |
<имя Cookie>=<значение Cookie> |
|
Ответ |
|
|
Если успех: |
success Деактивация элементов завершена |
|
Если ошибка: |
failure Ошибка деактивации элементов |
На этом шаге в 2019 году Битрикс деактивирует все товары и разделы каталога, не затронутые в текущей сессии. Для этого время последнего изменения сравнивается с timestamp, который передает 1С — время начала текущей сессии, полученное на шаге авторизации.
Напомним, что эти настройки в панели управления сайта сейчас ни на что не влияют (всегда происходит деактивация):

Этот шаг будет выполнен, только если современная 1С делает полную выгрузку. Для выгрузки изменений и в старых версиях 1С этого шага нет.
Шаг 4. Завершение импорта
|
Запрос |
|
|
GET-параметры: |
type=<тип обмена> |
|
mode=complete |
|
|
sessid=<ID сессии> |
|
|
Cookie: |
<имя Cookie>=<значение Cookie> |
|
Ответ |
|
|
Если успех: |
success Завершение процедуры импорта |
|
Если ошибка: |
failure <текст ошибки> |
Служебный шаг. Обработки данных нет, только испускается недокументированное событие модуля catalog OnCompleteCatalogImport1C. Аргументы обработчика аналогичны обработчикам события OnSuccessCatalogImport1C , возвращаемого значения нет.
Обмен справочниками (1С -> Битрикс)
Данный тип обмена (type=reference) используется для создания и обновления на сайте HL-блоков. Этот тип намного короче чем обмен товарами и повторяет многие из его шагов.
Часто обмен справочниками — простой и быстрый способ расширить стандартные функции обмена.

Шаг 1. Передача файла (повторяющийся)
см. аналогичный шаг обмена товарами, (отличается только mode, в данном типе обмена mode=reference).
Шаг 2. Основной
|
Запрос |
|
|
GET-параметры: |
type=reference |
|
mode=import |
|
|
sessid=<ID сессии> |
|
|
Cookie: |
<имя Cookie>=<значение Cookie> |
Шаг 2.1 Распаковка архива (повторяющийся, необязательный)
см. аналогичный шаг обмена товарами.
Шаг 2.2 Подготовка справочника
|
Ответ |
|
|
Если успех: |
progress Найден или создан справочник. Код справочника: <ID> |
|
Если ошибка: |
failure <текст ошибки> |
На этом шаге Битрикс создает HL-блок (если не существует) и все UF-поля. В начале шага испускается событие модуля catalog OnBeforeCatalogImportHL. Событие недокументированное, в обработчики передаются массив параметров компонента и путь к XML-файлу. Обработчик может вызвать ошибку и вернуть произвольное сообщение.
Важно знать следующие особенности импорта справочников:
-
1С не может удалить справочник или поле, только создать;
-
1С может создать только поля следующих типов: Строка, Булево, Дата, Число;
-
все поля, создаваемые 1С будут одиночными, необязательными, скрытыми в фильтре, показанными и редактируемыми в таблице;
-
Битрикс автоматически создает поля: UF_NAME, UF_XML_ID, UF_VERSION, UF_DESCRIPTION.
Возможные ошибки
|
Текст ошибки |
Что делать |
|
Ошибка при создании поля в справочнике <Текст ошибки> |
Изучить текст и исправить в 1С или на сайте |
|
Ошибка при создании справочника <Текст ошибки> |
Изучить текст и исправить в 1С или на сайте |
|
Ошибка разбора XML. Код ошибки: <Код ошибки> |
Расшифровать код и исправить в 1С или на сайте |
Расшифровка кодов ошибок.
|
Код |
Объяснение |
|
10 |
Неизвестная ошибка парсинга XML файла |
|
20 |
Невалидный XML файл |
|
110 |
В XML файле отсутствует или пустой узел <Ид> справочника |
|
120 |
В XML файле отсутствует или пустой узел <Наименование> справочника |
|
210 |
Во время импорта UF-полей не был найден higloadblock |
|
220 |
В XML файле отсутствует или пустой узел <Ид> в <Реквизит> |
|
230 |
В XML файле отсутствует или пустой узел <Наименование> в <Реквизит> |
|
240 |
Неизвестный <ТипЗначений> в узле <Реквизит> (допустимы только: Строка, Булево, Дата, Число) |
|
250 |
Неизвестная ошибка при создании UF-поля highload блока |
|
310 |
Во время элементов справочника не был найден higloadblock |
|
320 |
В XML файле отсутствует или пустой узел <Ид> в <ЭлементСправочника> |
|
330 |
В XML файле отсутствует или пустой узел <ЗначениеРеквизита> в <ЗначенияРеквизитов> в <ЭлементСправочника> |
Шаг 2.3 Импорт элементов (повторяющийся)
|
Ответ |
|
|
Если импорт завершен: |
success Импорт успешно завершен |
|
Если импорт в процессе: |
progress Импортировано элементов: <число> |
|
Если ошибка: |
failure <текст ошибки> |
На этом шаге Битрикс импортирует все элементы HL-блока.
Если выгрузка была полной, Битрикс удаляет все элементы HL-блока, у которых значение поля UF_VERSION не начинается с <ID текущей сессии> + «#»
В конце шага Битрикс испускает событие модуля catalog OnSuccessCatalogImportHL. Аргументы — массив параметров компонента и путь к файлу.
Возможные ошибки
Аналогичны ошибкам на предыдущем шаге.
Формат файлов
Формат файла обмена товарами

Формат файла обмена предложениями

Формат файла обмена ценами товаров и предложений

Формат файла обмена остатками товаров и предложений

Формат файла обмена справочниками

Поясним некоторые места этого XML.
-
Узел <Ид>
-
Значение становится названием сущности (после транслитерации).
-
С префиксом «b_» становится названием таблицы (после транслитерации).
-
-
Узел <Наименование> Не используется. Вообще. Но если узла не будет в файле, Битрикс выдаст ошибку (sic!)
-
Каждый <Реквизит> описывается тремя узлами:
-
<Ид>
-
Значение становится XML ID поля
-
С префиксом «UF_» становится кодом поля
-
-
<Наименование>
-
Значение становится названием UF-поля.
-
-
<ТипЗначений>
-
4 допустимых значения: Строка, Булево, Дата, Число
-
-
-
Каждый <ЭлементСправочника> описывается полями:
-
<Ид>
-
Становится значением поля UF_XML_ID
-
-
<НомерВерсии>
-
C префиксом <ID текущей сессии> + «#» становится значением поля UF_VERSION
-
-
<ЗначенияРеквизитов>
-
Реквизит Код
-
Становится значением поля UF_NAME
-
-
Реквизит Наименование
-
Становится значением поля UF_DESCRIPTION
-
-
Реквизит ПометкаУдаления
-
Не используется
-
-
Прочие реквизиты
-
Поля типа «Дата» представлены в формате YYYY-MM-DD HH:MI:SS.
-
Поля типа «Булево» представлены строками true или false (или пустой строкой).
-
-
Как дорабатывать обмен?
Все запросы (при стандартном обмене) 1С присылает на служебную страницу /bitrix/admin/1c_exchange.php. Но если заглянуть в файл, выяснится что вся логика скрыта в недрах модуля «Торговый каталог» в файле /bitrix/modules/sale/admin/1c_exchange.php. Эти страницу нельзя изменять, но можно скопировать (обычно мы копируем в /bitrix/admin/1c_exchange_custom.php) и изменить адрес в 1С.
На этой странице, в зависимости от переданных GET-параметров (совсем как комплексные компоненты в режиме не-ЧПУ) подключаются разные простые компоненты. Компоненты без шаблонов.
Значительная часть логики вынесена из этих компонентов в классы. Связь видов обмена, GET-параметров, компонентов и основных классов приведена ниже в таблице.
|
Тип данных |
GET[type] |
Компонент |
Класс с логикой |
Путь к классу |
|
Заказы, контрагенты |
sale |
bitrix:sale.export.1c |
CSaleOrderLoader |
/bitrix/modules/sale/general/order_loader.php |
|
Товары, предложения, склады, цены, наличие |
catalog |
bitrix:catalog.import.1c |
CIBlockCMLImport |
/bitrix/modules/iblock/classes/general/cml2.php |
|
Справочники |
reference |
bitrix:catalog.import.hl |
CBitrixCatalogImportHl |
В папке с компонентом |
Существует 3 принципиально разных способа доработать обмен с 1С:
-
Не трогать стандартный обмен, использовать обработчики событий.
-
Кастомизировать файлы обмена на стороне сайта и доработать по требованиям
-
Выгружать нужные данные как справочники и обрабатывать самостоятельно.
Первый способ нужен для самых простых случаев, ничего серьезного сделать так не получится.
Второй способ реализуется так:
-
Создать собственную страницу обмена. Обычно это /bitrix/admin/1c_exchange_custom.php.
-
На эту страницу перенести код из /bitrix/modules/sale/admin/1c_exchange.php.
-
Кастомизировать нужный компонент обмена и заменить вызов системного компонента на вызов собственного (например, bitrix:catalog.import.1c на intervolga:catalog.import.1c) на новой странице обмена.
-
Может понадобиться изменение логики класса. Используйте наследование (например, класс IntervolgaCustomExchangeCml может быть наследником CIBlockCMLImport и переопределять метод ImportElements).
После правок на сайте нужно изменить параметр «Адрес сайта и путь до скрипта обмена» в 1С. Имя пользователя и пароль одинаковые как для стандартного обмена, так и для доработанного.

Третий способ (через справочники) подходит, если у нужной сущности 1С совсем нет аналога на сайте или по каким-то причинам стандартный импорт совсем не годится. У модуля highloadblock есть все необходимые события (создание, редактирование, удаление) и для ненагруженных проектов это достаточно неплохое решение.
С помощью выгрузки справочников решаются такие задачи, как создание пользователей на сайте через 1С, выгрузка персональных цен и скидок, бонусов и информации для личного кабинета партнеров.
Отладка обмена — отдельный больной вопрос. Обычно решается логированием всех происходящих в недрах Битрикса процессов. В ИНТЕРВОЛГЕ разработали свою систему логирования обмена, которая представляет весь процесс в виде диаграммы Гантта. На ней сразу видно, если идут одновременно 2 обмена или 1С не дожидается ответа и начинает слать новые запросы.

Заключение
Часто самой сложной задачей в процессе разработки является именно интеграция с 1С. Отчетливое понимание происходящих в Битриксе процессов необходимо для серьезных проектов.
Источник: блог ИНТЕРВОЛГИ.
14.10.15 — 09:38
Даже на примере общедоступного вебсервиса. По http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?WSDL легко получаю описание в xml в браузере. Если пытаюсь на основании этого wsdl создать WSСсылка получаю от 1С-ки отлуп:
Ошибка разбора XML: — [1,1]
Фатальная ошибка
extra content at the end of the document
SystemID:http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?WSDL
Если создавать WSСсылку на основании xml, сохраненного из браузера, то создается, все читаемо. Далее все что можно сделать используя это описание — делается: прокси создается, типы параметров для разных функций определяются, т.е. xml рабочий. Но как только следует обращение к самому вебсервису — то фигвам.
Ошибка разбора XML: — [1,1]
Фатальная ошибка:
Document is empty
1С 8.2.19.130
Интернеты читал, схожие, а то и идентичные случае описываются, решения увы не на нашел.
1 — 14.10.15 — 14:38
Вобщем, вылечил. Если кому-то интересно — ниже описание.
Изначальная проблема была с проксей. После отключения прокси — получилось импортировать wsdl в 1С-ку напрямую, без использования файла. Но дальше, интереснее…
Использовал следующий код:
Прокси = WSСсылки.CBR_DailyInfoWebServ.СоздатьWSПрокси( «http://web.cbr.ru/»;, «DailyInfo», «DailyInfoSoap»);
//Получаем тип параметра, который передается в метод GetCursOnDate.
ТипWSПараметра = Прокси.ФабрикаXDTO.Пакеты.Получить( «http://web.cbr.ru/»).Получить(«GetCursOnDate»;);
//Создаем параметр на основе типа и заполняем значение параметра On_Date.
WSПараметр = Прокси.ФабрикаXDTO.Создать(ТипWSПараметра);
WSПараметр.On_Date = фДатаЗагрузки;
//Вызываем метод веб-сервиса, записываем результат в переменную КурсыВалют.
КурсыВалют = Прокси.GetCursOnDate(WSПараметр);
(честно спертый отсюда: http://habrahabr.ru/post/148658/)
До последней строчки все отрабатывало, на последней дропалось, со знакомой ошибкой:
Ошибка разбора XML: — [1,1]
Фатальная ошибка:
Document is empty
Разбор пакетов, перехваченных фидлером натолкнул на мысль упростить код до:
Прокси = WSСсылки.CBR_DailyInfoWebServ.СоздатьWSПрокси( «http://web.cbr.ru/»;, «DailyInfo», «DailyInfoSoap»);
КурсыВалют = Прокси.GetCursOnDate(фДатаЗагрузки);
И о чудо! Оно заработало. Т.е. когда я отдавал вебсервису в качестве аргумента функции параметр, созданный в рамках объектной модели вебсервиса, 1С создавало кривой пакет, когда начал передавать просто сериализуемый тип данных — все заработало. Отлично, только вопрос, что делать если придется передавать в качестве аргумента тип данных, создать который в 1с нельзя (ну или как выше создать можно, но только в объектной модели вебсервиса)?
О сколько нам открытий чудных готовит просвещенья дух..
Готов к конструктивной и не очень критике)
4 — 14.10.15 — 15:43
(3) Нуу… ты, наверное, имел в виду _в удобном виде_ посмотреть (и без лишних телодвижений). Если конфу не жалко снимать с замка (или иметь под рукой отдельную для этого дела) — не спорю.
Но также есть и всевозможные xml-просмотрщики, помогающие с просмотром структуры.
Да и в отладке щелкать по «плюсикам» объектов XDTO никто не отменял 🙂