Как правильно отобразить HTML-код в поле HTML документа в 1С без редиректа в браузер?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Разберем детально, почему платформа 1С так реагирует на передаваемый код, выясним корневую причину сбоя и рассмотрим надежные способы вывода разметки на форму.

Анализируем причину ошибки: почему происходит редирект?

В управляемых формах 1С элемент Поле HTML документа связывается с реквизитом формы строкового типа. Платформа анализирует содержимое этой строки по встроенным алгоритмам автоопределения:

  1. Если строка начинается с валидных тегов HTML (в первую очередь <html>), движок понимает, что перед ним готовая разметка, и отображает ее в виде документа.
  2. Если строка не опознана как HTML-код, платформа воспринимает переданный текст как интернет-адрес (URL) или поисковый запрос. В результате браузерный движок пытается перейти по ссылке либо автоматически отправляет обрезанный текст в поисковик.

Главная ошибка кроется в определении типа данных реквизита формы. Если разработчик создает реквизит с типом Строка фиксированной длины (например, по умолчанию 10 символов), переданный HTML-код немедленно обрезается. Строка вида <html><body превращается в огрызок, движок не может построить ДокументHTML из невалидной разметки и выполняет поисковый редирект.

Кроме того, автоопределение HTML может давать сбой в следующих случаях:

  1. Наличие невидимых символов перед тегом. Пробелы, символы переноса строк или невидимый маркер последовательности байтов (BOM) перед тегом <html> приводят к тому, что платформа не видит начало разметки.
  2. Использование директивы doctype. Если первой строкой идет <!DOCTYPE html> без явного начала документа с тега <html>, некоторые версии платформы ошибочно отправляют строку механизму навигации.

Способ 1. Корректная настройка длины строкового реквизита

Рассмотрим базовое и самое простое решение проблемы. Чтобы платформа не обрезала HTML-разметку, необходимо правильно настроить реквизит формы, связанный с полем отображения.

Разберем по шагам порядок настройки:

  1. Перейдем в редактор формы и откроем вкладку Реквизиты.
  2. Найдем реквизит, с которым связано поле HTML (например, ТекстHTML или Браузер).
  3. В свойствах реквизита укажем тип Строка и обязательно установим признак Длина: Неограниченная.
  4. Если требуется одновременно редактировать исходный код в обычном текстовом поле и сразу видеть результат в поле HTML, свяжем оба элемента формы с этим реквизитом. В текстовом поле ввода включим флажок МногострочныйРежим.
  5. Убедимся, что формируемый текст начинается непосредственно с тега <html> без предшествующих пробелов и пустых строк.

Посмотрим на пример формирования содержимого на клиенте:


&НаКлиенте
Процедура ОтобразитьСтраницу()
    
    // Формируем чистый HTML-код без пустых символов в начале строки
    ТекстHTML = "<html>"
        + "<head><meta charset=""utf-8""></head>"
        + "<body style=""font-family: Arial; padding: 15px;"">"
        + "<h2>Успешная загрузка</h2>"
        + "<p>Документ корректно распознан платформой 1С.</p>"
        + "</body>"
        + "</html>";

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

Способ 2. Использование схемы Data URI

Чтобы полностью исключить ошибки автоопределения платформы и предотвратить любые попытки поиска в 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," + ИсходныйКод;

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

Способ 3. Загрузка через временный файл

Если страница содержит сложную разметку большого объема, внедренные скрипты, стили или локальные картинки, лучшей практикой является сохранение содержимого во временный файл на диске с последующей передачей пути в реквизит формы.

Проанализируем пример реализации такого механизма:


&НаКлиенте
Процедура ЗагрузитьИзВременногоФайла()
    
    // Получаем уникальное имя во временном каталоге
    ИмяФайла = ПолучитьИмяВременногоФайла("html");
    
    // Формируем HTML-код
    ТекстРазметки = "<html><body><p>Страница из локального файла</p></body></html>";
    
    // Записываем документ в кодировке UTF-8 без BOM
    Запись = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8);
    Запись.Записать(ТекстРазметки);
    Запись.Закрыть();
    
    // Присваиваем реквизиту путь к файлу для отображения
    ТекстHTML = ИмяФайла;

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

Особенности для обычных форм и управление DOM

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

ЭлементыФормы.ПолеHTMLДокумента.УстановитьТекст(ИсходныйКод);

Также после успешной загрузки страницы в управляемых формах мы можем взаимодействовать с объектной моделью документа (DOM) через свойство Элементы.ИмяПоляHTML.Документ, что позволяет программно изменять стили и содержимое страницы без полной перезагрузки поля.

← На главную