В практике разработчика 1С часто возникают задачи, когда необходимо преобразовать данные из веб-форматов (HTML) или «сырых» строк в строго структурированный XML-документ. Это может быть нужно для интеграции с внешними системами, парсинга сайтов или просто для приведения документа к читаемому виду (так называемый Pretty Print). В данной статье мы подробно разберем несколько подходов: от простых манипуляций со строками до использования мощных встроенных инструментов платформы, таких как DOM-модель и фабрика XDTO.
Если ваша исходная строка уже имеет структуру, близкую к XML (как в примере автора темы), но требует корректной перепаковки или форматирования, мы можем воспользоваться механизмом XDTO (XML Data Transfer Objects). Этот метод позволяет прочитать данные в объектную модель и сразу записать их обратно в строку или файл.
Проанализируем программный код, который позволяет это реализовать:
// Исходные данные в виде строки
ДанныеXML = "<Xml><Document></Document></Xml>";
// Инициализируем чтение
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(ДанныеXML);
// Используем стандартную фабрику для создания объекта
// Если схема (XSD) не задана, 1С попытается прочитать структуру «как есть»
Попытка
ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);
Исключение
Сообщить("Ошибка при чтении структуры: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// Теперь запишем объект обратно в строку, чтобы получить чистый XML
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
// Здесь можно применить настройки форматирования (рассмотрим ниже)
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ОбъектXDTO);
Результат = ЗаписьXML.Закрыть();
Этот способ хорош тем, что ФабрикаXDTO автоматически проверяет валидность тегов и вложенность элементов. Если структура исходного текста нарушена, система выдаст исключение, что позволит нам обработать ошибку на раннем этапе.
Основная сложность при работе с реальным HTML заключается в его «свободном» синтаксисе: незакрытые теги (например, <br> или <img>), отсутствие кавычек в атрибутах и прочие нюансы, которые делают документ невалидным с точки зрения XML. Для решения этой задачи в 1С предусмотрены объекты ЧтениеHTML и ПостроительDOM.
Разберем алгоритм действий по шагам:
ЗаписьDOM для преобразования дерева обратно в текст, но уже по правилам XML.Рассмотрим пример кода:
// Предположим, у нас есть строка с «грязным» HTML
ТекстHTML = "<div><p>Текст без закрытого тега<br>Вторая строка</div>";
// Создаем чтение HTML
ЧтениеHTML = Новый ЧтениеHTML;
ЧтениеHTML.УстановитьСтроку(ТекстHTML);
// Строим дерево DOM
Построитель = Новый ПостроительDOM;
ДокументDOM = Построитель.Прочитать(ЧтениеHTML);
// Теперь записываем этот DOM в формат XML
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
ЗаписьDOM = Новый ЗаписьDOM;
ЗаписьDOM.Записать(ДокументDOM, ЗаписьXML);
РезультатXML = ЗаписьXML.Закрыть();
// На выходе мы получим валидный XML, где тег <br> будет закрыт как <br/>
Часто под вопросом «как привести к виду» пользователи подразумевают визуальное оформление XML: наличие отступов, табуляции и переносов строк. В 1С это реализуется через объект ПараметрыЗаписиXML.
Выясним, как настроить красивое отображение документа:
ЗаписьXML = Новый ЗаписьXML;
// Настраиваем параметры записи
Настройки = Новый ПараметрыЗаписиXML;
Настройки.Отступ = Истина; // Включаем иерархические отступы
Настройки.СимволОтступа = Символы.Таб; // Или используйте пробелы
Настройки.ВариантУправленияПустымиЭлементами = ВариантУправленияПустымиЭлементамиXML.ЗаписыватьЗакрывающийТег;
// Указываем настройки при инициализации строки или файла
ЗаписьXML.УстановитьСтроку("UTF-8", Настройки);
// После этого любая запись через Фабрику XDTO или ЗаписьDOM
// будет формировать красивый структурированный текст.
Если HTML слишком сложный или содержит элементы, которые не нужны в итоговом XML (например, скрипты или стили), мы можем воспользоваться объектом VBScript.RegExp. Это полезно для предварительной фильтрации данных перед тем, как передавать их встроенным парсерам 1С.
Проанализируем ситуацию: нам нужно удалить все блоки <script>...</script>, чтобы они не мешали созданию XML-дерева.
РегВыражение = Новый COMОбъект("VBScript.RegExp");
РегВыражение.MultiLine = Истина;
РегВыражение.Global = Истина;
РегВыражение.IgnoreCase = Истина;
// Паттерн для удаления скриптов
РегВыражение.Pattern = "<script[\s\S]*?>[\s\S]*?</script>";
ОчищенныйТекст = РегВыражение.Replace(ИсходныйHTML, "");
// Теперь ОчищенныйТекст можно смело отдавать ПостроителюDOM
В операционных системах Windows доступна библиотека MSHTML, которую использует Internet Explorer. Это мощный инструмент, который может «переварить» даже самый некорректный код и выдать готовую структуру. Рассмотрим этот вариант как альтернативу для сложных случаев.
HTMLДокумент = Новый COMОбъект("HTMLFile");
HTMLДокумент.open();
HTMLДокумент.write(ТекстHTML);
HTMLДокумент.close();
// Получаем корневой элемент
Элемент = HTMLДокумент.documentElement;
// Свойство innerHTML или рекурсивный обход коллекции childNodes
// позволит нам собрать нужные данные для XML.
Резюме: Выбор метода зависит от качества исходных данных. Для простого форматирования уже готового XML идеально подходит Фабрика XDTO с настройками отступов. Если же перед вами стоит задача превратить реальную веб-страницу в XML-данные, наиболее надежным и современным способом в 1С является связка ЧтениеHTML + ПостроительDOM. Она минимизирует количество ошибок и позволяет работать с данными как с набором объектов, а не как с текстом.