При разработке печатных форм, чеков, билетов или интеграции со сторонними сервисами разработчики часто сталкиваются с необходимостью отобразить на форме форматированный текст. Для этой цели платформа 1С предоставляет специальный элемент управления — ПолеHTMLДокумента. Однако при попытке передать в него строку текст нередко отображается как есть, вместе со служебными тегами, без применения стилей и выравнивания. Разберем по шагам, почему это происходит и как преобразовать исходный текст в валидный HTML для корректного показа и печати.
Проанализируем типовую ситуацию: в коде используется метод установки текста:
ЭлементыФормы.ПолеHTMLДокумента1.УстановитьТекст(Стр);
Если после этого на экране отображаются открывающие и закрывающие теги в виде текста, необходимо проверить формат разметки в переменной. Очень часто сторонние системы, кассовые шаблоны или форумы выгружают текст не в стандарте HTML, а в формате BBCode или собственной псевдоразметке, где используются квадратные скобки вида [b], [center], [size=large] вместо угловых <b>, <center>.
Браузерный движок внутри платформы 1С распознает только стандартную спецификацию HTML. Любые конструкции в квадратных скобках воспринимаются им как обычный текст.
Рассмотрим простейший способ адаптации строки, когда разметка практически полностью повторяет имена тегов HTML, но использует квадратные скобки и символы переноса строк платформы 1С.
[ и ] на угловые скобки < и >.Символы.ПС на тег разрыва строки <br>.Посмотрим на пример реализации такого преобразования:
ИсходныйТекст = Стр;
// Заменяем скобки разметки на теги HTML
ТекстHTML = СтрЗаменить(ИсходныйТекст, "[", "<");
ТекстHTML = СтрЗаменить(ТекстHTML, "]", ">");
// Заменяем переносы строк на теги переноса HTML
ТекстHTML = СтрЗаменить(ТекстHTML, Символы.ПС, "<br>");
// Передаем подготовленный текст в элемент формы
ЭлементыФормы.ПолеHTMLДокумента1.УстановитьТекст(ТекстHTML);
Важное замечание: использование тега <pre>...</pre> для сохранения переносов строк в данном случае не всегда подходит. Тег <pre> отключает автоматический перенос длинных строк по словам, из-за чего длинные строки выходят за пределы видимой области элемента. Замена через <br> обеспечивает корректное оформление с сохранением адаптивного переноса текста.
Простая замена скобок решает проблему только с базовыми тегами (например, <b>, <i>, <u>). Если в исходном тексте содержатся кастомные конструкции вроде [size=large], [hr=dashed /] или теги полей [field], простая замена скобок создаст невалидный HTML-код. Движок рендеринга может отобразить такой документ с ошибками.
Разберем правильный подход с приведением псевдоразметки к валидным тегам и CSS-стилям:
ТекстHTML = Стр;
// Заменяем выравнивание
ТекстHTML = СтрЗаменить(ТекстHTML, "[center]", "<div style=""text-align: center;"">");
ТекстHTML = СтрЗаменить(ТекстHTML, "[/center]", "</div>");
// Заменяем теги размера шрифта
ТекстHTML = СтрЗаменить(ТекстHTML, "[size=large]", "<span style=""font-size: 1.2em;"">");
ТекстHTML = СтрЗаменить(ТекстHTML, "[size=small]", "<span style=""font-size: 0.8em;"">");
ТекстHTML = СтрЗаменить(ТекстHTML, "[/size]", "</span>");
// Заменяем разделители
ТекстHTML = СтрЗаменить(ТекстHTML, "[hr=dashed /]", "<hr style=""border: none; border-top: 1px dashed #000;"" />");
// Базовые теги
ТекстHTML = СтрЗаменить(ТекстHTML, "[b]", "<strong>");
ТекстHTML = СтрЗаменить(ТекстHTML, "[/b]", "</strong>");
// Обрабатываем переносы строк
ТекстHTML = СтрЗаменить(ТекстHTML, Символы.ПС, "<br>");
// Оборачиваем в базовую структуру HTML
ИтоговыйHTML = "<html><body style=""font-family: Arial, sans-serif; font-size: 12px;"">"
+ ТекстHTML
+ "</body></html>";
ЭлементыФормы.ПолеHTMLДокумента1.УстановитьТекст(ИтоговыйHTML);
После того как документ успешно отображен на форме, разберем способы отправки его содержимого на принтер средствами 1С.
Вариант 1. Прямой вызов печати из элемента формы:
В обычном приложении у элемента формы доступен прямой метод отправки на печать с возможностью вывода стандартного диалога выбора принтера:
// Передаем Истина для отображения диалога печати пользователю
ЭлементыФормы.ПолеHTMLДокумента1.Печать(Истина);
Вариант 2. Загрузка HTML в ТабличныйДокумент для предварительного просмотра:
Если требуется предоставить пользователю стандартный просмотр 1С, настроить колонтитулы, поля или масштаб, сохраним сформированный HTML во временный файл и загрузим его в объект ТабличныйДокумент:
ИмяФайла = ПолучитьИмяВременногоФайла("html");
// Записываем HTML-строку во временный файл
ТекстовыйФайл = Новый ТекстовыйДокумент;
ТекстовыйФайл.УстановитьТекст(ИтоговыйHTML);
ТекстовыйФайл.Записать(ИмяФайла, КодировкаТекста.UTF8);
// Загружаем файл в табличный документ
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ИмяФайла, ТипФайлаТабличногоДокумента.HTML);
// Удаляем временный файл
УдалитьФайлы(ИмяФайла);
// Показываем стандартное окно предварительного просмотра
ТабДок.Показать("Печать документа");
Если задача заключается не просто в статичном отображении HTML, а в редактировании текста с оформлением, платформа предоставляет объект ФорматированныйДокумент и соответствующий элемент формы Поле форматированного документа. Он поддерживает программную загрузку HTML через метод УстановитьHTML() и позволяет интерактивно управлять жирностью, цветом и выравниванием текста.