При веб-парсинге и обработке веб-страниц средствами платформы «1С:Предприятие» разработчики часто используют объекты ПостроительDOM и ДокументHTML. Однако при попытке прочитать содержимое конкретного HTML-элемента обращение к свойству ТекстовоеСодержимое возвращает только очищенный текст без разметки (без тегов <p>, <strong>, стилей и других атрибутов).
В привычной браузерной среде JavaScript для получения внутреннего или внешнего HTML-кода используются свойства innerHTML и outerHTML. Нативно объект ЭлементHTML в 1С не имеет прямых методов или свойств с таким названием. Разберем по шагам, как решить эту задачу стандартными средствами платформы 1С и с помощью COM-объекта.
Объекты ДокументHTML и ЭлементHTML в 1С реализуют базовую спецификацию W3C 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.Закрыть();
КонецФункции
Особенности работы этого подхода:
ЗаписьDOM корректно обрабатывает не только вложенные теги, но и текстовые блоки (узлы ТекстDOM), спецсимволы и переносы строк.Если разработка выполняется в операционной системе 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-серверах, мобильной платформе и в веб-клиенте.
Разберем, какой подход лучше выбрать для решения задачи:
ЗаписьDOM: Рекомендуемый стандартный метод. Не требует внешних зависимостей, работает на любой операционной системе и корректно формирует строковый HTML из объектов 1С.HtmlFile: Удобен при сложном поиске элементов через CSS-селекторы на Windows-системах, однако создаёт привязку к ОС и вызовам COM.