Работа с HTML-контентом в 1С:Предприятие становится всё более востребованной задачей.hether это парсинг веб-страниц для интеграции данных, обработка почтовых сообщений с разметкой или извлечение информации из отчётов в формате HTML — умение корректно вытаскивать текст из тегов экономит часы рутинной работы. Однако стандартные инструменты платформы не оптимизированы для разбора разметки, что заставляет разработчиков искать обходные пути.
В этой статье мы разберём 5 практических способов извлечения текста из HTML в 1С 8.3 и 1С 8.2: от элементарных функций замены тегов до использования внешних библиотек и регулярных выражений. Каждый метод сопровождён реальными примерами кода, которые можно адаптировать под свои задачи. Особое внимание уделено обработке сложных случаев — вложенных тегов, спецсимволов и кодировок.
Если вы ранее сталкивались с проблемой, когда после загрузки HTML в строку 1С вместо чистого текста получали кашу из тегов — этот материал поможет systematize подходы и выбрать оптимальное решение для вашего сценария.
1. Простейший метод: замена тегов через СтроковыеФункции
Самый быстрый, но наименее надёжный способ — удаление всех HTML-тегов с помощью функции СтрЗаменить(). Подходит для простых случаев, когда разметка минимальна и не содержит вложенных конструкций.
Основной принцип: последовательно заменяем все пары тегов (от <b> до </div>) на пустую строку. Минус метода — он не учитывает атрибуты тегов и может оставить артефакты вроде <br/> или <img src="...">.
Функция УдалитьHTMLТеги(СтрокаHTML)
Результат = СтрокаHTML;
// Удаляем теги вместе с атрибутами (упрощённо)
Результат = СтрЗаменить(Результат, "<", "<");
Результат = СтрЗаменить(Результат, ">", ">");
Результат = СтрЗаменить(Результат, "<", "");
Результат = СтрЗаменить(Результат, ">", "");
// Дополнительно чистим одиночные теги
Результат = СтрЗаменить(Результат, " ", " ");
Возврат СокрЛП(Результат);
КонецФункции
- ✅ Плюсы: не требует внешних компонент, работает в любых конфигурациях.
- ❌ Минусы: не обрабатывает вложенные теги, может сломать спецсимволы (
<,>). - 🔧 Когда использовать: для одноразовых задач с простым HTML (например, очистка почтового сообщения от форматирования).
⚠️ Внимание: Этот метод не подходит для HTML с JavaScript-кодом или CSS-стилями. Если в строке встречаются конструкции вроде <script>...</script>, их содержимое также будет удалено, что может исказить итоговый текст.
2. Использование регулярных выражений для точного парсинга
Регулярные выражения позволяют гибко управлять процессом извлечения текста, учитывая специфику HTML-разметки. В 1С для этого используется объект РегулярноеВыражение (доступен с версии 8.3.10).
Пример ниже удаляет все теги, включая их атрибуты, но сохраняет текст между ними. Особое внимание уделено обработке многострочных тегов и комментариев (<!-- ... -->):
Функция ИзвлечьТекстРегуляркой(HTML)
РегВыражение = Новый РегулярноеВыражение(
"<[^>]+>|<!--.*?-->",
"гм" // Флаги: глобальный поиск + многострочный режим
);
Результат = РегВыражение.Заменить(HTML, "");
Возврат СокрЛП(Результат);
КонецФункции
Для более сложных случаев (например, извлечения текста только из определённых тегов) можно модифицировать шаблон. Например, чтобы достать текст только из тегов <p>:
РегВыражение = Новый РегулярноеВыражение(
"<p[^>]>(.?)</p>",
"гм"
);
СписокАбзацев = РегВыражение.Найти(HTML);
| Шаблон регулярного выражения | Что удаляет/извлекает | Пример применения |
|---|---|---|
<[^>]+> |
Все теги без атрибутов | Очистка простого HTML |
<(\w+)([^>])>.?</\1> |
Текст между парными тегами | Извлечение содержимого <div> |
<!--.*?--> |
HTML-комментарии | Очистка от служебной разметки |
⚠️ Внимание: Регулярные выражения плохо справляются с вложенными тегами одного типа (например, <div><div>текст</div></div>). Для таких случаев лучше использовать специализированные парсеры.
3. Парсинг HTML через DOM (внешние компоненты)
Для профессиональной работы с HTML в 1С рекомендуется подключать внешние библиотеки, которые преобразуют разметку в DOM-дерево (Document Object Model). Это позволяет точно извлекать текст с учётом иерархии тегов.
Наиболее популярные решения:
- 📦 1Script.HtmlParser — компонента для 1С, основанная на HtmlAgilityPack (C#). Поддерживает XPath-запросы.
- 🔗 COM-объект MSHTML — встроенный в Windows парсер IE, доступный через
Новый COMОбъект("HTMLFile"). - 🐍 Python-скрипты — интеграция с BeautifulSoup через механизм внешних обработок.
Пример работы с 1Script.HtmlParser:
// Подключаем компоненту (предварительно добавьте в справочник внешних обработок)
Парсер = Новый HtmlParser;
Документ = Парсер.Загрузить(HTMLСтрока);
// Извлекаем текст из всех тегов
СписокАбзацев = Документ.ВыбратьУзлы("//p");
Для Каждого Узел Из СписокАбзацев Цикл
Сообщить(Узел.ВнутреннийТекст);
КонецЦикла;
Преимущество DOM-парсинга — возможность селективного извлечения текста. Например, можно получить содержимое только из тегов с определённым классом (class="price") или идентификатором.
Установить библиотеку в каталог 1С|Добавить ссылку в справочник внешних обработок|Проверить права доступа к COM-объектам|Создать резервную копию базы-->
4. Обработка специальных символов и кодировок
При извлечении текста из HTML часто возникают проблемы с кодировками и HTML-сущностями (например, , <). Их необходимо преобразовывать в читаемый вид.
В 1С для этого можно использовать:
- Функцию
HTMLДекодировать()(доступна в некоторых внешних библиотеках). - Ручную замену через
СтрЗаменить():
Функция ДекодироватьHTMLСущности(Текст)
Текст = СтрЗаменить(Текст, " ", " ");
Текст = СтрЗаменить(Текст, "<", "<");
Текст = СтрЗаменить(Текст, ">", ">");
Текст = СтрЗаменить(Текст, """, """");
Текст = СтрЗаменить(Текст, "&", "&");
Возврат Текст;
КонецФункции
Для работы с кодировками (например, если HTML в UTF-8, а 1С ожидает 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-разметкой или парсинг веб-страниц. Для почты можно использовать встроенные механизмы 1С, а для веб-страниц — 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>", Символы.ПС);
Почему после извлечения текста остаются символы   или  ?
Это неразрывные пробелы в HTML (код в десятичном и шестнадцатеричном формате). Замените их на обычные пробелы:
Текст = СтрЗаменить(Текст, " ", " ");
Текст = СтрЗаменить(Текст, " ", " ");
Можно ли извлечь текст из PDF, преобразованного в HTML?
PDF, конвертированный в HTML, часто содержит служебные теги для позиционирования текста (например, <div>). В этом случае:
- Используйте DOM-парсер для извлечения текста из
div. - Удаляйте атрибуты
style, чтобы упростить разметку:
HTML = СтрЗаменить(HTML, "[^""]""", "");
Как обработать HTML с ошибками разметки (незакрытые теги)?
Для "битых" HTML используйте внешние компоненты с функцией автоисправления, например:
- HtmlAgilityPack (через 1Script.HtmlParser) — автоматически закрывает теги.
- Tidy — утилита для очистки HTML, которую можно интегрировать через командную строку.
Пример для HtmlAgilityPack:
Парсер.Настройки.АвтоИсправлять = Истина;
Документ = Парсер.Загрузить(БитыйHTML);
Какие ограничения накладывает 1С на работу с большими HTML-файлами?
При обработке HTML объёмом >10 МБ возможны:
- 🐢 Замедление работы — строковые операции в 1С не оптимизированы для больших данных.
- 🚫 Ошибки памяти — при использовании регулярных выражений или DOM-парсеров.
- 🔄 Решение: разбивайте HTML на фрагменты или используйте потоковую обработку (например, через САХ-парсер).