Как отобразить XML с подсветкой синтаксиса и сворачиванием узлов в 1С

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

При интеграции систем, обмене данными или отладке веб-сервисов разработчикам часто требуется просмотреть содержимое XML-файла непосредственно в режиме «1С:Предприятие». Стандартный просмотр через ТекстовыйДокумент выводит монохромный текст без возможности интерактивно сворачивать узлы и ветки структуры. В то же время привычный объект ДокументHTML во встроенном языке не имеет метода Показать(). Разберем причины такого поведения платформы и детально рассмотрим работающие способы отображения интерактивного XML в тонком и веб-клиенте.

Почему у объекта ДокументHTML отсутствует метод Показать()

Проанализируем архитектуру платформы «1С:Предприятие 8». Объекты ТекстовыйДокумент и ТабличныйДокумент являются самостоятельными визуальными сущностями — у них есть собственный оконный интерфейс для вывода пользователю через вызов метода Показать(). В отличие от них, объект ДокументHTML представляет собой лишь внутреннюю объектную модель (DOM), предназначенную для программного анализа, модификации и разбора тегов.

Для того чтобы визуализировать HTML- или XML-разметку внутри платформы, разработчику обязательно требуется элемент формы типа Поле HTML-документа, либо передача данных во внешний просмотрщик.

Способ 1. Отображение текста через ТекстовыйДокумент

Если задача заключается только в быстром просмотре содержимого файла без интерактивности, простейшим решением остается штатный объект ТекстовыйДокумент. Посмотрим на пример кода, позволяющий получить данные и вывести их на экран:


&НаКлиенте
Процедура ПоказатьXMLТекстом(Команда)
    лТекст = Новый ТекстовыйДокумент;
    лТекст.УстановитьТекст(ПолучитьСтрокуXMLНаСервере());
    лТекст.Показать("Просмотр XML");
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьСтрокуXMLНаСервере()
    Запись = Новый ЗаписьXML;
    ПараметрыЗаписи = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Истина, Истина, Символы.Таб);
    Запись.УстановитьСтроку(ПараметрыЗаписи);
    Запись.ЗаписатьОбъявлениеXML();
    Запись.ЗаписатьНачалоЭлемента("КорневойЭлемент");
    Запись.ЗаписатьАтрибут("Версия", "1.0");
    Запись.ЗаписатьНачалоЭлемента("УзелДанных");
    Запись.ЗаписатьТекст("Тестовое значение");
    Запись.ЗаписатьКонецЭлемента();
    Запись.ЗаписатьКонецЭлемента();
    Возврат Запись.Закрыть();
КонецФункции

Главный недостаток такого подхода — отсутствие цветовой раскраски тегов, атрибутов и невозможность скрыть вложенные ветви большого документа.

Способ 2. Использование реквизита формы с типом Поле HTML-документа

Разберем по шагам, как настроить интерактивный просмотр прямо в интерфейсе управляемой формы:

  1. Откроем форму обработки или отчета в конфигураторе.
  2. Добавим новый реквизит формы с именем ТекстHTML и типом данных Строка (неограниченной длины).
  3. Перетащим созданный реквизит в дерево элементов формы. В свойствах созданного элемента укажем вид: Поле HTML-документа.
  4. Назначим обработчик команды для заполнения текста.

Если передать в такой реквизит исходный XML-текст напрямую, движок веб-компонента может скрыть неизвестные ему теги. Чтобы браузер интерпретировал данные корректно и применил стили, выполним XSLT-преобразование или обернем разметку в базовый HTML-контейнер со скриптом подсветки. Рассмотрим пример XSL-преобразования с помощью объекта ПреобразованиеXSL:


&НаСервере
Процедура ПодготовитьОтображениеXML()
    Преобразование = Новый ПреобразованиеXSL;
    // Загружаем шаблон XSL, трансформирующий XML в HTML с древовидной структурой
    Преобразование.ЗагрузитьИзСтроки(ПолучитьШаблонXSLT());
    
    ИсходныйXML = ПолучитьСтрокуXMLНаСервере();
    
    // Выполняем трансформацию XML в готовый интерактивный HTML
    РезультатHTML = Преобразование.ПреобразоватьИзСтроки(ИсходныйXML);
    
    // Присваиваем реквизиту формы, связанному с полем HTML-документа
    ЭтаФорма.ТекстHTML = РезультатHTML;
КонецПроцедуры

Такой подход обеспечивает кроссплатформенность: интерактивное дерево узлов со значками раскрытия будет одинаково стабильно работать как в настольном тонком клиенте под Windows и Linux, так и при подключении через веб-клиент.

Способ 3. Открытие XML в новой вкладке через Data URL (для веб-клиента)

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

Выясним, как передать XML-документ браузеру с помощью схемы data::

  1. Кодируем исходную строку XML в формат Base64.
  2. Формируем навигационную ссылку с mime-типом text/xml.
  3. Используем метод глобального контекста ПерейтиПоНавигационнойСсылке().

Посмотрим на пример практической реализации данного метода:


&НаКлиенте
Процедура ОткрытьXMLВБраузере(Команда)
    СтрокаXML = ПолучитьСтрокуXMLНаСервере();
    
    // Преобразуем строку в двоичные данные и далее в Base64
    ВременныеДвоичныеДанные = ПолучитьДвоичныеДанныеИзСтроки(СтрокаXML, КодировкаТекста.UTF8);
    СтрокаBase64 = Base64Строка(ВременныеДвоичныеДанные);
    
    // Формируем data URL с указанием типа text/xml
    НавигационнаяСсылкаXML = "data:text/xml;charset=utf-8;base64," + СтрокаBase64;
    
    // Открываем документ в новой вкладке браузера
    ПерейтиПоНавигационнойСсылке(НавигационнаяСсылкаXML, Истина);
КонецПроцедуры

Браузер распознает MIME-тип text/xml и автоматически сформирует интерактивное дерево с подсветкой всех тегов и возможностью комфортного сворачивания уровней.

Способ 4. Парсинг в Дерево значений средствами платформы

Если внедрение HTML-компонентов нежелательно или требуется обеспечить единый системный стиль интерфейса, разберем альтернативный вариант — чтение файла во встроенную коллекцию ДеревоЗначений.

С помощью объектов ЧтениеXML или ПостроительDOM документ последовательно разбирается по узлам:

  1. Имя текущего тега и текстовое содержимое записываются в отдельные колонки строки дерева.
  2. При обнаружении вложенных тегов создается дочерняя строка в коллекции строк дерева значений.
  3. Атрибуты элементов могут быть вынесены в отдельную привязанную таблицу или дополнительную колонку.

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

← На главную