К статье
Практический материал

Разработка и Конфигурация · 12 мин

Как вывести HTML на форму в 1С: пошаговая инструкция

Как вывести HTML на форме в 1С: реквизит ПолеHTMLДокумента, формирование HTML-строки, обработка событий ПриНажатии и ДокументСформирован, ограничения браузера.

В управляемых формах 1С вывод HTML-разметки реализуется через специальный элемент формы «Поле HTML документа» (вид ПолеHTMLДокумента). Он отображает произвольную HTML-страницу: текст с форматированием, таблицы, картинки, ссылки и даже интерактивные элементы, сгенерированные прямо в коде конфигурации.

Типовые сценарии применения: красиво оформленные панели информации о контрагенте, визуализация статусов документа, отчёты с нестандартной раскраской, инструкции и подсказки внутри формы, простые дашборды без построения диаграмм средствами СКД.

Механизм одинаков во всех современных конфигурациях на управляемом приложении (БП, УТ, ERP, ЗУП и собственные разработки). Ниже разобраны подготовка формы, формирование HTML-строки, обработка кликов по ссылкам, ограничения встроенного браузера и типичные ошибки.

Как добавить поле HTML-документа на форму

Откройте нужную форму в конфигураторе. В панели элементов нажмите «Добавить» и выберите тип Поле формы, а в свойстве «Вид» укажите Поле HTML документа. Элементу нужен источник данных — реквизит формы типа Строка неограниченной длины, например ПолеHTML.

Порядок действий в конфигураторе:

  • создайте реквизит формы ПолеHTML с типом «Строка», длина неограниченная;
  • перетащите реквизит в дерево элементов формы;
  • в свойствах элемента установите Вид = «Поле HTML документа»;
  • при необходимости отключите заголовок и настройте растягивание по высоте и ширине.

После этого достаточно присвоить реквизиту любую корректную HTML-строку — содержимое отобразится на форме автоматически. Присваивать можно в ПриСозданииНаСервере, ПриОткрытии или в ответ на действия пользователя.

Порядок действий
  1. 1
    Создайте строковый реквизит формы неограниченной длины
  2. 2
    Добавьте элемент формы с видом «Поле HTML документа» и привяжите его к реквизиту
  3. 3
    В коде сформируйте HTML-строку и присвойте её реквизиту
  4. 4
    Откройте форму в режиме предприятия и проверьте отображение

Формирование HTML-строки в коде

Самый простой вариант — собрать строку конкатенацией. Для читаемости больших шаблонов удобнее использовать текстовый макет и подстановку параметров через СтрЗаменить.

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Шаблон = "<html><body style='font-family:Segoe UI; font-size:12px;'>"

+ "<h3 style='color:#2E6DA4;'>[Заголовок]</h3>"

+ "<p>Контрагент: <b>[Контрагент]</b></p>"

+ "<p>Задолженность: <span style='color:red;'>[Долг]</span></p>"

+ "</body></html>";

ТекстHTML = СтрЗаменить(Шаблон, "[Заголовок]", "Карточка клиента");

ТекстHTML = СтрЗаменить(ТекстHTML, "[Контрагент]", Объект.Контрагент);

ТекстHTML = СтрЗаменить(ТекстHTML, "[Долг]", Формат(ПолучитьДолг(), "ЧДЦ=2"));

ПолеHTML = ТекстHTML;

КонецПроцедуры

Для больших документов лучше завести общий макет типа «Текстовый документ» с HTML-шаблоном и читать его через ПолучитьМакет(). Так верстку сможет править человек без доступа к модулю формы, а код станет заметно чище.

Избегайте подстановки «сырых» пользовательских данных без экранирования: если в наименовании контрагента встретятся символы < или кавычки, разметка сломается. Минимальная защита — замена < на &lt; и > на &gt; в подставляемых значениях.

1c
ПолеHTML = "<b>Привет, 1С!</b>";

Обработка нажатий на ссылки: событие ПриНажатии

HTML-документ на форме 1С — не просто картинка: ссылки внутри него интерактивны. Чтобы клик по ссылке выполнял действие в 1С (открытие документа, запуск команды), включите у элемента обработчик события ПриНажатии.

Внутри ссылок используйте собственную схему, например <a href="doc:ОткрытьЗаказ|12345">. В обработчике разберите href и выполните нужное действие:

&НаКлиенте

Процедура ПолеHTMLПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;

Ссылка = ДанныеСобытия.href;

Если СтрНайти(Ссылка, "doc:") = 0 Тогда

Возврат;

КонецЕсли;

Части = СтрРазделить(Ссылка, "|");

Если СтрНайти(Части[0], "ОткрытьЗаказ") > 0 Тогда

ОткрытьЗаказПоИд(Части[1]);

КонецЕсли;

КонецПроцедуры

Обязательно устанавливайте СтандартнаяОбработка = Ложь, иначе встроенный браузер попытается перейти по несуществующему адресу и покажет страницу ошибки. Также учтите, что свойство href может прийти с преобразованным регистром и дополненным протоколом — надёжнее искать подстроку через СтрНайти, чем сравнивать строку целиком.

Событие ДокументСформирован и работа с DOM

Присваивание текста реквизиту не означает мгновенной готовности документа: браузеру нужно время на разбор разметки. Если код сразу обращается к элементам документа, он получит пустой результат. Событие ДокументСформирован сигнализирует, что DOM построен и доступен.

&НаКлиенте

Процедура ПолеHTMLДокументСформирован(Элемент)

Документ = Элемент.Документ;

Документ.getElementById("status").innerText = "Данные загружены";

КонецПроцедуры

Через Элемент.Документ доступна объектная модель документа: можно находить элементы по id, менять их текст и стили, подписываться на события. Это удобно для частичного обновления содержимого без полной перегенерации HTML.

Однако не злоупотребляйте манипуляциями DOM на каждое действие пользователя — в тонком клиенте обращения к объектам документа относительно дорогие. Если содержимое меняется целиком, проще заново сформировать строку и присвоить реквизиту.

Ограничения встроенного браузера

Вид отображаемого HTML зависит от движка, который использует платформа на конкретном клиенте. В зависимости от версии платформы и настроек это может быть Internet Explorer (устаревший движок) или WebKit/современный браузерный компонент. Практические следствия:

  • современные возможности CSS (flexbox, grid, переменные) могут не работать на старых движках — используйте простую табличную и блочную вёрстку;
  • JavaScript поддерживается ограниченно; сложные библиотеки могут не запуститься;
  • веб-клиент имеет дополнительные ограничения на доступ к DOM и локальным файлам;
  • локальные картинки по пути file:// часто заблокированы — встраивайте изображения через base64.

Перед внедрением проверьте отображение на всех целевых клиентах: тонкий клиент, толстый клиент и веб-клиент могут показать один и тот же HTML по-разному. Тестирование только на машине разработчика — частая причина «съехавшей» вёрстки у пользователей.

Картинки, картинки из базы и base64

Типовая задача — показать в HTML фото товара или логотип, хранящийся в базе. Прямой ссылки на файл внутри информационной базы нет, поэтому изображение кодируют в base64 и вставляют через data-URI:

Двоичные = ХранилищеКартинки.Получить();

СтрокаBase64 = Base64Строка(Двоичные);

ТегКартинки = "<img src='data:image/jpeg;base64," + СтрокаBase64 + "' width='120'/>";

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

Для небольших иконок и служебной графики base64 — оптимальный вариант: картинка путешествует вместе с HTML-строкой, не требует файловой системы и одинаково работает во всех клиентах.

Альтернативы полю HTML-документа

HTML-поле — не единственный способ вывести форматированную информацию на форму. В ряде случаев другие средства подходят лучше:

СпособКогда подходитОграничения
Поле HTML документаСложная вёрстка, цветные блоки, интерактивные ссылкиЗависимость от движка браузера, нет печати напрямую
Поле форматированного документаТекст с форматированием и картинками, редактируемый пользователемОграниченный набор оформления, нет своих CSS
Табличный документПечатные формы, отчёты, предпросмотрНет интерактивных ссылок и произвольной вёрстки
Декорации и группы формыПростые надписи, статусы, подсказкиМинимальные возможности оформления

Если задача — только показать цветной статус или подсказку, декорация с настроенным цветом фона справится проще и надёжнее. HTML оправдан там, где нужна произвольная компоновка блоков или кликабельные элементы внутри контента.

Сравнение вариантов

Поле HTML документа

Максимальная свобода вёрстки и интерактивность; требует аккуратности с движками браузеров

Форматированный документ

Пользователь может редактировать содержимое; оформление ограничено встроенными стилями

Табличный документ

Подходит для печати и отчётов; нет интерактивности и сложной вёрстки

Типичные ошибки и проверка результата

Чаще всего проблемы сводятся к нескольким повторяющимся сценариям. Пустое поле на форме обычно означает, что реквизиту присвоена пустая строка или присваивание выполнено в серверной процедуре, а диагностируется на клиенте после перезаписи. «Съехавшая» вёрстка у части пользователей — признак разных браузерных движков. Неработающие ссылки — следствие отсутствия обработчика ПриНажатии или забытой строки СтандартнаяОбработка = Ложь.

Типичные ошибки
01
Присвоили HTML в ПриСозданииНаСервере, а потом перезаписали реквизит в другом обработчике — поле пустое
02
Не установили СтандартнаяОбработка = Ложь в ПриНажатии — браузер уходит на несуществующую страницу
03
Подставили данные без экранирования — символы разметки ломают документ
04
Вставили крупные картинки без сжатия — форма открывается несколько секунд
05
Тестировали только в тонком клиенте — в веб-клиенте вёрстка отображается иначе
Контрольные точки

Как проверить результат

Отображение содержимого
Норма

HTML виден сразу после открытия формы

Тревожный признак

Поле пустое или показывает исходный код как текст

Клик по ссылке
Норма

Выполняется заданное действие в 1С

Тревожный признак

Страница ошибки навигации внутри поля

Открытие на разных клиентах
Норма

Вёрстка одинакова в тонком и веб-клиенте

Тревожный признак

Расползаются блоки, не работают стили

Скорость открытия формы
Норма

Форма открывается без заметной паузы

Тревожный признак

Задержка из-за тяжёлого HTML или картинок

Частые вопросы

Можно ли выполнить JavaScript в поле HTML-документа?

Да, базовые скрипты внутри страницы выполняются, но поддержка зависит от браузерного движка платформы. Сложные библиотеки и современные API могут не работать. Для взаимодействия с 1С надёжнее использовать клики по ссылкам и событие ПриНажатии, а не вызовы из скриптов.

Почему поле HTML показывает пустую страницу?

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

Как обновить содержимое без переоткрытия формы?

Достаточно заново присвоить реквизиту новую HTML-строку — поле перерисуется автоматически. Для точечных изменений можно модифицировать DOM через Элемент.Документ после события ДокументСформирован, но полная перегенерация строки обычно проще и предсказуемее.

Работает ли поле HTML в веб-клиенте?

Да, работает, но с ограничениями: доступ к DOM и локальным ресурсам урезан, поведение может отличаться от тонкого клиента. Решения, активно использующие манипуляции с документом или локальные файлы, обязательно тестируйте именно в веб-клиенте.

Можно ли распечатать содержимое HTML-поля?

Штатной печати напрямую из поля нет. Практичный путь — сформировать табличный документ с тем же содержимым и вывести его на печать стандартными средствами, либо сохранить HTML в файл и напечатать из браузера, если это допустимо в вашем сценарии.

Как сделать ссылку, открывающую объект базы?

Сформируйте ссылку со своей схемой, например href="1c:ОткрытьКонтрагента|УникальныйИдентификатор", в обработчике ПриНажатии извлеките идентификатор, получите ссылку на объект по GUID и откройте его через ПоказатьЗначение или ОткрытьЗначение. Не забудьте отключить стандартную обработку события.

Итог

Что важно запомнить

HTML на форме 1С выводится через элемент «Поле HTML документа», привязанный к строковому реквизиту: присвоили строку — содержимое отобразилось. Интерактивность обеспечивает событие ПриНажатии с отключённой стандартной обработкой, готовность документа — событие ДокументСформирован. Учитывайте различия браузерных движков, экранируйте данные и сжимайте картинки.