Как получить текст из поля HTML-документа на управляемых формах 1С (аналог метода ПолучитьТекст)

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

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

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

Проблема динамического контента и обращения к DOM

Рассмотрим типичную ситуацию: вы загружаете страницу (например, сайт логистической компании для отслеживания груза) в ПолеHTMLДокумента. На обычных формах метод ПолучитьТекст() возвращал финальный результат, который видел пользователь. В управляемых формах попытка получить текст через ЭтаФорма.Элементы.ИмяПоля.Документ.all.item(0).innerText часто приводит к тому, что 1С возвращает содержимое тегов script и style. Это происходит потому, что обращение идет ко всему документу, включая его техническую «голову» (head).

Кроме того, современные сайты часто являются SPA (Single Page Application). Это означает, что при получении HTTP-ответа в нем нет данных — там только загрузчик JavaScript, который подтягивает данные позже через AJAX-запросы. Поэтому стандартный HTTPЗапрос здесь не поможет: он вернет лишь исходный код страницы без выполненных скриптов.

Способ 1. Обращение к телу документа (Body)

Первым делом проанализируем, к какому именно элементу мы обращаемся. Чтобы исключить получение служебной информации из заголовка страницы, необходимо обращаться напрямую к свойству body. Это позволит отсечь скрипты, находящиеся вне визуальной части документа.

Пример кода для получения текста в тонком клиенте (при использовании движка Internet Explorer):


// Получаем текст только из видимой части документа
ДокументHTML = ЭтаФорма.Элементы.ИмяПоляHTML.Документ;
Если ДокументHTML <> Неопределено Тогда
    ТекстСтраницы = ДокументHTML.body.innerText;
    Сообщить(ТекстСтраницы);
КонецЕсли;

Если вам требуется не просто текст, а HTML-код, который был сформирован скриптами уже после загрузки страницы, используйте свойство innerHTML:

ДанныеHTML = ЭтаФорма.Элементы.ИмяПоляHTML.Документ.body.innerHTML;

Способ 2. Использование метода ИсполнитьJavaScript (для новых версий платформы)

Начиная с версии 8.3.14, 1С позволяет использовать современный движок рендеринга на базе Chromium. В этом режиме прямой доступ к COM-объектам документа может быть ограничен или работать нестабильно. Рассмотрим более универсальный и надежный метод — выполнение JavaScript-кода внутри контекста страницы. Этот метод вернет результат выполнения скрипта напрямую в код 1С.

Выясним, как это реализовать на практике:


// Используем метод ИсполнитьJavaScript для получения текста
Скрипт = "return document.body.innerText;";
Результат = Элементы.ИмяПоляHTML.ИсполнитьJavaScript(Скрипт);

Если ЗначениеЗаполнено(Результат) Тогда
    // Обрабатываем полученный текст
    ПарситьСтатусГруза(Результат);
КонецЕсли;

Важный нюанс: метод ИсполнитьJavaScript доступен только в том случае, если в свойствах поля HTML-документа не установлено ограничение на выполнение скриптов.

Способ 3. Ожидание завершения загрузки и отрисовки

Проанализируем ситуацию, когда код возвращает пустую строку или неполные данные. Это часто случается, если 1С пытается забрать текст в момент, когда само поле уже загрузилось, но внутренние AJAX-скрипты сайта еще не успели получить ответ от сервера и отрисовать таблицу со статусами.

Разберем по шагам правильный алгоритм ожидания:

  1. Используйте событие ДокументСформирован (DocumentComplete) у элемента формы.
  2. Внутри этого события не спешите сразу забирать текст. Если сайт «тяжелый», подключите обработчик ожидания на 1–2 секунды.
  3. В процедуре, вызванной обработчиком ожидания, производите чтение данных.

Пример реализации с задержкой:


&НаКлиенте
Процедура ИмяПоляHTMLДокументСформирован(Элемент)
    // Даем сайту 2 секунды на отработку внутренних скриптов
    ПодключитьОбработчикОжидания("ЗавершитьПолучениеДанных", 2, Истина);
КонецПроцедуры

&НаКлиенте
Процедура ЗавершитьПолучениеДанных()
    Текст = Элементы.ИмяПоляHTML.ИсполнитьJavaScript("return document.body.innerText;");
    // Теперь переменная 'Текст' содержит данные, подгруженные через AJAX
КонецПроцедуры

Способ 4. Работа с конкретными контейнерами

Если страница очень большая, а вам нужны только данные из конкретного блока (например, таблицы с историей перемещений), мы можем уточнить запрос к DOM. Вместо того чтобы забирать весь body, обратимся к конкретному ID или классу элемента. Это значительно упростит последующий парсинг в 1С.

Посмотрим на пример извлечения текста из конкретного блока div с идентификатором status-table:


Скрипт = "return document.getElementById('status-table').innerText;";
ТекстБлока = Элементы.ИмяПоляHTML.ИсполнитьJavaScript(Скрипт);

Сравнение подходов: innerText vs textContent

Выясним разницу между двумя похожими свойствами, которые вы можете встретить при работе с JavaScript в 1С:

Для решения задачи парсинга данных с сайтов в 90% случаев следует использовать именно innerText.

Почему HTTPЗапрос часто бесполезен в данной задаче?

Как было отмечено в обсуждении, использование HTTPСоединение и HTTPЗапрос возвращает «сырой» HTML-код, пришедший с сервера. Если сайт написан на современных фреймворках (React, Angular, Vue), то в сыром HTML вы увидите только пустые теги и ссылки на JS-файлы. Поле HTML-документа на форме 1С работает как полноценный браузер: оно выполняет эти скрипты, строит DOM-дерево и заполняет его данными. Поэтому для работы с динамическими сайтами (особенно зарубежными сервисами логистики) использование визуального компонента формы является единственным надежным способом получения данных без использования сложных инструментов headless-браузинга.

Подводя итог, можно сказать, что наиболее универсальным решением для управляемых форм является сочетание события ДокументСформирован, небольшой паузы и вызова метода ИсполнитьJavaScript("return document.body.innerText;"). Это обеспечит стабильную работу обработки независимо от того, какой движок (IE или Chromium) использует платформа 1С в данный момент.

← На главную