При разработке интерфейсов в 1С часто возникает задача отобразить произвольный HTML-код, отчет со сложным оформлением или интерактивную страницу прямо на форме. Для этого на управляемую форму помещают элемент с видом Поле HTML документа. Однако нередко разработчики сталкиваются со странным поведением: вместо ожидаемой веб-страницы встроенный браузер пытается выполнить поиск по переданному тексту в поисковой системе (например, перенаправляет в Bing) или сообщает об ошибке перехода по неверному адресу.
Разберем детально, почему платформа 1С так реагирует на передаваемый код, выясним корневую причину сбоя и рассмотрим надежные способы вывода разметки на форму.
В управляемых формах 1С элемент Поле HTML документа связывается с реквизитом формы строкового типа. Платформа анализирует содержимое этой строки по встроенным алгоритмам автоопределения:
<html>), движок понимает, что перед ним готовая разметка, и отображает ее в виде документа.Главная ошибка кроется в определении типа данных реквизита формы. Если разработчик создает реквизит с типом Строка фиксированной длины (например, по умолчанию 10 символов), переданный HTML-код немедленно обрезается. Строка вида <html><body превращается в огрызок, движок не может построить ДокументHTML из невалидной разметки и выполняет поисковый редирект.
Кроме того, автоопределение HTML может давать сбой в следующих случаях:
<html> приводят к тому, что платформа не видит начало разметки.<!DOCTYPE html> без явного начала документа с тега <html>, некоторые версии платформы ошибочно отправляют строку механизму навигации.Рассмотрим базовое и самое простое решение проблемы. Чтобы платформа не обрезала HTML-разметку, необходимо правильно настроить реквизит формы, связанный с полем отображения.
Разберем по шагам порядок настройки:
ТекстHTML или Браузер).Строка и обязательно установим признак Длина: Неограниченная.<html> без предшествующих пробелов и пустых строк.Посмотрим на пример формирования содержимого на клиенте:
&НаКлиенте
Процедура ОтобразитьСтраницу()
// Формируем чистый HTML-код без пустых символов в начале строки
ТекстHTML = "<html>"
+ "<head><meta charset=""utf-8""></head>"
+ "<body style=""font-family: Arial; padding: 15px;"">"
+ "<h2>Успешная загрузка</h2>"
+ "<p>Документ корректно распознан платформой 1С.</p>"
+ "</body>"
+ "</html>";
КонецПроцедуры
Чтобы полностью исключить ошибки автоопределения платформы и предотвратить любые попытки поиска в Bing, применим явное указание типа данных через схему Data URI. В этом случае браузер гарантированно воспримет строку как веб-документ.
Сформируем строку, добавив префикс data:text/html;charset=utf-8, перед тегами:
&НаКлиенте
Процедура ЗагрузитьЧерезDataURI()
ИсходныйКод = "<html><body><h1>Данные через Data URI</h1></body></html>";
// Добавляем специальный заголовок схемы Data URI
ТекстHTML = "data:text/html;charset=utf-8," + ИсходныйКод;
КонецПроцедуры
Если страница содержит сложную разметку большого объема, внедренные скрипты, стили или локальные картинки, лучшей практикой является сохранение содержимого во временный файл на диске с последующей передачей пути в реквизит формы.
Проанализируем пример реализации такого механизма:
&НаКлиенте
Процедура ЗагрузитьИзВременногоФайла()
// Получаем уникальное имя во временном каталоге
ИмяФайла = ПолучитьИмяВременногоФайла("html");
// Формируем HTML-код
ТекстРазметки = "<html><body><p>Страница из локального файла</p></body></html>";
// Записываем документ в кодировке UTF-8 без BOM
Запись = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8);
Запись.Записать(ТекстРазметки);
Запись.Закрыть();
// Присваиваем реквизиту путь к файлу для отображения
ТекстHTML = ИмяФайла;
КонецПроцедуры
В конфигурациях на обычных формах у элемента управления ПолеHTMLДокумента доступен прямой метод УстановитьТекст(). Он принимает чистый строковый HTML-код без необходимости настройки строковых реквизитов формы:
ЭлементыФормы.ПолеHTMLДокумента.УстановитьТекст(ИсходныйКод);
Также после успешной загрузки страницы в управляемых формах мы можем взаимодействовать с объектной моделью документа (DOM) через свойство Элементы.ИмяПоляHTML.Документ, что позволяет программно изменять стили и содержимое страницы без полной перезагрузки поля.