При обмене данными с веб-сервисами или парсинге сайтов разработчики часто сталкиваются с ситуацией, когда вместо понятных символов (например, знаков «меньше», «больше» или кавычек) приходят их кодовые обозначения: <, > или числовые последовательности вида <. Стандартная функция РаскодироватьСтроку со способом кодирования КодировкаURL в этих случаях не помогает, так как она предназначена для работы с процентами (URL-encoding), а не с HTML-сущностями.
В этой статье мы подробно разберем, как преобразовать такие строки в читаемый вид, проанализируем различные подходы и выберем наиболее эффективные инструменты платформы 1С:Предприятие 8.
Этот способ основан на алгоритмическом поиске вхождений числовых кодов и их замене на соответствующие символы встроенной функции Символ(). Рассмотрим ситуацию, когда данные приходят в формате &#КодСимвола;. Проанализируем представленный ниже алгоритм:
&НаКлиенте
Функция ЗаменаHTMLКодов(Знач СтрокаТекста)
// Разрезаем строку, используя спецсимволы начала кода как разделители
МногострочныйСписок = СтрЗаменить(СтрокаТекста, "&#", Символы.ПС);
МногострочныйСписок = СтрЗаменить(МногострочныйСписок, ";", Символы.ПС);
Для НомерСтроки = 1 По СтрЧислоСтрок(МногострочныйСписок) Цикл
ОднострочнаяСтрока = СтрПолучитьСтроку(МногострочныйСписок, НомерСтроки);
// Проверяем, является ли текущая строка числовым кодом
Если Найти(ОднострочнаяСтрока, " ") > 0 Или ПустаяСтрока(ОднострочнаяСтрока) Тогда
Продолжить;
КонецЕсли;
Попытка
КодСимвола = Число(ОднострочнаяСтрока);
Исключение
Продолжить;
КонецПопытки;
// Формируем замену
ПодстрокаЗамены = Символ(КодСимвола);
ЗаменяемаяСтрока = "&#" + ОднострочнаяСтрока + ";";
СтрокаТекста = СтрЗаменить(СтрокаТекста, ЗаменяемаяСтрока, ПодстрокаЗамены);
КонецЦикла;
Возврат СтрокаТекста;
КонецФункции
Разберем по шагам, как работает этот код:
&# и конца ; на переносы строк. Это позволяет нам изолировать потенциальные коды.Символ(КодСимвола) мы получаем реальное начертание (например, из 60 получаем «<»).Этот метод хорош своей универсальностью и независимостью от внешних библиотек, однако он требует доработки, если в строке встречаются именованные сущности, такие как (неразрывный пробел) или " (кавычка).
Платформа 1С предоставляет мощные средства для работы со структурами HTML. Если нам нужно получить «чистый текст» из HTML-фрагмента, лучше всего воспользоваться механизмом объектной модели документа (DOM). Это наиболее правильный и надежный путь, так как он учитывает все стандарты кодирования символов.
Рассмотрим пример кода, который выполняет конвертацию:
ЧтениеHTML = Новый ЧтениеHTML;
// ПредставлениеHTML - это ваша исходная строка с кодами
ЧтениеHTML.УстановитьСтроку(ПредставлениеHTML);
ПостроительDOM = Новый ПостроительDOM;
ДокументHTML = ПостроительDOM.Прочитать(ЧтениеHTML);
ЧтениеHTML.Закрыть;
// Извлекаем текстовое содержимое из тела документа
Результат = ДокументHTML.Тело.ТекстовоеСодержимое;
Сообщить(Результат);
Почему стоит выбрать этот метод?
ПостроительDOM самостоятельно распознает и числовые коды (<), и именованные сущности (<).СтрЗаменить.Часто возникает вопрос: почему при вставке строки в ПолеHTMLДокумента на управляемой форме вместо отформатированного текста отображается исходный код? Выясним причину этой ситуации.
Если вы хотите, чтобы текст отображался как жирный или крупный (например, <strong>Текст</strong>), вам нужно передавать в свойство поля HTML именно исходный HTML-код, а не предварительно декодированную строку. Браузерный движок внутри формы сам преобразует коды символов в их визуальное представление.
Однако, если вы формируете шаблон HTML программно, как в примере ниже, убедитесь, что вы не «экранируете» теги дважды:
ШаблонHTML = "<html><body><div style='font-weight:bold;'>&ТекстВставки</div></body></html>";
// Если Результат2 уже содержит < или >, СтрЗаменить просто вставит их в код
ПредставлениеHTML = СтрЗаменить(ШаблонHTML, "&ТекстВставки", Результат2);
// Устанавливаем итоговую строку в элемент формы (Поле HTML-документа)
Элементы.ПолеHTML.УстановитьТекст(ПредставлениеHTML);
Важный нюанс: Если ваши данные приходят в «двойной кодировке» (например, &lt;), то даже ПостроительDOM вернет вам <. В таких случаях операцию декодирования необходимо проводить повторно, пока в строке не исчезнут специфические префиксы.
Для тонкого клиента под Windows существует еще один «хитрый» способ, позволяющий использовать движок Internet Explorer без создания видимых форм. Мы можем создать невидимый HTML-документ и использовать его свойства для трансформации текста:
HTMLДокумент = Новый COMОбъект("HTMLFile");
HTMLДокумент.open();
Элемент = HTMLДокумент.createElement("div");
// Помещаем закодированный текст в innerHTML
Элемент.innerHTML = "Данные формы <";
// Читаем уже раскодированный текст из innerText
Результат = Элемент.innerText;
Этот метод крайне эффективен, так как он полностью полагается на логику браузера в вопросах обработки любых HTML-сущностей, включая самые редкие. Однако помните, что он не будет работать на сервере под управлением Linux или в веб-клиенте.
Подведем итог: для большинства задач в 1С 8.3 оптимальным является Метод 2 (ПостроительDOM), так как он является кроссплатформенным и наиболее «чистым» с точки зрения архитектуры платформы.