Как извлечь текст (строку) из объекта ЧтениеXML в 1С?

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

При работе с файлами обмена данными в 1С часто возникает ситуация, когда у нас есть объект ЧтениеXML, и нам необходимо получить его содержимое в виде обычной строковой переменной. Многие начинающие разработчики пытаются найти метод вроде ПолучитьСтроку(), однако архитектура платформы 1С устроена иначе. Давайте разберемся, почему так происходит и какие есть способы решения этой задачи.

Понимание архитектуры ЧтениеXML

Важно помнить, что ЧтениеXML — это «курсор» или «сканер», который последовательно движется по источнику данных (файлу, двоичным данным или строке). Он не загружает весь документ целиком в оперативную память, а значит, сам по себе не владеет текстом документа. Он лишь «смотрит» на текущий узел. Поэтому, чтобы получить полный текст, нам нужно «переписать» содержимое потока в другой объект — ЗаписьXML.

Способ 1: Использование ЗаписьXML с методом ЗаписатьТекущий

Это самый универсальный и надежный способ. Мы создаем объект ЗаписьXML, настраиваем его на работу со строкой, а затем в цикле «прогоняем» всё содержимое ЧтениеXML в этот объект. Рассмотрим пример реализации:


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

Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл("C:\ВашФайл.xml");

Пока Чтение.Прочитать() Цикл
    Запись.ЗаписатьТекущий(Чтение);
КонецЦикла;

ИтоговаяСтрока = Запись.Закрыть();

Важные замечания по этому методу:

  1. Цикл должен начинаться с самого начала файла, иначе в строку попадет только часть XML-документа.
  2. Метод ЗаписатьТекущий(Чтение) переносит текущий узел, на котором стоит курсор.
  3. Если в исходном документе есть XML-декларация (первая строка вида <?xml version="1.0" ... ?>), убедитесь, что вы правильно обрабатываете её, если она необходима в итоговой строке.

Способ 2: Использование DOM-модели

Если вам нужно не просто получить текст, а, возможно, провести какие-то манипуляции с документом, можно использовать ПостроительDOM. Этот метод загружает документ в память целиком, что дает больше гибкости, но требует больше ресурсов при работе с очень большими файлами.


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

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

ЗаписьDOM = Новый ЗаписьDOM;
ЗаписьDOM.Записать(ДокументDOM, ЗаписьXML);

ТвояСтрока = ЗаписьXML.Закрыть();

Способ 3: Работа с XDTO (при необходимости)

Если структура вашего XML соответствует схеме XSD, можно использовать возможности ФабрикаXDTO. Однако будьте осторожны: если XML не идеален, этот метод вызовет ошибку. Если ваша задача — просто извлечь текст без валидации, используйте способы выше.


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

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

ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ОбъектXDTO);
Результат = ЗаписьXML.Закрыть();

Альтернативный подход: работа с ДвоичнымиДанными

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

Используйте функцию ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанные, КодировкаТекста.UTF8). Это избавит вас от необходимости перебирать узлы и пересобирать документ «по кирпичикам».

Резюме

Подводя итог нашей совместной работы, запомним: Объект ЧтениеXML — это инструмент для потокового чтения, а не хранилище данных. Чтобы превратить поток в строку, необходимо направить его в ЗаписьXML через цикл ЗаписатьТекущий(). Если же данные доступны сразу как файл или двоичные данные, используйте прямые методы преобразования типов, это сэкономит вам время и ресурсы сервера.

← На главную