При работе с файлами обмена данными в 1С часто возникает ситуация, когда у нас есть объект ЧтениеXML, и нам необходимо получить его содержимое в виде обычной строковой переменной. Многие начинающие разработчики пытаются найти метод вроде ПолучитьСтроку(), однако архитектура платформы 1С устроена иначе. Давайте разберемся, почему так происходит и какие есть способы решения этой задачи.
Важно помнить, что ЧтениеXML — это «курсор» или «сканер», который последовательно движется по источнику данных (файлу, двоичным данным или строке). Он не загружает весь документ целиком в оперативную память, а значит, сам по себе не владеет текстом документа. Он лишь «смотрит» на текущий узел. Поэтому, чтобы получить полный текст, нам нужно «переписать» содержимое потока в другой объект — ЗаписьXML.
Это самый универсальный и надежный способ. Мы создаем объект ЗаписьXML, настраиваем его на работу со строкой, а затем в цикле «прогоняем» всё содержимое ЧтениеXML в этот объект. Рассмотрим пример реализации:
Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку();
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл("C:\ВашФайл.xml");
Пока Чтение.Прочитать() Цикл
Запись.ЗаписатьТекущий(Чтение);
КонецЦикла;
ИтоговаяСтрока = Запись.Закрыть();
Важные замечания по этому методу:
ЗаписатьТекущий(Чтение) переносит текущий узел, на котором стоит курсор.<?xml version="1.0" ... ?>), убедитесь, что вы правильно обрабатываете её, если она необходима в итоговой строке.Если вам нужно не просто получить текст, а, возможно, провести какие-то манипуляции с документом, можно использовать ПостроительDOM. Этот метод загружает документ в память целиком, что дает больше гибкости, но требует больше ресурсов при работе с очень большими файлами.
ПостроительDOM = Новый ПостроительDOM;
ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML);
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
ЗаписьDOM = Новый ЗаписьDOM;
ЗаписьDOM.Записать(ДокументDOM, ЗаписьXML);
ТвояСтрока = ЗаписьXML.Закрыть();
Если структура вашего XML соответствует схеме XSD, можно использовать возможности ФабрикаXDTO. Однако будьте осторожны: если XML не идеален, этот метод вызовет ошибку. Если ваша задача — просто извлечь текст без валидации, используйте способы выше.
ФабрикаXDTO = Новый ФабрикаXDTO;
ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ОбъектXDTO);
Результат = ЗаписьXML.Закрыть();
Если источником для ЧтениеXML изначально являются ДвоичныеДанные (например, полученные через HTTPОтвет или чтение файла), то в некоторых случаях объект ЧтениеXML вам вовсе не нужен. Вы можете сразу преобразовать данные в строку, что будет работать значительно быстрее:
Используйте функцию ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанные, КодировкаТекста.UTF8). Это избавит вас от необходимости перебирать узлы и пересобирать документ «по кирпичикам».
Подводя итог нашей совместной работы, запомним:
Объект ЧтениеXML — это инструмент для потокового чтения, а не хранилище данных. Чтобы превратить поток в строку, необходимо направить его в ЗаписьXML через цикл ЗаписатьТекущий(). Если же данные доступны сразу как файл или двоичные данные, используйте прямые методы преобразования типов, это сэкономит вам время и ресурсы сервера.