«Ошибка разбора XML» в 1С: причины и как исправить
Текст, который платформа читает как XML, не является корректным XML-документом. В продолжении сообщения обычно указаны номер строки и позиции, а также описание: ожидался начальный тег, неверный символ, незакрытый элемент.
Текст ошибки
Причины
- Вместо XML пришёл пустой ответ, HTML-страница с ошибкой или текст JSON
- Неверная кодировка или лишние байты в начале файла
- В тексте есть неэкранированные символы & и < или управляющие символы
- Файл обрезан: выгрузка или загрузка прервались
- XML собран вручную конкатенацией строк с ошибкой
- Файл обмена повреждён или создан другой программой в нестандартном формате
Шаг 1. Посмотрите, что на самом деле пришло
Большинство ошибок разбора XML при интеграциях происходит потому, что сервер вернул не XML. Сохраните полученный текст в файл и откройте его в редакторе:
Ответ = Соединение.Получить(Запрос);
ТекстОтвета = Ответ.ПолучитьТелоКакСтроку();
Если Ответ.КодСостояния <> 200 Тогда
ВызватьИсключение СтрШаблон("Сервер вернул код %1: %2",
Ответ.КодСостояния, Лев(ТекстОтвета, 500));
КонецЕсли;
Если код ответа не 200 или в тексте HTML-страница, проблема не в разборе, а в запросе: адрес, авторизация, параметры.
Шаг 2. Проверьте позицию ошибки
Номер строки и колонки в сообщении указывает, где разбор остановился. Позиция 1,1 означает, что документ не начинается с XML: пустой текст, BOM в неожиданном месте, HTML или JSON.
Шаг 3. Кодировка
Объявление encoding в заголовке XML должно соответствовать фактической кодировке файла. Если файл в windows-1251, а в заголовке указано UTF-8, разбор упадёт на первой русской букве. При чтении из файла кодировку можно указать явно:
ЧтениеXML = Новый ЧтениеXML; ЧтениеXML.ОткрытьФайл(ИмяФайла, , , "windows-1251");
Шаг 4. Не собирайте XML строками
Ручная склейка строк — частая причина: значение с символом & или < ломает документ. Используйте ЗаписьXML, который сам экранирует спецсимволы:
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку("UTF-8");
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента("Товар");
ЗаписьXML.ЗаписатьАтрибут("Наименование", "Болт М8 & гайка");
ЗаписьXML.ЗаписатьКонецЭлемента();
Текст = ЗаписьXML.Закрыть();
Шаг 5. Управляющие символы в данных
Некоторые символы недопустимы в XML даже в экранированном виде, например символы с кодами 0–8. Они попадают в базу при копировании текста из других программ. Найдите такие значения в реквизитах объекта из сообщения и очистите их.
Для пользователя
Если ошибка при загрузке файла обмена или выписки, файл может быть повреждён или выгружен не полностью. Выгрузите его заново и проверьте размер. Если ошибка при работе с внешним сервисом, повторите позже: сервис мог временно вернуть страницу с ошибкой.
Частые вопросы
Что значит ошибка в позиции 1,1?
Документ не начинается с корректного XML. Обычно пришёл пустой ответ, HTML-страница ошибки или JSON. Посмотрите текст, который был передан на разбор.
Как экранировать амперсанд в XML?
Используйте ЗаписьXML: при записи значений и атрибутов он сам заменит & и < на сущности, поэтому вручную экранировать ничего не нужно.