При интеграции систем, обмене данными или отладке веб-сервисов разработчикам часто требуется просмотреть содержимое XML-файла непосредственно в режиме «1С:Предприятие». Стандартный просмотр через ТекстовыйДокумент выводит монохромный текст без возможности интерактивно сворачивать узлы и ветки структуры. В то же время привычный объект ДокументHTML во встроенном языке не имеет метода Показать(). Разберем причины такого поведения платформы и детально рассмотрим работающие способы отображения интерактивного XML в тонком и веб-клиенте.
Проанализируем архитектуру платформы «1С:Предприятие 8». Объекты ТекстовыйДокумент и ТабличныйДокумент являются самостоятельными визуальными сущностями — у них есть собственный оконный интерфейс для вывода пользователю через вызов метода Показать(). В отличие от них, объект ДокументHTML представляет собой лишь внутреннюю объектную модель (DOM), предназначенную для программного анализа, модификации и разбора тегов.
Для того чтобы визуализировать HTML- или XML-разметку внутри платформы, разработчику обязательно требуется элемент формы типа Поле HTML-документа, либо передача данных во внешний просмотрщик.
Если задача заключается только в быстром просмотре содержимого файла без интерактивности, простейшим решением остается штатный объект ТекстовыйДокумент. Посмотрим на пример кода, позволяющий получить данные и вывести их на экран:
&НаКлиенте
Процедура ПоказатьXMLТекстом(Команда)
лТекст = Новый ТекстовыйДокумент;
лТекст.УстановитьТекст(ПолучитьСтрокуXMLНаСервере());
лТекст.Показать("Просмотр XML");
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьСтрокуXMLНаСервере()
Запись = Новый ЗаписьXML;
ПараметрыЗаписи = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Истина, Истина, Символы.Таб);
Запись.УстановитьСтроку(ПараметрыЗаписи);
Запись.ЗаписатьОбъявлениеXML();
Запись.ЗаписатьНачалоЭлемента("КорневойЭлемент");
Запись.ЗаписатьАтрибут("Версия", "1.0");
Запись.ЗаписатьНачалоЭлемента("УзелДанных");
Запись.ЗаписатьТекст("Тестовое значение");
Запись.ЗаписатьКонецЭлемента();
Запись.ЗаписатьКонецЭлемента();
Возврат Запись.Закрыть();
КонецФункции
Главный недостаток такого подхода — отсутствие цветовой раскраски тегов, атрибутов и невозможность скрыть вложенные ветви большого документа.
Разберем по шагам, как настроить интерактивный просмотр прямо в интерфейсе управляемой формы:
ТекстHTML и типом данных Строка (неограниченной длины).Если передать в такой реквизит исходный XML-текст напрямую, движок веб-компонента может скрыть неизвестные ему теги. Чтобы браузер интерпретировал данные корректно и применил стили, выполним XSLT-преобразование или обернем разметку в базовый HTML-контейнер со скриптом подсветки. Рассмотрим пример XSL-преобразования с помощью объекта ПреобразованиеXSL:
&НаСервере
Процедура ПодготовитьОтображениеXML()
Преобразование = Новый ПреобразованиеXSL;
// Загружаем шаблон XSL, трансформирующий XML в HTML с древовидной структурой
Преобразование.ЗагрузитьИзСтроки(ПолучитьШаблонXSLT());
ИсходныйXML = ПолучитьСтрокуXMLНаСервере();
// Выполняем трансформацию XML в готовый интерактивный HTML
РезультатHTML = Преобразование.ПреобразоватьИзСтроки(ИсходныйXML);
// Присваиваем реквизиту формы, связанному с полем HTML-документа
ЭтаФорма.ТекстHTML = РезультатHTML;
КонецПроцедуры
Такой подход обеспечивает кроссплатформенность: интерактивное дерево узлов со значками раскрытия будет одинаково стабильно работать как в настольном тонком клиенте под Windows и Linux, так и при подключении через веб-клиент.
В веб-клиенте существует эффективный прием, позволяющий задействовать нативный механизм рендеринга XML текущего браузера пользователя. Современные браузеры содержат встроенные средства форматирования XML-документов с раскраской синтаксиса и кнопками сворачивания тегов.
Выясним, как передать XML-документ браузеру с помощью схемы data::
text/xml.ПерейтиПоНавигационнойСсылке().Посмотрим на пример практической реализации данного метода:
&НаКлиенте
Процедура Открыть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 и автоматически сформирует интерактивное дерево с подсветкой всех тегов и возможностью комфортного сворачивания уровней.
Если внедрение HTML-компонентов нежелательно или требуется обеспечить единый системный стиль интерфейса, разберем альтернативный вариант — чтение файла во встроенную коллекцию ДеревоЗначений.
С помощью объектов ЧтениеXML или ПостроительDOM документ последовательно разбирается по узлам:
Таблица формы, привязанная к реквизиту с типом ДеревоЗначений, предоставляет штатные элементы управления 1С: сворачивание и разворачивание узлов, поиск по тексту и выгрузку данных без использования сторонних скриптов.