Как перекодировать спецсимволы HTML в обычный текст в 1С

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

При обмене данными с веб-сервисами или парсинге сайтов разработчики часто сталкиваются с ситуацией, когда вместо понятных символов (например, знаков «меньше», «больше» или кавычек) приходят их кодовые обозначения: <, > или числовые последовательности вида <. Стандартная функция РаскодироватьСтроку со способом кодирования КодировкаURL в этих случаях не помогает, так как она предназначена для работы с процентами (URL-encoding), а не с HTML-сущностями.

В этой статье мы подробно разберем, как преобразовать такие строки в читаемый вид, проанализируем различные подходы и выберем наиболее эффективные инструменты платформы 1С:Предприятие 8.

Метод 1. Ручное декодирование числовых кодов через строковые функции

Этот способ основан на алгоритмическом поиске вхождений числовых кодов и их замене на соответствующие символы встроенной функции Символ(). Рассмотрим ситуацию, когда данные приходят в формате &#КодСимвола;. Проанализируем представленный ниже алгоритм:


&НаКлиенте
Функция ЗаменаHTMLКодов(Знач СтрокаТекста)
    // Разрезаем строку, используя спецсимволы начала кода как разделители
    МногострочныйСписок = СтрЗаменить(СтрокаТекста, "&#", Символы.ПС);
    МногострочныйСписок = СтрЗаменить(МногострочныйСписок, ";", Символы.ПС);
    
    Для НомерСтроки = 1 По СтрЧислоСтрок(МногострочныйСписок) Цикл
        ОднострочнаяСтрока = СтрПолучитьСтроку(МногострочныйСписок, НомерСтроки);
        
        // Проверяем, является ли текущая строка числовым кодом
        Если Найти(ОднострочнаяСтрока, " ") > 0 Или ПустаяСтрока(ОднострочнаяСтрока) Тогда
            Продолжить;
        КонецЕсли;
        
        Попытка
            КодСимвола = Число(ОднострочнаяСтрока);
        Исключение
            Продолжить;
        КонецПопытки;
        
        // Формируем замену
        ПодстрокаЗамены = Символ(КодСимвола);
        ЗаменяемаяСтрока = "&#" + ОднострочнаяСтрока + ";";
        СтрокаТекста = СтрЗаменить(СтрокаТекста, ЗаменяемаяСтрока, ПодстрокаЗамены);
    КонецЦикла;
    
    Возврат СтрокаТекста;
КонецФункции

Разберем по шагам, как работает этот код:

  1. Мы преобразуем исходную строку в многострочный текст, заменяя маркеры начала &# и конца ; на переносы строк. Это позволяет нам изолировать потенциальные коды.
  2. В цикле мы проверяем каждую полученную подстроку. Если она успешно преобразуется в число, значит, перед нами код символа Unicode.
  3. С помощью функции Символ(КодСимвола) мы получаем реальное начертание (например, из 60 получаем «<»).
  4. На финальном этапе мы заменяем исходную кодовую последовательность в основном тексте на найденный символ.

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

Метод 2. Использование объектов ПостроительDOM и ЧтениеHTML

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

Рассмотрим пример кода, который выполняет конвертацию:


ЧтениеHTML = Новый ЧтениеHTML;
// ПредставлениеHTML - это ваша исходная строка с кодами
ЧтениеHTML.УстановитьСтроку(ПредставлениеHTML);

ПостроительDOM = Новый ПостроительDOM;
ДокументHTML = ПостроительDOM.Прочитать(ЧтениеHTML);
ЧтениеHTML.Закрыть;

// Извлекаем текстовое содержимое из тела документа
Результат = ДокументHTML.Тело.ТекстовоеСодержимое;
Сообщить(Результат);

Почему стоит выбрать этот метод?

Отображение результата в поле HTML-документа

Часто возникает вопрос: почему при вставке строки в ПолеHTMLДокумента на управляемой форме вместо отформатированного текста отображается исходный код? Выясним причину этой ситуации.

Если вы хотите, чтобы текст отображался как жирный или крупный (например, <strong>Текст</strong>), вам нужно передавать в свойство поля HTML именно исходный HTML-код, а не предварительно декодированную строку. Браузерный движок внутри формы сам преобразует коды символов в их визуальное представление.

Однако, если вы формируете шаблон HTML программно, как в примере ниже, убедитесь, что вы не «экранируете» теги дважды:


ШаблонHTML = "<html><body><div style='font-weight:bold;'>&ТекстВставки</div></body></html>";
// Если Результат2 уже содержит < или >, СтрЗаменить просто вставит их в код
ПредставлениеHTML = СтрЗаменить(ШаблонHTML, "&ТекстВставки", Результат2);
// Устанавливаем итоговую строку в элемент формы (Поле HTML-документа)
Элементы.ПолеHTML.УстановитьТекст(ПредставлениеHTML);

Важный нюанс: Если ваши данные приходят в «двойной кодировке» (например, &amp;lt;), то даже ПостроительDOM вернет вам &lt;. В таких случаях операцию декодирования необходимо проводить повторно, пока в строке не исчезнут специфические префиксы.

Дополнительный способ: Декодирование через COM-объект (только для Windows)

Для тонкого клиента под Windows существует еще один «хитрый» способ, позволяющий использовать движок Internet Explorer без создания видимых форм. Мы можем создать невидимый HTML-документ и использовать его свойства для трансформации текста:


HTMLДокумент = Новый COMОбъект("HTMLFile");
HTMLДокумент.open();
Элемент = HTMLДокумент.createElement("div");
// Помещаем закодированный текст в innerHTML
Элемент.innerHTML = "Данные формы &#60;";
// Читаем уже раскодированный текст из innerText
Результат = Элемент.innerText; 

Этот метод крайне эффективен, так как он полностью полагается на логику браузера в вопросах обработки любых HTML-сущностей, включая самые редкие. Однако помните, что он не будет работать на сервере под управлением Linux или в веб-клиенте.

Подведем итог: для большинства задач в 1С 8.3 оптимальным является Метод 2 (ПостроительDOM), так как он является кроссплатформенным и наиболее «чистым» с точки зрения архитектуры платформы.

← На главную