Разработка и Конфигурация · 11 мин
Как в 1С получить текст из HTML
Как в 1С извлечь чистый текст из HTML: регулярные выражения, DOM через COM-объекты, построитель DOM и обработка ошибок. Примеры кода и типичные ошибки.
В 1С нет встроенной функции «убрать теги и вернуть текст», поэтому задача извлечения текста из HTML решается несколькими способами: через регулярные выражения, через объектную модель документа (DOM) с помощью COM-объекта или через штатный построитель DOM, доступный в новых версиях платформы. Выбор зависит от сложности HTML, требований к скорости и от того, работает код на клиенте или на сервере.
Типичные сценарии: очистка описания товара, пришедшего с сайта поставщика, извлечение текста письма из HTML-формата, парсинг веб-страницы или подготовка HTML-контента для вывода в текстовое поле. Во всех случаях нужно получить читаемый текст без тегов, скриптов и служебной разметки.
Важно понимать ограничение: «вырезать теги» и «получить текст так, как его видит пользователь» — не одно и то же. Браузер применяет CSS, прячет скрытые блоки, формирует переносы. Простая очистка тегов даёт приблизительный результат, который для большинства учётных задач достаточен, но не воспроизводит визуальное представление страницы.
Что нужно определить до выбора способа
Прежде чем писать код, ответьте на три вопроса. Первый — откуда приходит HTML: из доверенного источника (своё письмо, свой сайт) или из внешнего непредсказуемого. Внешний HTML может содержать битую разметку, скрипты и нестандартные символы, и простые методы на нём дадут сбои.
Второй вопрос — где выполняется код. Часть решений (например, COM-объект InternetExplorer.Application или htmlfile) работает только на Windows-клиенте и недоступна на сервере под Linux или в веб-клиенте. Если обработка идёт в фоновом задании на сервере, выбор сужается до штатных средств платформы и регулярных выражений.
Третий вопрос — нужен ли текст «как есть» или структурированный. Если из HTML нужно вытащить конкретные данные (цену, артикул, заголовок), то лучше не чистить текст целиком, а сразу искать нужные узлы в DOM — это точнее и устойчивее к изменениям оформления.
Как выбрать действие
Способ 1. Регулярное выражение для удаления тегов
Самый быстрый в реализации вариант — удалить все подстроки вида <...> регулярным выражением. В 1С регулярные выражения доступны через COM-объект VBScript.RegExp (Windows) или через штатные средства работы со строками, если теги простые. Примерная логика: сначала удалить блоки <script> и <style> целиком, затем заменить все оставшиеся теги на пустую строку, затем заменить HTML-сущности вроде на пробел.
Главное ограничение метода — хрупкость. Если внутри атрибута тега встретится символ «больше», или текст содержит математическое выражение со знаками сравнения, регулярное выражение сработает неправильно. Скрипты и стили, не удалённые отдельно, попадут в результат как мусорный текст.
Метод оправдан, когда HTML генерируется вашей же системой и его формат контролируется: например, очистка поля «ОписаниеHTML» в справочнике номенклатуры, куда менеджеры вставляют текст из редактора. Для парсинга чужих сайтов он не подходит.
Способ 2. Построитель DOM — штатный механизм платформы
В современных версиях платформы доступны объекты ЧтениеHTML и ПостроительDOM. Они разбирают HTML в объектную модель документа, после чего можно обойти дерево узлов и собрать только текстовое содержимое. Это самый корректный способ: парсер понимает структуру документа, вложенность тегов и не ломается на сложной разметке.
Общая схема такова: создать объект ЧтениеHTML, открыть строку с HTML, построить документ через ПостроительDOM, затем рекурсивно обойти дочерние узлы корневого элемента. Узлы с типом «Текст» добавляются в результат, элементы script и style пропускаются. Для блочных элементов (p, div, br, tr) имеет смысл добавлять перевод строки, чтобы текст не склеивался в одну строку.
Преимущество подхода — работа на сервере и в фоновых заданиях без внешних компонентов. Недостаток — требуется аккуратный рекурсивный обход дерева и обработка особых случаев: таблиц, списков, скрытых блоков. Для таблиц обычно ячейки разделяют табуляцией или точкой с запятой, чтобы сохранить читаемость.
Способ 3. COM-объект htmlfile на Windows-клиенте
На толстом или тонком клиенте под Windows можно использовать COM-объект htmlfile (встроенный парсер HTML из Internet Explorer). Документу присваивается HTML-строка, после чего свойство innerText корневого элемента возвращает текст примерно так, как его видел бы пользователь в старом браузере. Код получается очень коротким.
У способа серьёзные ограничения. Он не работает на сервере Linux, в веб-клиенте и в фоновых заданиях; поведение зависит от версии системных библиотек Windows. Кроме того, загрузка внешнего HTML через COM-парсер теоретически может выполнять вредоносный скрипт, если не отключены активные сценарии, — для недоверенного контента это риск.
Использовать htmlfile разумно только как временное решение в старых конфигурациях, где код уже написан и работает на клиентских машинах. Для новой разработки предпочтителен построитель DOM.
Извлечение конкретных данных, а не всего текста
Часто реальная задача — не очистить текст, а забрать из страницы конкретные значения: цену товара, статус заказа, заголовок новости. В этом случае текст целиком не нужен. После построения DOM используйте методы поиска элементов: по идентификатору, по имени тега, по имени класса. Найденному элементу читайте текстовое содержимое или значение атрибута.
Практическая рекомендация — привязываться к наиболее стабильным признакам. Идентификаторы элемента надёжнее, чем порядковый номер вложенного div, а класс вроде «product-price» надёжнее, чем «третий span во втором блоке». Вёрстка сайтов меняется, и хрупкие привязки к структуре ломаются первыми.
После извлечения значение нужно нормализовать: убрать неразрывные пробелы из цены, привести разделитель дробной части, обрезать пробелы. Только после этого преобразовывать строку в число или дату — иначе преобразование вернёт ошибку или ноль.
- 1Получите HTML-строку и убедитесь, что она в корректной кодировке (обычно UTF-8)
- 2Создайте ЧтениеHTML, откройте строку, постройте документ через ПостроительDOM
- 3Найдите нужные элементы по идентификатору, классу или имени тега
- 4Прочитайте текстовое содержимое или атрибут, очистите от лишних пробелов и сущностей
- 5Преобразуйте к целевому типу (число, дата) и проверьте результат на контрольном примере
Проверка результата и обработка ошибок
Любой разбор HTML должен быть обёрнут в попытку-исключение: внешний контент может быть пустым, обрезанным или не являться HTML вовсе (например, сервер вернул JSON или страницу ошибки). Перед парсингом полезно проверить, что строка непустая и содержит признаки разметки.
Для контроля качества сравните результат с ожиданиями: длина извлечённого текста не должна быть нулевой, в нём не должно быть угловых скобок и подстрок «function» или «var» из скриптов. Если извлекается число, проверьте, что оно попадает в разумный диапазон — это ловит ситуацию, когда сайт поменял вёрстку и вы забрали не то поле.
При массовой обработке (например, загрузка описаний тысяч товаров) ведите журнал ошибок: какой элемент не распарсился и почему. Без журнала единичные сбои теряются, и данные в базе молча остаются пустыми.
Как проверить результат
Читаемый текст без тегов, скриптов и служебных кодов сущностей
Остатки разметки, фрагменты JavaScript, коды вида &nbsp;
Текст присутствует и соответствует объёму исходного содержимого
Пустая строка или подозрительно короткий фрагмент
Число преобразуется и попадает в ожидаемый диапазон
Ноль, ошибка преобразования или значение из соседнего поля
Код отрабатывает и на клиенте, и на сервере, где он реально вызывается
Ошибка создания COM-объекта при переносе обработки на сервер
Производительность при массовой обработке
При разовой очистке поля скорость не важна, но при загрузке каталога из десятков тысяч позиций разница между методами заметна. Регулярные выражения обычно быстрее полного построения DOM, однако разница нивелируется сетевыми операциями: загрузка самого HTML по HTTP занимает на порядки больше времени, чем его разбор.
Оптимизировать стоит в первую очередь получение данных: пакетные запросы, сжатие ответов, повторное использование соединения. Сам парсинг выносите в фоновые задания, чтобы не блокировать интерфейс пользователя. Для повторяющихся загрузок полезно кэшировать уже обработанные страницы по хешу содержимого.
Что важно запомнить
Для надёжного извлечения текста из HTML в 1С используйте ЧтениеHTML и ПостроительDOM с обходом текстовых узлов — это работает на сервере и не ломается на сложной разметке. Регулярные выражения допустимы только для простого контролируемого HTML, а COM-объекты браузера — устаревший вариант, ограниченный Windows-клиентом. Всегда обрабатывайте ошибки парсинга и проверяйте результат на контрольных примерах.
Частые вопросы
Можно ли получить текст из HTML без построения DOM?
Да, для простого и контролируемого HTML достаточно регулярного выражения, удаляющего теги, с предварительным вырезанием блоков script и style. Однако на сложной или битой разметке такой подход даёт ошибки, поэтому для внешних данных лучше полноценный парсинг.
Почему код с COM-объектом работает на клиенте, но падает на сервере?
COM-объекты вроде htmlfile существуют только в Windows и требуют интерактивной среды. На сервере под Linux их нет в принципе. Перенесите разбор на штатные ЧтениеHTML и ПостроительDOM — они работают на любой платформе сервера 1С.
Как извлечь текст, который формируется JavaScript на странице?
Штатными средствами 1С — никак: парсер не выполняет скрипты. Варианты обхода: найти, откуда скрипт берёт данные (часто это отдельный JSON-запрос, который можно повторить напрямую), или использовать внешний инструмент с полноценным браузерным движком и передавать результат в 1С.
Что делать с HTML-сущностями вида или &?
Их нужно заменить на соответствующие символы после извлечения текста. При работе через построитель DOM большинство сущностей декодируется автоматически в текстовых узлах. При очистке регулярными выражениями замены придётся делать вручную через СтрЗаменить по списку частых сущностей.
Как сохранить структуру текста — абзацы и переносы строк?
При обходе дерева DOM добавляйте перевод строки после блочных элементов: p, div, br, tr, li, заголовков. Для ячеек таблицы вставляйте разделитель, например табуляцию. Тогда очищенный текст сохранит читаемую структуру вместо сплошной склеенной строки.
Опасно ли парсить HTML из писем и внешних сайтов?
Сам разбор через построитель DOM безопасен — скрипты не выполняются. Опасность представляет загрузка такого HTML в COM-объекты браузера или в поле HTML-документа без очистки: там активное содержимое может сработать. Для отображения внешнего HTML предварительно удаляйте скрипты и обработчики событий.