При работе с HTML-текстами в среде 1С программисты часто сталкиваются с неприятной особенностью: код, который идеально выглядит в обычном браузере, во встроенном редакторе 1С отображается с огромными отступами или лишними пустыми строками. Проблема чаще всего кроется в символах переноса строки (Символы.ПС), которые находятся внутри тегов списков (<li>), таблиц (<table>) или просто между блочными элементами. Движок отображения 1С (особенно современный WebKit) интерпретирует эти переносы как значимые пробелы, что и портит визуальную картину.
В этой статье мы подробно разберем несколько способов «причесать» HTML-код, чтобы он выглядел профессионально и корректно внутри вашей информационной базы. Мы пройдем путь от простых строковых замен до глубокого анализа структуры документа через объектную модель 1С.
Проанализируем наиболее технологичный метод, который позволяет не просто «вырезать» символы, а корректно обработать структуру документа. Этот метод основан на разборе HTML в дерево объектов (Document Object Model).
Рассмотрим по шагам процесс обработки:
ЧтениеHTML и загружаем в него исходную строку.ПостроительDOM для преобразования текста в полноценный ДокументHTML.Тело.ДочерниеУзлы).Посмотрим на пример реализации:
// ОписаниеДляСайта - это наша исходная строка с "грязным" HTML
ЧтениеHTML = Новый ЧтениеHTML;
ЧтениеHTML.УстановитьСтроку(ОписаниеДляСайта);
ПостроительDOM = Новый ПостроительDOM;
ДокументHTML = ПостроительDOM.Прочитать(ЧтениеHTML);
// Теперь мы можем программно взаимодействовать с каждым элементом
Для Каждого Узел Из ДокументHTML.Тело.ДочерниеУзлы Цикл
// Здесь можно реализовать логику удаления лишних Символы.ПС
// Например, если узел является текстовым и содержит только переносы
Если Узел.ТипУзла = ТипУзлаDOM.Текстовый Тогда
Узел.ТекстовоеСодержимое = СтрЗаменить(Узел.ТекстовоеСодержимое, Символы.ПС, "");
КонецЕсли;
КонецЦикла;
Этот метод хорош тем, что он не ломает саму разметку, так как 1С сама контролирует целостность тегов при сборке документа обратно в строку.
Если нам нужно быстро привести HTML к стандартному виду без написания сложных алгоритмов обхода, воспользуемся встроенным объектом БезопасныйHTML. Хотя его основная задача — защита от вредоносных скриптов (XSS), побочным эффектом является отличная нормализация кода.
Выясним, как это работает: при фильтрации платформа пересобирает документ, закрывает незакрытые теги и удаляет артефакты форматирования, которые могут мешать корректному рендерингу. Рассмотрим пример кода:
Фильтр = Новый БезопасныйHTML;
// По умолчанию фильтр довольно строгий, можно настроить разрешенные теги
ОчищенныйHTML = Фильтр.Очистить(ИсходныйТекстHTML);
Важный момент: объект БезопасныйHTML доступен в платформе, начиная с версии 8.3.14. Если ваша конфигурация работает на более старых версиях, этот метод не подойдет, и стоит обратить внимание на работу со строками.
Разберем ситуацию, когда проблема локализована в конкретных местах, например, внутри списков. Часто визуальные разрывы возникают из-за того, что после тега <li> идет перенос строки в самом исходном коде. В этом случае мы можем применить функцию СтрЗаменить.
Посмотрим на примеры простых, но эффективных замен:
// Удаляем переносы строк, стоящие сразу после открытия тега списка
Результат = СтрЗаменить(ИсходныйТекст, "<li>" + Символы.ПС, "<li>");
// Или используем многострочную запись для наглядности
Результат = СтрЗаменить(Результат, "<li>
|", "<li>");
Этот метод «микрохирургии» эффективен, когда вы точно знаете структуру входящих данных. Однако будьте осторожны: массовое удаление всех Символы.ПС может превратить ваш HTML в одну нечитаемую строку, что затруднит отладку в будущем.
Для более продвинутой очистки, когда нужно удалить пробелы и переносы только между тегами (например, > [пробелы/переносы] <), лучше всего подходят регулярные выражения. В 1С это реализуется через COM-объект VBScript.RegExp.
Рассмотрим алгоритм работы с регулярными выражениями:
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.MultiLine = Истина;
RegExp.Global = Истина;
RegExp.IgnoreCase = Истина;
// Паттерн ищет переносы строк и пробелы между закрывающим и открывающим тегами
RegExp.Pattern = ">\s+<";
Результат = RegExp.Replace(ИсходныйТекст, "><");
Этот подход позволяет одним действием убрать все лишние отступы в таблицах и списках, не затрагивая текст внутри самих элементов. Это самый мощный способ борьбы с «расползанием» верстки в 1С.
Проанализируем еще одну причину проблем. Современные версии 1С используют движок WebKit для отображения HTML. Он крайне чувствителен к свойству CSS white-space. Если вы перепробовали все способы очистки текста, но лишние отступы остались, попробуйте добавить в заголовок (<head>) вашего HTML следующий стиль:
<style>
body {
white-space: normal;
}
li, td {
margin: 0;
padding: 0;
}
</style>
Подведем итоги: для качественного отображения HTML в 1С необходимо комбинировать методы. Идеальный алгоритм — это сначала нормализация через БезопасныйHTML или регулярные выражения для удаления лишних переносов (Символы.ПС), а затем применение базовых CSS-стилей для сброса отступов. Выбор метода зависит от сложности вашей задачи и версии платформы, но наиболее надежным для программиста остается использование ПостроителяDOM, так как он дает полный контроль над каждым тегом документа.