Как разобрать XML из строки в 1С без сохранения во временный файл?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

При интеграции 1С с внешними веб-сервисами и выполнении HTTP-запросов ответ часто приходит в формате XML непосредственно в виде строковой переменной. Создание временных файлов на диске для последующего чтения документа приводит к лишней нагрузке на файловую систему и замедляет работу программы. Проанализируем, как правильно разобрать XML-данные из строки в памяти, не сохраняя их на диск.

Основной способ: использование метода УстановитьСтроку объекта ЧтениеXML

Для чтения XML из текстовой переменной платформа 1С:Предприятие предоставляет специализированный метод УстановитьСтроку объекта ЧтениеXML. Рассмотрим, как инициализировать чтение без вызова метода ОткрытьФайл.

Разберем базовый пример кода:


ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(СтрXML);

Пока ЧтениеXML.Прочитать() Цикл
    // Обработка узлов XML
КонецЦикла;
ЧтениеXML.Закрыть();

Метод УстановитьСтроку имеет следующие параметры:

  1. СтрокаXML (обязательный) — содержит исходный текст в формате XML.
  2. Параметры (необязательный) — объект типа ПараметрыЧтенияXML, позволяющий задать правила обработки пробельных символов и комментариев.
  3. НаборСхемXML (необязательный) — объект типа НаборСхемXML для валидации структуры документа.

Возможные подводные камни при работе со строками XML

При обработке строк XML, полученных по HTTP, можно столкнуться с несколькими специфическими проблемами:

  1. Конфликт объявленной кодировки: Строковые переменные внутри 1С хранятся в формате UTF-16. Если в заголовке XML указана другая кодировка (например, <?xml version="1.0" encoding="UTF-8"?>), метод УстановитьСтроку может вызвать ошибку несоответствия. Для предотвращения ошибки рекомендуется вырезать заголовок <?xml ...?> перед вызовом чтения.
  2. Наличие непечатаемых символов и BOM: В начале полученной строки могут находиться спецсимволы или маркер последовательности байтов (BOM). Они вызывают ошибку синтаксического разбора на первом же шаге. Перед передачей строки в объект ЧтениеXML следует очищать ее от непечатаемых символов.
  3. Большой объем данных: Загрузка XML большого размера (сотни мегабайт) целиком в строковую переменную приводит к повышенному расходу оперативной памяти.

Альтернативные способы разбора XML без записи на диск

Рассмотрим другие удобные инструменты платформы, позволяющие обрабатывать XML из памяти в зависимости от стоящей задачи:

1. Использование объекта ПостроительDOM

Если требуется выгрузить документ в дерево узлов для произвольной навигации или поиска элементов с помощью XPath, скомбинируем ЧтениеXML и ПостроительDOM:


ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(ТекстXML);

ПостроительDOM = Новый ПостроительDOM;
ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML);

2. Чтение через Фабрику XDTO

Для автоматической конвертации XML-структуры в объектную модель 1С передадим подготовленный объект ЧтениеXML в фабрику XDTO:


ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(ТекстXML);

ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);

3. Использование двоичных данных и потоков

Чтобы избежать искажений кодировки при получении ответа через HTTPОтвет, проанализируем получение данных через двоичный поток. В современных версиях платформы можно прочитать данные прямо из потока памяти, используя ПотокВПамяти и метод ОткрытьПоток объекта ЧтениеXML, что исключает ошибки со строковыми заголовками кодировок.

← На главную