Разработка и Конфигурация · 11 мин
Как работать с HTML в 1С
Как выводить и обрабатывать HTML в 1С: ПолеHTMLДокумента, объект ДокументDOM, события ПриНажатии, ограничения браузерного движка и типовые ошибки разработчиков.
В 1С:Предприятии работа с HTML чаще всего сводится к трём задачам: показать пользователю форматированный текст или страницу, сформировать HTML-отчёт программно и разобрать (распарсить) готовую HTML-разметку, чтобы извлечь из неё данные. Для каждой задачи платформа предлагает свой инструмент: элемент формы «Поле HTML-документа», объект ДокументHTML/ДокументDOM для разбора и обычную запись текстового файла для генерации.
Важно понимать ограничение: встроенный браузерный движок в 1С зависит от режима совместимости конфигурации и версии платформы. В старых режимах используется движок Internet Explorer, в новых — WebKit. От этого напрямую зависит, какие возможности HTML, CSS и JavaScript будут работать у пользователя. Поэтому код, отлично выглядящий на тестовой машине, может «развалиться» у клиента, и это первое, что нужно проверять при проблемах с отображением.
Ниже разобраны практические сценарии: вывод HTML в форме, программная генерация разметки, разбор HTML через DOM-модель, обработка кликов по ссылкам, типовые ошибки и способы проверки результата.
Как вывести HTML в форме через Поле HTML-документа
Основной способ показать HTML пользователю — элемент формы «Поле HTML-документа». В конфигураторе откройте форму, добавьте реквизит типа «Строка» (неограниченной длины), затем перетащите его в дерево элементов и смените вид поля на «Поле HTML-документа». В управляемой форме это делается через свойство «Вид» элемента.
После этого вывод сводится к присваиванию строки:
&НаКлиенте
Процедура ПоказатьОтчет(Команда)
ТекстHTML = "<html><body><h2>Остатки товаров</h2>"
+ "<p>Сформировано программно</p></body></html>";
ПолеHTML = ТекстHTML; // ПолеHTML — реквизит формы
КонецПроцедуры
Признак корректной настройки: после присваивания строки элемент сразу перерисовывается и показывает разметку. Если вместо страницы виден пустой белый блок — чаще всего строка пустая, содержит синтаксическую ошибку в верхней части документа или движок не смог обработать используемые CSS-свойства.
Вместо строки можно загрузить страницу из файла или по URL, присвоив реквизиту адрес — но это работает не во всех режимах одинаково, поэтому надёжнее читать содержимое программно и передавать готовый текст.
Как сгенерировать HTML программно
Для отчётов, писем и печатных форм HTML удобно собирать строками. Простой вариант — шаблон с подстановкой через СтрЗаменить или СтрШаблон:
ТекстHTML = СтрШаблон(
"<html><body><h2>%1</h2><p>Сумма: %2</p></body></html>",
ЗаголовокОтчета, Формат(СуммаИтог, "ЧДЦ=2"));
Для сложных документов удобнее хранить шаблон в макете типа «Текстовый документ» с метками вида [Заголовок], [ТаблицаСтрок] и подставлять фрагменты в цикле. Таблицы собирайте конкатенацией: сначала откройте <table>, в цикле по выборке добавляйте строки <tr><td>...</td></tr>, затем закройте тег.
Два правила безопасной генерации. Первое: данные из базы (наименования контрагентов, комментарии) могут содержать символы <, >, & — перед вставкой в разметку заменяйте их на HTML-сущности, иначе разметка сломается или, хуже, в документ попадёт чужой скрипт. Второе: итоговую строку собирайте через Текст = Текст + Фрагмент только для небольших документов; при тысячах строк используйте ЗаписьТекста или массив с последующим СтрСоединить — это заметно быстрее.
- 1Создайте макет типа «Текстовый документ» с HTML-шаблоном и метками подстановки
- 2Получите данные запросом и подготовьте фрагменты таблицы в цикле
- 3Подставьте фрагменты в шаблон через СтрЗаменить или СтрШаблон
- 4Экранируйте спецсимволы в пользовательских данных
- 5Присвойте результат реквизиту Поля HTML-документа или сохраните в файл
- 6Проверьте отображение в целевом клиенте (тонкий/веб)
Как разобрать HTML через ДокументDOM
Когда HTML приходит извне — например, загружается прайс поставщика или страница сайта — его нужно распарсить. Платформа предоставляет ПостроительDOM и ЧтениеHTML:
ЧтениеHTML = Новый ЧтениеHTML;
ЧтениеHTML.УстановитьСтроку(ТекстHTML);
Построитель = Новый ПостроительDOM;
Документ = Построитель.Прочитать(ЧтениеHTML);
Элементы = Документ.ПолучитьЭлементыПоИмени("td");
Для Каждого Элемент Из Элементы Цикл
Сообщить(Элемент.ТекстовоеСодержимое);
КонецЦикла;
Объектная модель близка к браузерной: есть ПолучитьЭлементыПоИмени, ПолучитьЭлементПоИдентификатору, обход дочерних узлов, чтение атрибутов через ПолучитьАтрибут. Это надёжнее, чем разбор регулярными выражениями, потому что парсер корректно обрабатывает вложенность и незакрытые теги.
Практическое ограничение: ДокументDOM работает только с уже полученным текстом. Если данные на сайте подгружаются JavaScript после загрузки страницы, в полученном HTML их не будет — в таком случае нужно искать прямой источник данных (например, JSON-запрос, который делает страница) или использовать Поле HTML-документа с доступом к загруженному документу.
События: как обработать клик по ссылке в HTML
У Поля HTML-документа есть событие ПриНажатии, которое срабатывает при клике по ссылке. Без обработчика платформа попытается перейти по адресу и заменит содержимое поля загруженной страницей. Чтобы перехватить клик, назначьте обработчик и в нём установите отказ от стандартной обработки:
&НаКлиенте
Процедура ПолеHTMLПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Ссылка = ДанныеСобытия.href;
Если СтрНайти(Ссылка, "open:") > 0 Тогда
ОткрытьДокумент(СтрЗаменить(Ссылка, "open:", ""));
КонецЕсли;
КонецПроцедуры
Типовой приём: в генерируемом HTML ссылки на объекты базы оформляют с псевдопротоколом вида <a href="open:Документ.Реализация/ид">. В обработчике по префиксу определяют действие и открывают нужную форму. Так HTML-отчёт становится интерактивным — пользователь кликает по строке и попадает в документ.
Учтите, что состав свойств ДанныеСобытия отличается между движками. Перед использованием проверяйте доступные свойства в отладчике именно в том режиме, в котором работает прикладное решение.
Ограничения браузерного движка и совместимость
Главный источник проблем при работе с HTML в 1С — различия движков. Режим совместимости конфигурации определяет, используется ли устаревший движок IE или более современный WebKit. В режиме IE не работают современные CSS-свойства (flexbox, grid), часть JavaScript-API и HTML5-теги.
Практические следствия: оформляйте документы простыми таблицами и инлайн-стилями, избегайте внешних CSS-файлов и скриптов со сторонних CDN — при отсутствии интернета или блокировке прокси разметка потеряет оформление. Картинки встраивайте через base64 (data:image/png;base64,...), если документ должен быть самодостаточным.
Способы работы с HTML в 1С
Показ разметки пользователю, интерактивные отчёты. Ограничение: зависит от движка клиента и режима совместимости.
Разбор и анализ готового HTML, извлечение данных. Не выполняет JavaScript — подходит только для статической разметки.
Печатные формы, письма, обмен с внешними системами. Полный контроль, но нет визуального предпросмотра без дополнительных действий.
Типичные ошибки и как их избежать
Самая частая ошибка — присваивание HTML реквизиту формы на сервере с последующим ожиданием мгновенной перерисовки на клиенте: реквизит обновится, но если логика размазана между контекстами, легко получить устаревшее содержимое. Формируйте текст на сервере, присваивайте в клиентской процедуре после вызова.
Вторая группа ошибок — кодировка. При чтении HTML из файла указывайте кодировку явно (ЧтениеТекста с параметром КодировкаТекста.UTF8), иначе кириллица превратится в нечитаемые символы. То же касается HTTP-запросов: смотрите заголовок Content-Type ответа и не полагайтесь на автоопределение.
Третья ошибка — попытка использовать Поле HTML-документа как полноценный браузер: переходы по внешним ссылкам, загрузка скриптов, работа с cookie. Элемент для этого не предназначен; для обмена данными с сайтами используйте HTTPСоединение, а поле оставьте для отображения.
Как проверить результат
После внедрения проверьте три вещи. Во-первых, отображение: откройте форму в том клиенте, который используют пользователи (тонкий, веб), и убедитесь, что таблицы и стили выглядят как задумано. Во-вторых, граничные данные: подставьте в источник наименование с символами <, &, кавычками и длинной строкой без пробелов — разметка не должна развалиться.
В-третьих, интерактивность: кликните по каждому типу ссылки в документе и убедитесь, что обработчик ПриНажатии срабатывает, стандартная обработка отменяется и открывается правильный объект. Если клик ведёт на пустую страницу внутри поля — значит, отказ от стандартной обработки не установлен или обработчик не назначен в свойствах элемента.
Как проверить результат
Русский текст читается в любом клиенте
Кракозябры или знаки вопроса — проблема кодировки
Символы <, >, & показаны как текст, структура таблицы цела
Таблица съезжает, часть текста пропала
Выполняется обработчик ПриНажатии, открывается нужный объект
Поле переходит по адресу и показывает пустую или внешнюю страницу
Что важно запомнить
Показ HTML — через Поле HTML-документа, разбор — через ДокументDOM и ПостроительDOM, генерация — через шаблоны с экранированием данных. Всегда учитывайте движок клиента, указывайте кодировку явно и перехватывайте клики по ссылкам через событие ПриНажатии.
Частые вопросы
Можно ли выполнять JavaScript внутри Поля HTML-документа?
Да, скрипты в загруженной разметке выполняются движком, но набор возможностей зависит от режима совместимости: в старом движке IE многие современные API недоступны. Обмен данными между скриптом и кодом 1С ограничен — надёжнее передавать команды через клики по ссылкам с псевдопротоколом и событие ПриНажатии.
Как вывести картинку в HTML-отчёте без внешних файлов?
Преобразуйте изображение в base64 и вставьте в тег img как src="data:image/png;base64,...". В 1С двоичные данные картинки кодируются через Base64Строка(). Документ станет самодостаточным, но при больших изображениях строка разметки сильно вырастет — сжимайте картинки заранее.
Почему ДокументDOM не видит данные, которые видно в браузере?
Парсер обрабатывает только исходный текст страницы. Если данные подгружаются скриптами после загрузки (динамические таблицы, бесконечная прокрутка), их нет в исходном HTML. Найдите запрос, которым страница получает данные (часто это JSON), и обратитесь к нему напрямую через HTTPСоединение.
Чем заменить Поле HTML-документа для форматированного текста?
Если нужен только форматированный текст без интерактивности, подойдёт поле с видом «Поле форматированного документа» — оно работает с форматированным документом 1С и не зависит от браузерного движка. Для статичных отчётов также подходит табличный документ с последующим сохранением в HTML.
Как сохранить HTML в файл из 1С?
Используйте объект ЗаписьТекста: укажите имя файла и кодировку UTF-8, затем запишите строку с разметкой методом Записать. Для корректного отображения в браузерах добавьте в начало документа meta-тег с указанием charset="utf-8".
Почему один и тот же HTML выглядит по-разному у разных пользователей?
Причина почти всегда в разных клиентах и режимах совместимости: тонкий, толстый и веб-клиент используют разные движки рендеринга. Проверьте режим совместимости конфигурации и тестируйте разметку в каждом используемом типе клиента, упрощая CSS до общего знаменателя.