В процессе интеграции с внешними API через HTTP-запросы разработчики часто сталкиваются с ситуацией, когда сервер возвращает XML-данные в виде «сырой» длинной строки без отступов и переносов. Работать с таким текстом в отладке или просматривать его в регистрах сведений крайне неудобно. В этой статье мы подробно разберем, как программно в 1С и с помощью внешних инструментов превратить «нечитаемое полотно» в структурированное дерево тегов.
Наиболее корректным и надежным способом внутри платформы 1С является использование объектной модели документа (DOM). Этот метод позволяет не просто расставить переносы строк, а полностью пересобрать XML-структуру с учетом правил вложенности. Рассмотрим этот процесс пошагово.
Для реализации нам понадобятся объекты ЧтениеXML, ПостроительDOM и ЗаписьXML. Основная хитрость заключается в использовании объекта ПараметрыЗаписиXML, который отвечает за визуальное представление результата.
Проанализируем следующий алгоритм:
// Предположим, что в переменной ОтветСервера находится наша длинная строка XML
ЧтениеXML = Новый ЧтениеXML;
Попытка
// Инициализируем чтение из строки
ЧтениеXML.УстановитьСтроку(ОтветСервера);
// Создаем построитель и читаем XML в дерево DOM
ПостроительDOM = Новый ПостроительDOM;
ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML);
// Подготавливаем запись в новую строку
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
// Настраиваем параметры записи:
// Третий параметр "Истина" включает автоматические отступы (Indent)
ПараметрыЗаписи = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Истина, Ложь, Chars.LF);
// Записываем документ обратно, применяя форматирование
ЗаписьDOM = Новый ЗаписьDOM;
ЗаписьDOM.Записать(ДокументDOM, ЗаписьXML, ПараметрыЗаписи);
// Получаем результат
КрасивыйXML = ЗаписьXML.Закрыть();
Сообщить(КрасивыйXML);
Исключение
// Если строка не является валидным XML, обрабатываем ошибку
Сообщить("Ошибка разбора XML: " + ОписаниеОшибки());
КонецПопытки;
Разберем важные нюансы этого кода. Объект ПараметрыЗаписиXML позволяет гибко настроить вывод. Мы указали Истина в третьем параметре, что заставляет систему добавлять символы табуляции или пробелы перед вложенными тегами. Также мы явно задали перевод строки Chars.LF, что обеспечит корректное отображение в большинстве текстовых редакторов и полей 1С.
Если вам требуется максимальная производительность или специфическое форматирование (например, нужно отсортировать атрибуты), стоит обратить внимание на объект ПреобразованиеXSL. Это мощный инструмент, который может трансформировать XML-данные по заданному шаблону.
Для простого «красивого» вывода мы можем использовать пустой шаблон преобразования с инструкцией indent="yes". Этот метод часто работает быстрее на очень больших файлах, так как оптимизирован на уровне системных библиотек.
Выясним, как это выглядит в коде:
ШаблонXSL =
"<xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
| <xsl:output method=""xml"" indent=""yes"" encoding=""UTF-8""/>
| <xsl:template match=""@* | node()"">
| <xsl:copy>
| <xsl:apply-templates select=""@* | node()""/>
| </xsl:copy>
| </xsl:template>
|</xsl:stylesheet>";
Преобразование = Новый ПреобразованиеXSL;
Преобразование.ЗагрузитьИзСтроки(ШаблонXSL);
Результат = Преобразование.ПреобразоватьИзСтроки(ОтветСервера);
Здесь мы создаем минимальный XSL-скрипт, который просто копирует все узлы и атрибуты как есть, но за счет инструкции xsl:output indent="yes" заставляет процессор расставлять переносы и отступы автоматически.
Иногда программная обработка не требуется, и нам нужно «просто один раз посмотреть» на содержимое XML в удобном виде. В таких случаях помогут специализированные редакторы.
Ctrl + Shift + Alt + B (или выберите в меню Plugins -> XML Tools -> Pretty Print). Программа мгновенно превратит строку в иерархическое дерево.Shift + Alt + F для автоматического форматирования текущего документа..xml и открыть его в любом современном браузере (Chrome, Edge, Firefox). Браузеры имеют встроенные визуализаторы XML с возможностью сворачивания и разворачивания узлов.Посмотрим на популярный, но рискованный метод — использование простой замены символов. Некоторые разработчики предлагают заменять символ закрытия тега > на > плюс символ переноса строки.
Важно: Мы крайне не рекомендуем использовать этот подход для серьезных задач. Рассмотрим причины:
> или < встречается внутри текстового значения тега (внутри CDATA или просто в строке), простая автозамена разорвет данные и сделает XML невалидным.<Item />) и служебные заголовки.Если ваша база построена на Библиотеке Стандартных Подсистем (БСП), проанализируйте возможности встроенных инструментов. В составе многих конфигураций есть обработка «Консоль запросов» или «Редактор объектов». При просмотре длинных текстовых полей (например, в журнале регистрации или в очередях сообщений) в них часто встроена кнопка «Форматировать XML» или «Просмотр в виде XML», которая использует описанные выше механизмы DOM внутри себя.
Также стоит помнить, что в платформе 1С 8.3 при выводе текстовой переменной в поле текстового документа, если установить свойство Расширение в значение XML, среда может подсветить синтаксис, что упростит чтение даже без глубокого форматирования.
Таким образом, мы рассмотрели несколько способов решения задачи. Для автоматизации внутри системы лучше всего подходит ПостроительDOM с правильными ПараметрамиЗаписиXML, а для быстрого анализа данных в процессе разработки — плагины к текстовым редакторам.