Работа с HTML-контентом в 1С:Предприятие становится всё более востребованной задачей.hether это парсинг веб-страниц для интеграции данных, обработка почтовых сообщений с разметкой или извлечение информации из отчётов в формате HTML — умение корректно вытаскивать текст из тегов экономит часы рутинной работы. Однако стандартные инструменты платформы не оптимизированы для разбора разметки, что заставляет разработчиков искать обходные пути.

В этой статье мы разберём 5 практических способов извлечения текста из HTML в 1С 8.3 и 1С 8.2: от элементарных функций замены тегов до использования внешних библиотек и регулярных выражений. Каждый метод сопровождён реальными примерами кода, которые можно адаптировать под свои задачи. Особое внимание уделено обработке сложных случаев — вложенных тегов, спецсимволов и кодировок.

Если вы ранее сталкивались с проблемой, когда после загрузки HTML в строку вместо чистого текста получали кашу из тегов — этот материал поможет systematize подходы и выбрать оптимальное решение для вашего сценария.

1. Простейший метод: замена тегов через СтроковыеФункции

Самый быстрый, но наименее надёжный способ — удаление всех HTML-тегов с помощью функции СтрЗаменить(). Подходит для простых случаев, когда разметка минимальна и не содержит вложенных конструкций.

Основной принцип: последовательно заменяем все пары тегов (от <b> до </div>) на пустую строку. Минус метода — он не учитывает атрибуты тегов и может оставить артефакты вроде <br/> или <img src="...">.

Функция УдалитьHTMLТеги(СтрокаHTML)

Результат = СтрокаHTML;

// Удаляем теги вместе с атрибутами (упрощённо)

Результат = СтрЗаменить(Результат, "<", "<");

Результат = СтрЗаменить(Результат, ">", ">");

Результат = СтрЗаменить(Результат, "<", "");

Результат = СтрЗаменить(Результат, ">", "");

// Дополнительно чистим одиночные теги

Результат = СтрЗаменить(Результат, "&nbsp;", " ");

Возврат СокрЛП(Результат);

КонецФункции

  • Плюсы: не требует внешних компонент, работает в любых конфигурациях.
  • Минусы: не обрабатывает вложенные теги, может сломать спецсимволы (&lt;, &gt;).
  • 🔧 Когда использовать: для одноразовых задач с простым HTML (например, очистка почтового сообщения от форматирования).
⚠️ Внимание: Этот метод не подходит для HTML с JavaScript-кодом или CSS-стилями. Если в строке встречаются конструкции вроде <script>...</script>, их содержимое также будет удалено, что может исказить итоговый текст.

2. Использование регулярных выражений для точного парсинга

Регулярные выражения позволяют гибко управлять процессом извлечения текста, учитывая специфику HTML-разметки. В для этого используется объект РегулярноеВыражение (доступен с версии 8.3.10).

Пример ниже удаляет все теги, включая их атрибуты, но сохраняет текст между ними. Особое внимание уделено обработке многострочных тегов и комментариев (<!-- ... -->):

Функция ИзвлечьТекстРегуляркой(HTML)

РегВыражение = Новый РегулярноеВыражение(

"<[^>]+>|<!--.*?-->",

"гм" // Флаги: глобальный поиск + многострочный режим

);

Результат = РегВыражение.Заменить(HTML, "");

Возврат СокрЛП(Результат);

КонецФункции

Для более сложных случаев (например, извлечения текста только из определённых тегов) можно модифицировать шаблон. Например, чтобы достать текст только из тегов <p>:

РегВыражение = Новый РегулярноеВыражение(

"<p[^>]>(.?)</p>",

"гм"

);

СписокАбзацев = РегВыражение.Найти(HTML);

Шаблон регулярного выражения Что удаляет/извлекает Пример применения
<[^>]+> Все теги без атрибутов Очистка простого HTML
<(\w+)([^>])>.?</\1> Текст между парными тегами Извлечение содержимого <div>
<!--.*?--> HTML-комментарии Очистка от служебной разметки
⚠️ Внимание: Регулярные выражения плохо справляются с вложенными тегами одного типа (например, <div><div>текст</div></div>). Для таких случаев лучше использовать специализированные парсеры.
📊 Какой метод извлечения текста вы используете чаще?
Строковые функции
Регулярные выражения
Внешние компоненты
Собственный алгоритм

3. Парсинг HTML через DOM (внешние компоненты)

Для профессиональной работы с HTML в рекомендуется подключать внешние библиотеки, которые преобразуют разметку в DOM-дерево (Document Object Model). Это позволяет точно извлекать текст с учётом иерархии тегов.

Наиболее популярные решения:

  • 📦 1Script.HtmlParser — компонента для , основанная на HtmlAgilityPack (C#). Поддерживает XPath-запросы.
  • 🔗 COM-объект MSHTML — встроенный в Windows парсер IE, доступный через Новый COMОбъект("HTMLFile").
  • 🐍 Python-скрипты — интеграция с BeautifulSoup через механизм внешних обработок.

Пример работы с 1Script.HtmlParser:

// Подключаем компоненту (предварительно добавьте в справочник внешних обработок)

Парсер = Новый HtmlParser;

Документ = Парсер.Загрузить(HTMLСтрока);

// Извлекаем текст из всех тегов

СписокАбзацев = Документ.ВыбратьУзлы("//p");

Для Каждого Узел Из СписокАбзацев Цикл

Сообщить(Узел.ВнутреннийТекст);

КонецЦикла;

Преимущество DOM-парсинга — возможность селективного извлечения текста. Например, можно получить содержимое только из тегов с определённым классом (class="price") или идентификатором.

Установить библиотеку в каталог 1С|Добавить ссылку в справочник внешних обработок|Проверить права доступа к COM-объектам|Создать резервную копию базы-->

4. Обработка специальных символов и кодировок

При извлечении текста из HTML часто возникают проблемы с кодировками и HTML-сущностями (например, &nbsp;, &lt;). Их необходимо преобразовывать в читаемый вид.

В для этого можно использовать:

  1. Функцию HTMLДекодировать() (доступна в некоторых внешних библиотеках).
  2. Ручную замену через СтрЗаменить():
Функция ДекодироватьHTMLСущности(Текст)

Текст = СтрЗаменить(Текст, "&nbsp;", " ");

Текст = СтрЗаменить(Текст, "&lt;", "<");

Текст = СтрЗаменить(Текст, "&gt;", ">");

Текст = СтрЗаменить(Текст, "&quot;", """");

Текст = СтрЗаменить(Текст, "&amp;", "&");

Возврат Текст;

КонецФункции

Для работы с кодировками (например, если HTML в UTF-8, а ожидает Windows-1251) используйте:

Текст = СтрПреобразоватьКодировку(HTMLСтрока, КодировкаТекста.UTF8, КодировкаТекста.ANSI);
Что делать если текст отображается кракозябрами?

Это признак несовпадения кодировок. Проверьте:

1. Кодировку исходного HTML (обычно указана в теге <meta charset="...">).

2. Кодировку, которую ожидает 1С (по умолчанию — ANSI).

3. Используйте СтрПреобразоватьКодировку() для приведения к единому стандарту.

5. Парсинг таблиц из HTML

Извлечение данных из HTML-таблиц — одна из самых востребованных задач. Здесь без DOM-парсинга не обойтись. Рассмотрим пример с использованием 1Script.HtmlParser:

Парсер = Новый HtmlParser;

Документ = Парсер.Загрузить(HTMLСтрока);

// Получаем все таблицы на странице

Таблицы = Документ.ВыбратьУзлы("//table");

// Обрабатываем первую таблицу

Если Таблицы.Количество() > 0 Тогда

Таблица = Таблицы[0];

Строки = Таблица.ВыбратьУзлы(".//tr");

Для Каждого Строка Из Строки Цикл

Ячейки = Строка.ВыбратьУзлы(".//td | .//th");

Для Каждого Ячейка Из Ячейки Цикл

Сообщить(Ячейка.ВнутреннийТекст);

КонецЦикла;

КонецЦикла;

КонецЕсли;

Для сложных таблиц (с объединёнными ячейками colspan/rowspan) потребуется дополнительная логика обработки. В таких случаях целесообразно:

  • 📊 Преобразовать HTML в Excel через COM-объект Excel.Application, а затем читать данные как из таблицы.
  • 🔄 Использовать промежуточный формат (например, конвертировать HTML в CSV).
💡

Если таблица имеет сложную структуру, попробуйте сначала сохранить её в Excel через браузер (кнопка "Экспорт"), а затем загрузить файл в 1С стандартными средствами.

6. Автоматизация: обработка почты и веб-страниц

Частая задача — извлечение текста из писем с HTML-разметкой или парсинг веб-страниц. Для почты можно использовать встроенные механизмы , а для веб-страниц — HTTP-запросы.

Пример 1: Очистка текста письма

Письмо = ПолучитьОбъектПоСсылке(СсылкаНаПисьмо);

Если Письмо.ТелоФорматаHTML Тогда

Текст = ИзвлечьТекстРегуляркой(Письмо.Тело);

Письмо.Тело = Текст; // Сохраняем очищенный текст

КонецЕсли;

Пример 2: Парсинг веб-страницы

HTTPСоединение = Новый HTTPСоединение("www.example.com");

Ответ = HTTPСоединение.Получить("/page.html");

HTML = Ответ.ПолучитьТекст();

Парсер = Новый HtmlParser;

Документ = Парсер.Загрузить(HTML);

Заголовок = Документ.ВыбратьУзел("//h1").ВнутреннийТекст;

⚠️ Внимание: При парсинге веб-страниц учитывайте:

- Robots.txt: некоторые сайты запрещают автоматизированный сбор данных.

- DDoS-защиту: частые запросы могут заблокировать ваш IP.

- Динамический контент: если данные подгружаются JavaScript, потребуется эмуляция браузера (например, через Selenium).

💡

Для регулярного парсинга веб-страниц лучше использовать специализированные сервисы или прокси, чтобы избежать блокировок.

Сравнение методов извлечения текста из HTML

Метод Сложность реализации Точность Производительность Когда применять
Строковые функции ❌ Низкая ⚡ Быстро Простой HTML без вложенных тегов
Регулярные выражения ⭐⭐ ⚠️ Средняя ⚡⚡ Средне HTML со стандартной структурой
DOM-парсер (внешние компоненты) ⭐⭐⭐ ✅ Высокая ⚡⚡⚡ Медленнее Сложный HTML, таблицы, селективный парсинг
COM-объект MSHTML ⭐⭐ ✅ Высокая ⚡⚡ Средне Windows-окружение, поддержка IE

FAQ: Частые вопросы по извлечению текста из HTML в 1С

Как извлечь текст из HTML, если он загружен в поле типа "HTMLДокумент"?

Поле HTMLДокумент имеет метод ПолучитьТекст(), который возвращает чистый текст без разметки:

Текст = Объект.HTMLПоле.ПолучитьТекст();

Если нужно сохранить часть форматирования (например, переносы строк), используйте:

Текст = СтрЗаменить(Объект.HTMLПоле.ПолучитьHTML(), "<br>", Символы.ПС);
Почему после извлечения текста остаются символы &#160; или &#xA0;?

Это неразрывные пробелы в HTML (код &nbsp; в десятичном и шестнадцатеричном формате). Замените их на обычные пробелы:

Текст = СтрЗаменить(Текст, " ", " ");

Текст = СтрЗаменить(Текст, " ", " ");

Можно ли извлечь текст из PDF, преобразованного в HTML?

PDF, конвертированный в HTML, часто содержит служебные теги для позиционирования текста (например, <div>). В этом случае:

  1. Используйте DOM-парсер для извлечения текста из div.
  2. Удаляйте атрибуты style, чтобы упростить разметку:
HTML = СтрЗаменить(HTML, "[^""]""", "");
Как обработать HTML с ошибками разметки (незакрытые теги)?

Для "битых" HTML используйте внешние компоненты с функцией автоисправления, например:

  • HtmlAgilityPack (через 1Script.HtmlParser) — автоматически закрывает теги.
  • Tidy — утилита для очистки HTML, которую можно интегрировать через командную строку.

Пример для HtmlAgilityPack:

Парсер.Настройки.АвтоИсправлять = Истина;

Документ = Парсер.Загрузить(БитыйHTML);

Какие ограничения накладывает 1С на работу с большими HTML-файлами?

При обработке HTML объёмом >10 МБ возможны:

  • 🐢 Замедление работы — строковые операции в не оптимизированы для больших данных.
  • 🚫 Ошибки памяти — при использовании регулярных выражений или DOM-парсеров.
  • 🔄 Решение: разбивайте HTML на фрагменты или используйте потоковую обработку (например, через САХ-парсер).