Как преобразовать XML из Base64 в читаемый формат с отступами в 1С

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

В процессе интеграции различных систем программисты часто сталкиваются с ситуацией, когда XML-данные передаются внутри Base64 строки. Для таких задач есть инструмент логирования и анализа HTTP-трафика. При обычном сохранении таких данных в файл или строку получается монолитный текст без переносов и отступов, что крайне неудобно для отладки и визуального анализа. В этой статье мы подробно разберем, как не просто декодировать данные, но и привести их к «красивому» виду (Pretty Print) средствами платформы 1С.

Разбор базовой проблемы: почему обычная запись не работает

Когда мы используем стандартную функцию Base64Значение(), система возвращает объект типа ДвоичныеДанные. Прямая запись этих данных в файл методом Записать() сохраняет байты ровно в том виде, в котором они были упакованы. Если исходный XML не содержал символов переноса строки и табуляции, то и результирующий файл будет представлять собой одну бесконечную строку. Для исправления ситуации нам необходимо «пересобрать» XML-документ, используя механизмы парсинга и форматированной записи. Для этого подойдёт универсальная выгрузка данных в XML и JSON.

Решение через объектную модель DOM

Наиболее надежный и простой в реализации способ — это использование объекта ПостроительDOM. Этот метод позволяет прочитать «сырой» XML в память в виде дерева объектов, а затем выгрузить его обратно с применением параметров форматирования. Рассмотрим этот процесс по шагам.

Сначала мы получаем двоичные данные из Base64 и открываем их для чтения. Затем используем ЗаписьXML с установленными параметрами отступа. Проанализируем следующий программный код:


// 1. Декодируем Base64 в двоичные данные
ДвоичныеДанные = Base64Значение(ДанныеBase64Строка);

// 2. Читаем XML из двоичных данных (используем временный файл или поток)
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xml");
ДвоичныеДанные.Записать(ИмяВременногоФайла);

ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ИмяВременногоФайла);

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

// 4. Готовим запись с параметрами форматирования
ЗаписьXML = Новый ЗаписьXML;
// Параметры: Кодировка, МетодСжатия, Отступ, ПереносСтрок
ПараметрыЗаписи = Новый ПараметрыЗаписиXML("UTF-8", , Истина, Истина);
ЗаписьXML.УстановитьСтроку(ПараметрыЗаписи);

// 5. Записываем DOM обратно в строку через объект ЗаписьDOM
ЗаписьDOM = Новый ЗаписьDOM;
ЗаписьDOM.Записать(ДокументDOM, ЗаписьXML);

РезультатXML = ЗаписьXML.Закрыть();
УдалитьФайлы(ИмяВременногоФайла);

В данном примере ключевым моментом является конструктор ПараметрыЗаписиXML. Третий и четвертый параметры (установленные в Истина) указывают системе, что при генерации текста необходимо добавлять отступы и выполнять перенос строк для каждого узла.

Оптимизация работы через потоки (без временных файлов)

В современных версиях платформы 1С (8.3.9 и выше) мы можем избежать создания временных файлов на диске, что значительно ускоряет работу и повышает безопасность данных. Для этого мы задействуем механизм потоков. Выясним, как изменить наш алгоритм:


ДвоичныеДанные = Base64Значение(ДанныеBase64Строка);

// Открываем поток для чтения напрямую из памяти
ПотокЧтения = ДвоичныеДанные.ОткрытьПотокДляЧтения();

ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьПоток(ПотокЧтения);

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

Использование метода ОткрытьПотокДляЧтения() позволяет работать с данными в оперативной памяти, что критически важно при высокой нагрузке на сервер.

Тонкая настройка форматирования

Иногда стандартной табуляции в отступах недостаточно, или требуется строго определенная кодировка. Проанализируем возможности объекта ПараметрыЗаписиXML подробнее:

  1. Кодировка: По умолчанию 1С может использовать UTF-16. Если вам нужен стандартный веб-формат, всегда явно указывайте "UTF-8".
  2. Символ отступа: Если вместо табуляции требуются пробелы, вы можете указать конкретную строку (например, два пробела) в соответствующем параметре конструктора.
  3. Игнорирование пробелов: Перед чтением исходного XML рекомендуется установить ЧтениеXML.Настройка.ИгнорироватьПробелы = Истина. Это поможет очистить документ от случайных переносов, которые могли быть в исходной Base64-строке, и сформировать структуру «с нуля».

Альтернативный метод: Использование XSL-преобразования

Для очень больших файлов построение дерева DOM может потреблять значительный объем оперативной памяти. В таких случаях мы рекомендуем использовать ПреобразованиеXSL. Это так называемое «пустое» преобразование (Identity Transform), которое просто копирует узлы, но за счет настроек процессора делает их форматированными. Рассмотрим принцип настройки XSLT:

Вам потребуется создать небольшой шаблон (строку), в котором указан атрибут indent="yes". Процессор 1С применит этот шаблон к вашему XML и на выходе выдаст структурированный текст. Это один из самых быстрых способов обработки XML больших объемов. Для практической реализации подобных сценариев можно использовать руководство по визуализации и трансформации XML через XSLT.

Разница между форматированием и канонизацией

Важно не путать «красивую печать» (Pretty Print) с процессом канонизации (C14N). Форматирование предназначено для глаз человека: оно добавляет пробелы и переводы строк. Канонизация, напротив, часто удаляет все лишние символы и приводит XML к строгому стандарту для проверки электронных подписей. Если ваша задача — визуальный контроль или логирование, используйте методы, описанные выше. Если же вы готовите файл для отправки в государственные информационные системы с подписью, помните, что добавление лишних отступов после наложения подписи сделает её невалидной.

Заключение

Мы рассмотрели основной и наиболее эффективный способ приведения XML из Base64 в читаемый вид. Анализировать результат удобнее через инструмент пошаговой отладки кода в 1С. Использование связки ПостроительDOM и ЗаписьXML с корректными параметрами позволяет решить задачу буквально в несколько строк кода. Для повышения производительности всегда старайтесь использовать потоки вместо временных файлов и не забывайте настраивать игнорирование пустых узлов перед чтением документа.

← На главную