При разработке внешних обработок в обычном приложении 1С:Предприятие 8 программисты часто сталкиваются с необходимостью отображения динамического контента: отчетов с богатым форматированием (включая условное оформление), интерактивных дашбордов (в том числе с использованием SVG) или простого текста со ссылками. Для этих целей используется элемент управления ПолеHTMLДокумента. Однако стандартные методы работы с DOM, привычные для веб-разработки (например, innerHTML), в контексте 1С могут вести себя непредсказуемо. В этой статье мы подробно разберем, как правильно передать данные в HTML-поле, почему возникают ошибки инициализации и как обеспечить корректное отображение спецсимволов.
Рассмотрим ситуацию, с которой часто сталкиваются разработчики. При попытке программно заполнить поле в событии формы ПриОткрытии через прямое обращение к документу, система выдает ошибку или просто ничего не отображает. Проанализируем типичный ошибочный код:
// Ошибочный подход
ЭлементыФормы.ПолеHTMLДокумента_my.Документ.documentElement.innerHTML = ТекстHTML;
Выясним причину такого поведения. Дело в том, что в обычном приложении элемент ПолеHTMLДокумента является оболочкой над движком Internet Explorer (ActiveX объект). На момент инициализации формы объект Документ внутри этого поля еще не создан — он равен Undefined или Null. Попытка обратиться к свойству documentElement несуществующего объекта приводит к закономерному отказу. Чтобы «оживить» внутреннюю структуру DOM, необходимо сначала загрузить в поле хотя бы пустую страницу или воспользоваться встроенными методами платформы 1С.
Самым надежным и правильным способом заполнения поля в обычном приложении является использование метода УстановитьТекст(). Этот метод реализован на уровне платформы специально для взаимодействия с элементом управления формы. Он берет на себя все низкоуровневые операции по инициализации COM-объекта и загрузке в него содержимого.
Разберем по шагам, как это реализовать в коде:
ЭлементыФормы.УстановитьТекст(), передав ему нашу строку.Посмотрим на практический пример реализации в модуле формы обработки:
Процедура ПриОткрытии()
// Подготовим HTML-контент
ТекстHTML = "<html>
|<body style='font-family: Arial; font-size: 10pt;'>
|<h3>Добро пожаловать!</h3>
|<p>Это содержимое загружено программно.</p>
|</body>
|</html>";
// Установим текст в поле на форме
ЭлементыФормы.ПолеHTMLДокумента_my.УстановитьТекст(ТекстHTML);
КонецПроцедуры
Проанализируем важное отличие обычных форм от управляемых. В управляемом интерфейсе (v8.3) мы просто привязываем Поле HTML документа к реквизиту формы типа Строка через свойство «Путь к данным». В обычном приложении такая прямая связь отсутствует. В свойствах элемента управления нет поля «Данные».
Следовательно, нам необходимо обеспечивать синхронизацию вручную. Рассмотрим, как это сделать:
ЭлементыФормы.ИмяПоля.УстановитьТекст(Значение).ЭлементыФормы.ИмяПоля.ПолучитьТекст().Посмотрим на ситуацию, когда в HTML-поле нужно передать текст, содержащий специфические символы (например, «Variable Name Generator by ...»). Если просто вставить такой текст, браузерный движок может интерпретировать знаки препинания или кавычки как элементы разметки, что приведет к «каше» на экране.
Рассмотрим правила подготовки текста для безопасного вывода:
& на &, < на <, > на >.<pre>...</pre>.Пример правильной подготовки сложного текста:
Функция ПодготовитьТекстДляHTML(ИсходныйТекст)
Результат = "<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>";
Результат = Результат + "<body><pre>" + ИсходныйТекст + "</pre></body>";
Возврат Результат;
КонецФункции
// Использование:
ТекстДляВывода = "Variable Name Generator by <Some Author>";
ЭлементыФормы.ПолеHTMLДокумента_my.УстановитьТекст(ПодготовитьТекстДляHTML(ТекстДляВывода));
В некоторых случаях, когда объем HTML-данных очень велик (десятки мегабайт) или когда страница содержит много внешних ресурсов (картинки, CSS-файлы, JS-скрипты), метод УстановитьТекст() может работать медленно или некорректно обрабатывать пути к файлам. В такой ситуации разберем метод Перейти().
Алгоритм действий будет следующим:
Перейти(), указывая полный путь к этому файлу.
ИмяФайла = ПолучитьИмяВременногоФайла("html");
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.УстановитьТекст(МойБольшойHTML);
ТекстовыйДокумент.Записать(ИмяФайла, КодировкаТекста.UTF8);
ЭлементыФормы.ПолеHTMLДокумента_my.Перейти(ИмяФайла);
Важный момент: использование временных файлов позволяет корректно работать с относительными путями. Если вы положите картинки в ту же папку, где лежит временный HTML, они успешно отобразятся в поле формы.
Часто требуется не просто показать текст, но и отреагировать на действия пользователя внутри этого поля. В обычном приложении мы можем использовать событие ПриНажатии самого элемента управления ПолеHTMLДокумента. В параметрах этого события передается объект ДанныеСобытия, из которого можно извлечь конкретный HTML-элемент, на который нажал пользователь.
Проанализируем, как это можно использовать для создания гиперссылок, вызывающих действия в 1С:
Процедура ПолеHTMLДокумента_myПриНажатии(Элемент, ДанныеСобытия)
// Проверим, что нажата именно ссылка (тег "A")
Если ДанныеСобытия.Element.tagName = "A" Тогда
// Отменим стандартный переход браузера по ссылке
ДанныеСобытия.ReturnValue = Ложь;
// Получим значение атрибута href или id
КодКоманды = ДанныеСобытия.Element.id;
// Выполним действие в 1С в зависимости от нажатой ссылки
Предупреждение("Вы нажали на ссылку с кодом: " + КодКоманды);
КонецЕсли;
КонецПроцедуры
Таким образом, мы выяснили, что работа с HTML в обычных формах требует понимания механизмов инициализации ActiveX компонентов. Использование метода УстановитьТекст() является "золотым стандартом", который позволяет избежать большинства ошибок, связанных с неопределенностью объекта Документ.