Как преобразовать HTML-текст в простой текст в 1С: сохраняем переносы строк и пробелы

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

При интеграции 1С со сторонними сервисами через HTTP-запросы часто возникает задача очистки полученного текста от HTML-тегов. Типичная проблема заключается в том, что стандартные методы извлечения текстового содержимого часто «склеивают» слова, игнорируя абзацы, теги BR и блочные элементы DIV или P. В результате вместо читаемого текста получается сплошная строка. В этой статье мы подробно разберем несколько способов решения этой задачи, проанализируем их плюсы и минусы, а также выясним, как правильно передавать результат в формате JSON.

Способ 1. Использование объекта ФорматированныйДокумент

Это наиболее простой и эффективный встроенный способ получения чистого текста из HTML на стороне сервера. Объект ФорматированныйДокумент берет на себя всю работу по парсингу разметки и корректному преобразованию структурных элементов HTML в символы переноса строк.

Рассмотрим пошагово, как реализовать этот алгоритм:


// Исходный текст с HTML-разметкой
ТекстHTML = "<p>Первая строка</p><br><div>Вторая строка</div>";

// Создаем объект
ФорматированныйДокумент = Новый ФорматированныйДокумент;

// Загружаем HTML-текст. Второй параметр — структура для картинок (может быть пустой)
ФорматированныйДокумент.УстановитьHTML(ТекстHTML, Новый Структура);

// Извлекаем обычный текст
ОбычныйТекст = ФорматированныйДокумент.ПолучитьТекст();

Важный нюанс: метод ПолучитьТекст() автоматически подставляет символы Символы.ПС (перевод строки) там, где в HTML использовались блочные теги. Это избавляет от необходимости вручную заменять <br> на переносы.

Однако стоит учитывать ограничение: этот объект доступен только на сервере. Кроме того, если ваш сервер 1С работает под управлением ОС Linux, необходимо убедиться, что установлены графические библиотеки (например, libgsf), иначе создание объекта может вызвать исключение.

Способ 2. Использование инструментов БСП (Библиотека стандартных подсистем)

Если ваша конфигурация построена на базе БСП (что справедливо для большинства современных решений вроде ERP, УТ 11 или БП 3.0), вам не нужно писать код вручную. Проанализируем возможности общего модуля СтроковыеФункцииКлиентСервер.

В этой библиотеке существует готовая функция, которая не только удаляет теги, но и корректно обрабатывает HTML-сущности (например, заменяет &nbsp; на неразрывный пробел, а &quot; на кавычки).


// Пример использования функции БСП
ЧистыйТекст = СтроковыеФункцииКлиентСервер.ПолучитьТекстИзHtml(ИсходныйТекстHTML);

Этот метод является предпочтительным, так как он протестирован разработчиками 1С и учитывает множество краевых случаев, которые легко упустить при самостоятельном написании парсера.

Способ 3. Работа с DOM (ПостроительDOM)

Иногда требуется более тонкая настройка, или использование ФорматированныйДокумент невозможно. Посмотрим, почему обычное чтение через DOM-дерево может выдавать текст без пробелов. Когда мы обращаемся к свойству ТекстовоеСодержимое (textContent) всего документа, система просто собирает все текстовые узлы подряд.

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

  1. Если узел — это текст, добавляем его в итоговую строку.
  2. Если узел — это элемент P, DIV, BR или TR, то после обработки его содержимого нужно добавить Символы.ПС.

Такой подход требует больше кода, но работает быстрее, чем создание тяжелого объекта ФорматированныйДокумент.

Особенности передачи текста в HTTP-сервисах и формат JSON

Разберем ситуацию, с которой столкнулся автор темы: после получения чистого текста и записи его в JSON-ответ, вместо визуальных переносов строк появляются символы \n. Проанализируем, почему это происходит.

Согласно спецификации JSON (RFC 8259):

Когда вы используете объект ЗаписьJSON, платформа 1С автоматически выполняет это преобразование. Это не ошибка, а правильное следование стандарту. Если вы принудительно замените \n на пробелы в 1С, вы лишите принимающую сторону возможности отобразить текст красиво (с абзацами). Правильным подходом будет передача строки с \n, так как любой стандартный парсер JSON на стороне клиента (будь то JavaScript, мобильное приложение или другой сервер) при чтении преобразует \n обратно в физический перевод строки.

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

Если вам нужно максимально легкое решение без использования объектов платформы 1С, можно прибегнуть к регулярным выражениям через COM-объект (для Windows-серверов). Это позволит быстро «вырезать» теги, предварительно заменив теги переноса строки на понятные системе символы.

Рассмотрим пример логики:

  1. Сначала заменим все вхождения <br> и </p> на Символы.ПС.
  2. Затем применим паттерн <[^>]*> для удаления всех оставшихся тегов в угловых скобках.
  3. В конце декодируем базовые спецсимволы HTML.

Резюме

Для решения задачи преобразования HTML в текст в 1С рекомендуется придерживаться следующей иерархии методов:

Помните, что при передаче результата через JSON символы \n являются нормой. Не стоит заменять их на пробелы, если вашей целью является сохранение читабельной структуры текста для конечного пользователя.

← На главную