При интеграции интернет-магазинов с 1С:Предприятие (например, 1С:Управление торговлей 11) обмен данными часто реализуется на базе стандарта CommerceML 2. Если файл формируется сторонним скриптом или внешней CMS, в журнале регистрации и логах модуля интеграции можно встретить сообщение: «Не удалось прочитать XML». При этом локально файл успешно открывается текстовым редактором, что затрудняет поиск причины.
Проанализируем ситуацию, выясним основные источники сбоя парсинга и разберем пошаговый алгоритм устранения неполадок.
Платформенные механизмы 1С (такие как ЧтениеXML и ФабрикаXDTO) строго следуют спецификации W3C XML. Любое отклонение от стандарта делает документ невалидным, из-за чего разбор файла аварийно прекращается в момент инициализации.
Посмотрим на распространенную ошибку в корневом теге, возникающую при генерации файла внешними скриптами:
<КоммерческаяИнформация ДатаФормирования="2017-12-21T19:41:52" ВерсияСхемы="2.09" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; xmlns:xs="http://www.w3.org/2001/XMLSchema"; xmlns="urn:1C.ru:commerceml_2">
Обратим внимание на точки с запятой ; в конце значений атрибутов xmlns:xsi и xmlns:xs. Подобный синтаксис недопустим в XML-разметке. Атрибуты должны разделяться исключительно пробелами, а их значения не должны содержать посторонних разделителей.
Исправим заголовок файла в соответствии со стандартом:
<КоммерческаяИнформация ДатаФормирования="2017-12-21T19:41:52" ВерсияСхемы="2.09" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="urn:1C.ru:commerceml_2">
Модуль обмена с сайтом («1С-Битрикс» или типовой обмен) считывает файл через фабрику XDTO конфигурации. Если версия схемы, переданная в заголовке (например, ВерсияСхемы="2.09"), не совпадает с логикой обработки в модуле, процедура импорта завершается отказом.
В модуле Б_ОбменССайтомСервер проверка наличия обязательных узлов документа выполняется следующим образом:
ИначеЕсли НЕ Б_ОбменССайтомСервер.ОбъектXDTOСодержитСвойство(ДокументыXDTO, "Контейнер") Тогда
Б_ОбменССайтомСервер.СообщитьПодробно("Нет документов для обработки", ПараметрыОбмена);
Возврат Ложь;
КонецЕсли;
В зависимости от версии формата CommerceML и настроек обмена модуль может ожидать группировку документов внутри тега <Контейнер> либо прямое перечисление узлов <Документ>. Если структура пакета XDTO в конфигурации не находит ожидаемого корневого свойства или типов данных, генерируется исключение.
Чтение = Новый ЧтениеXML;
Попытка
Чтение.ОткрытьФайл("C:\exchange\orders.xml");
ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(Чтение);
Чтение.Закрыть();
Исключение
Сообщить(ОписаниеОшибки());
Если Чтение <> Неопределено Тогда
Чтение.Закрыть();
КонецЕсли;
КонецПопытки;
ОписаниеОшибки() выдаст точную причину — отсутствие типа в пакете XDTO, некорректный символ или нарушение структуры схемы.&, <, >) и исключать непечатные управляющие символы ASCII.xml.etree.ElementTree или lxml), которые гарантируют корректность синтаксиса и структуры.