Как вывести XML из ХранилищаЗначения на форму без сохранения файла?

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

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

В данной статье мы проанализируем ситуацию, когда данные XML хранятся в ХранилищеЗначения или получены как ДвоичныеДанные, и разберем, как вывести их на форму «на лету».

Способ 1: Использование Построителя DOM и чтение из потока

Этот метод подходит, если вам необходимо программно обработать структуру XML и отобразить её элементы. Рассмотрим пример кода, который позволяет прочитать данные из временного хранилища (куда они попадают из ХранилищаЗначения) без создания физического файла на диске.

Разберем по шагам логику работы с потоками:


// Получаем двоичные данные из хранилища
Данные = ПолучитьИзВременногоХранилища(АдресФайлаВХранилище);

// Создаем объект чтения HTML или XML
Чтение = Новый ЧтениеHTML; 

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

// Используем ПостроительDOM для создания программной модели документа
ПостроительDOM = Новый ПостроительDOM;
ДокументHTML = ПостроительDOM.Прочитать(Чтение);

// Теперь мы можем работать с узлами документа
// Например, вывести имя корневого узла или содержимое в реквизит формы
ПолеHTML = ДокументHTML.ИмяУзла; 

Этот подход позволяет избежать лишних операций ввода-вывода с диском, используя только оперативную память (Memory Stream).

Способ 2: Установка текста из строки (ЧтениеXML)

Если данные уже представлены в виде строки или могут быть легко в неё преобразованы, наиболее эффективным методом будет использование УстановитьСтроку. Рассмотрим этот вариант подробнее:

Объект ЧтениеXML имеет встроенный метод, который позволяет инициализировать чтение не из файла, а из текстовой переменной. Выясним причину, по которой это удобно: вам не нужно заботиться о кодировках файлов на диске, так как 1С работает со строками в формате Unicode.


// Предположим, XMLТекст — это строка с содержимым XML
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(XMLТекст);

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

Чтобы получить строку из ХранилищаЗначения, достаточно извлечь ДвоичныеДанные и использовать функцию ПолучитьСтрокуИзДвоичныхДанных(), указав правильную кодировку (обычно UTF-8).

Способ 3: Визуализация выписок через XSL-преобразование (Профессиональный подход)

Когда речь идет о выписках Росреестра, обычный текст XML практически нечитаем для пользователя. Для превращения «сырого» кода в красивую таблицу, аналогичную печатной форме, следует использовать XSL-преобразование. Это позволяет сгенерировать готовый HTML-код прямо в памяти. Для этой задачи можно использовать методику визуализации XML-данных через XSLT в 1С.

Проанализируем алгоритм реализации:

  1. Загружаем XML-данные из хранилища в объект ЧтениеXML через поток или строку.
  2. Загружаем схему преобразования (файл .xsl), которую можно хранить в макете конфигурации как ТекстовыйДокумент или ДвоичныеДанные.
  3. Используем объект ПреобразованиеXSL для объединения данных и схемы.
  4. Результат (строку HTML) выводим в реквизит формы с типом Строка, у которого на форме установлен вид Поле HTML-документа.

Преобразование = Новый ПреобразованиеXSL;
Преобразование.ЗагрузитьИзСтроки(ТекстXSLT); // Схема оформления

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

// Выполняем трансформацию
РезультатHTML = Преобразование.Преобразовать(ЧтениеДанных);

// Выводим на форму в Поле HTML
ЭтаФорма.РеквизитПолеHTML = РезультатHTML;

Способ 4: Отображение структуры XML в виде Дерева значений

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

Мы можем создать рекурсивную функцию, которая обходит ДокументDOM и заполняет строки дерева на форме. Это позволит визуально сворачивать и разворачивать ветки XML, что гораздо удобнее простого текста.

Важный момент: Для красоты интерфейса можно добавить в дерево колонки «Атрибуты» и «Значение», а также использовать пиктограммы для различных типов узлов.

Способ 5: Форматированный вывод (Pretty Print)

Если пользователю все же нужно видеть именно XML-код, его необходимо «причесать», добавив отступы и переносы строк. Без этого XML выводится в одну строку, что затрудняет чтение. Разберем, как это сделать с помощью ЗаписьXML:


// Настройка параметров записи для красивого отображения
ПараметрыЗаписи = Новый ПараметрыЗаписиXML;
ПараметрыЗаписи.Отступ = Истина;
ПараметрыЗаписи.СимволыОтступа = "    ";

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

// Переписываем данные из ЧтениеXML в ЗаписьXML
// (здесь может быть логика копирования узлов)

КрасивыйXML = ЗаписьXML.Закрыть();

Полученную строку можно вывести в текстовое поле на форме. Рекомендуется использовать моноширинный шрифт (например, Courier New), чтобы иерархия отступов выглядела корректно.

Резюме

Мы рассмотрели несколько способов вывода XML на форму без использования временных файлов. Выбор конкретного метода зависит от ваших целей:

Использование потоков (ОткрытьПотокДляЧтения) — это наиболее современный и производительный путь для работы с 1С:Предприятие 8.3, позволяющий эффективно утилизировать ресурсы сервера и клиента.

← На главную