Как из объекта ЭлементHTML получить полный HTML-текст с тегами в 1С

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

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

В привычной браузерной среде JavaScript для получения внутреннего или внешнего HTML-кода используются свойства innerHTML и outerHTML. Нативно объект ЭлементHTML в 1С не имеет прямых методов или свойств с таким названием. Разберем по шагам, как решить эту задачу стандартными средствами платформы 1С и с помощью COM-объекта.

Причина ограничений объекта ЭлементHTML

Объекты ДокументHTML и ЭлементHTML в 1С реализуют базовую спецификацию W3C DOM. В отличие от полнофункциональных движков браузеров, эта модель предназначена для обхода и обработки структуры документа, а не для прямых текстовых манипуляций со строковой разметкой. Поэтому встроенные свойства для считывания сырого HTML-кода внутри отдельных узлов отсутствуют.

Решение 1: Сериализация узла через ЗаписьDOM и ЗаписьHTML

Для сохранения исходной разметки, стилей и вложенных тегов воспользуемся объектами ЗаписьDOM и ЗаписьHTML. Эти механизмы позволяют перевести коллекцию узлов или отдельный узел DOM обратно в строковое представление HTML.

1. Получение outerHTML (элемент вместе с его тегами)

Если необходимо получить полный HTML-код элемента, включая его открывающий и закрывающий теги, обходить дочерние узлы не требуется. Передадим целевой ЭлементHTML напрямую в метод Записать() объекта ЗаписьDOM:


Функция ПолучитьOuterHTML(ЭлементHTML)
    ЗаписьDOM = Новый ЗаписьDOM; 
    ЗаписьHTML = Новый ЗаписьHTML;
    
    ЗаписьHTML.УстановитьСтроку();
    ЗаписьDOM.Записать(ЭлементHTML, ЗаписьHTML);
    
    Возврат ЗаписьHTML.Закрыть();
КонецФункции

2. Получение innerHTML (только содержимое элемента)

Если требуется получить только то, что находится внутри тегов элемента (без самого контейнера), выполним обход коллекции ДочерниеУзлы и последовательно запишем каждый узел:


Функция ПолучитьInnerHTML(ЭлементHTML)
    ЗаписьDOM = Новый ЗаписьDOM; 
    ЗаписьHTML = Новый ЗаписьHTML;
    
    ЗаписьHTML.УстановитьСтроку();
    
    Для Каждого ТекущийУзел Из ЭлементHTML.ДочерниеУзлы Цикл 
        ЗаписьDOM.Записать(ТекущийУзел, ЗаписьHTML);
    КонецЦикла;
    
    Возврат ЗаписьHTML.Закрыть();
КонецФункции

Особенности работы этого подхода:

  1. Объект ЗаписьDOM корректно обрабатывает не только вложенные теги, но и текстовые блоки (узлы ТекстDOM), спецсимволы и переносы строк.
  2. Платформа автоматически приводит HTML-код к валидному виду (закрывает непарные теги, нормализует атрибуты).
  3. Способ абсолютно кроссплатформенный и работает как на сервере под управлением Linux, так и на клиенте.

Решение 2: Использование COM-объекта HTMLFile (MSHTML)

Если разработка выполняется в операционной системе Windows (в толстом/тонком клиенте или на Windows-сервере), можно воспользоваться COM-объектом браузерного движка MSHTML. Этот способ даёт прямой доступ к привычным свойствам innerHTML и outerHTML.

Рассмотрим пример использования COM-объекта:


Функция ПолучитьHTMLЧерезCOM(ТекстHTMLСтраницы, ИдентификаторЭлемента)
    HTMLДокумент = Новый COMОбъект("HtmlFile");
    
    HTMLДокумент.open();
    HTMLДокумент.write(ТекстHTMLСтраницы);
    HTMLДокумент.close();
    
    ЦелевойЭлемент = HTMLДокумент.getElementById(ИдентификаторЭлемента);
    Если ЦелевойЭлемент <> Неопределено Тогда
        Возврат ЦелевойЭлемент.innerHTML; // или ЦелевойЭлемент.outerHTML
    Иначе
        Возврат "";
    КонецЕсли;
КонецФункции

Ограничение данного метода: он не поддерживает кроссплатформенность и не работает на Linux-серверах, мобильной платформе и в веб-клиенте.

Сравнение методов

Разберем, какой подход лучше выбрать для решения задачи:

  1. Сериализация через ЗаписьDOM: Рекомендуемый стандартный метод. Не требует внешних зависимостей, работает на любой операционной системе и корректно формирует строковый HTML из объектов 1С.
  2. COM-объект HtmlFile: Удобен при сложном поиске элементов через CSS-селекторы на Windows-системах, однако создаёт привязку к ОС и вызовам COM.
← На главную