Как заполнить HTML-макет данными из регистра сведений и вывести его на форму 1С?

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

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

Понимание принципа работы с HTML-макетами в 1С

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

При обращении к общему HTML-макету на сервере метод ПолучитьОбщийМакет() возвращает объект типа ОболочкаHTMLДокумента или текстовый документ. Чтобы динамически вывести строки из информационной базы, применяются два основных подхода:

  1. Подстановка через текстовые метки (шаблонизация): в макете создается базовый каркас таблицы (заголовок, шапка, стили), а на месте вывода строк размещается уникальная метка (например, [СТРОКИ_ТАБЛИЦЫ]). В коде 1С формируются строки таблицы и подставляются функцией СтрЗаменить().
  2. Использование объектной модели DOM: макет разбирается в объект ДокументHTML, в который программно добавляются новые узлы и элементы.

Способ 1. Заполнение макета с помощью строковых меток (рекомендуемый)

Рассмотрим по шагам реализацию наиболее простого и быстродействующего способа подстановки данных.

Шаг 1. Подготовка HTML-макета

Создадим общий макет с типом HTML документ или Текстовый документ (например, МакетОтчетПоИнвентаризации). Вставим в него HTML-каркас с меткой-заглушкой [СТРОКИ_ТАБЛИЦЫ]:


<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <style>
        table { width: 100%; border-collapse: collapse; font-family: sans-serif; }
        th, td { border: 1px solid #ccc; padding: 6px 10px; text-align: left; }
        th { background-color: #f2f2f2; }
    </style>
</head>
<body>
    <h2>Отчет по оборудованию</h2>
    <table>
        <tr>
            <th>Оборудование</th>
            <th>Характеристика</th>
        </tr>
        [СТРОКИ_ТАБЛИЦЫ]
    </table>
</body>
</html>

Шаг 2. Написание функции формирования HTML на сервере

Посмотрим на пример функции в общем модуле или модуле формы. Прочитаем данные из регистра сведений запросом, сгенерируем блок строк <tr><td>...</td></tr> и подставим их в текст макета:


&НаСервере
Функция СформироватьТекстHTML(СсылкаНаОборудование = Неопределено) Экспорт
    
    // Получаем текст макета
    Макет = ПолучитьОбщийМакет("МакетОтчетПоИнвентаризации");
    
    // ОболочкаHTMLДокумента позволяет получить чистый текст HTML
    Если ТипЗнч(Макет) = Тип("ОболочкаHTMLДокумента") Тогда
        ТекстHTML = Макет.ПолучитьТекст();
    ИначеЕсли ТипЗнч(Макет) = Тип("ТекстовыйДокумент") Тогда
        ТекстHTML = Макет.ПолучитьТекст();
    Иначе
        ТекстHTML = Строка(Макет);
    КонецЕсли;
    
    // Получаем данные из регистра сведений
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   ПараметрыОборудования.Оборудование.Наименование КАК Оборудование,
        |   ПараметрыОборудования.ЗначениеПараметров КАК ЗначениеПараметров
        |ИЗ
        |   РегистрСведений.ПараметрыОборудования КАК ПараметрыОборудования
        |ГДЕ
        |   (&Оборудование = НЕОПРЕДЕЛЕНО ИЛИ ПараметрыОборудования.Оборудование = &Оборудование)";
    
    Запрос.УстановитьПараметр("Оборудование", СсылкаНаОборудование);
    Выборка = Запрос.Выполнить().Выбрать();
    
    // Формируем строки HTML-таблицы
    СтрокиТаблицыHTML = "";
    ШаблонСтроки = "<tr><td>%1</td><td>%2</td></tr>" + Символы.ПС;
    
    Пока Выборка.Следующий() Цикл
        СтрокиТаблицыHTML = СтрокиТаблицыHTML + СтрШаблон(
            ШаблонСтроки, 
            Выборка.Оборудование, 
            Выборка.ЗначениеПараметров
        );
    КонецЦикла;
    
    // Заменяем метку в макете на сформированные строки
    ИтоговыйHTML = СтрЗаменить(ТекстHTML, "[СТРОКИ_ТАБЛИЦЫ]", СтрокиТаблицыHTML);
    
    Возврат ИтоговыйHTML;
    
КонецФункции

Шаг 3. Вывод данных на форму

Разберем, как связать полученный результат с элементами управляемой формы:

  1. В редакторе формы создаем реквизит ТекстHTMLСтраницы с типом Строка (длина неограничена).
  2. Добавляем в элементы формы элемент с видом Поле HTML документа.
  3. В свойстве ПутьКДанным созданного элемента указываем реквизит ТекстHTMLСтраницы.
  4. В процедуре ПриСозданииНаСервере или обработчике обновления вызываем нашу функцию и присваиваем значение реквизиту:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ТекстHTMLСтраницы = СформироватьТекстHTML(Объект.Ссылка);
КонецПроцедуры

Способ 2. Формирование HTML через объектную модель DOM

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


&НаСервере
Функция СформироватьHTMLЧерезDOM()
    
    Макет = ПолучитьОбщийМакет("МакетОтчетПоИнвентаризации");
    ДокументHTML = Макет.ПолучитьДокументHTML();
    
    // Находим таблицу в документе по тегу
    КоллекцияТаблиц = ДокументHTML.ПолучитьЭлементыПоИмениТега("table");
    Если КоллекцияТаблиц.Количество() = 0 Тогда
        Возврат "";
    КонецЕсли;
    ТаблицаDOM = КоллекцияТаблиц.ПолучитьЭлемент(0);
    
    // Получаем выборку данных
    Запрос = Новый Запрос(
        "ВЫБРАТЬ Оборудование.Наименование КАК Оборудование, ЗначениеПараметров 
        |ИЗ РегистрСведений.ПараметрыОборудования");
    Выборка = Запрос.Выполнить().Выбрать();
    
    Пока Выборка.Следующий() Цикл
        // Создаем строку таблицы <tr>
        СтрокаТаблицы = ДокументHTML.СоздатьЭлемент("tr");
        
        // Создаем ячейку оборудования <td>
        Ячейка1 = ДокументHTML.СоздатьЭлемент("td");
        Ячейка1.ТекстовоеСодержимое = Строка(Выборка.Оборудование);
        СтрокаТаблицы.ВставитьВКонец(Ячейка1);
        
        // Создаем ячейку параметров <td>
        Ячейка2 = ДокументHTML.СоздатьЭлемент("td");
        Ячейка2.ТекстовоеСодержимое = Строка(Выборка.ЗначениеПараметров);
        СтрокаТаблицы.ВставитьВКонец(Ячейка2);
        
        ТаблицаDOM.ВставитьВКонец(СтрокаТаблицы);
    КонецЦикла;
    
    // Записываем DOM-документ в строку
    ЗаписьHTML = Новый ЗаписьHTML;
    ЗаписьHTML.УстановитьСтроку();
    ЗаписьDOM = Новый ЗаписьDOM;
    ЗаписьDOM.Записать(ДокументHTML, ЗаписьHTML);
    
    Возврат ЗаписьHTML.Закрыть();
    
КонецФункции

Способ 3. Использование табличного документа с экспортом в HTML

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


&НаСервере
Функция СформироватьHTMLИзТабДокумента()
    
    Макет = ПолучитьОбщийМакет("МакетТабличный");
    ТабДок = Новый ТабличныйДокумент;
    
    ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
    ТабДок.Вывести(ОбластьШапка);
    
    ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
    
    Запрос = Новый Запрос("ВЫБРАТЬ Оборудование, ЗначениеПараметров ИЗ РегистрСведений.ПараметрыОборудования");
    Выборка = Запрос.Выполнить().Выбрать();
    
    Пока Выборка.Следующий() Цикл
        ОбластьСтрока.Параметры.Заполнить(Выборка);
        ТабДок.Вывести(ОбластьСтрока);
    КонецЦикла;
    
    // Экспортируем табличный документ в строку HTML
    Возврат ТабДок.ПолучитьHTML();
    
КонецФункции

Важные рекомендации при работе с HTML-разметкой

  1. Экранирование спецсимволов: если в строковых данных регистра могут встречаться символы <, >, & или кавычки, при строковой склейке их необходимо экранировать, чтобы не повредить структуру HTML.
  2. Контекст выполнения: получение макетов через ПолучитьОбщийМакет() и выполнение запросов к регистрам сведений должны происходить строго на сервере (директивы &НаСервере или серверные общие модули).
  3. Связка с формой: для корректного отображения всегда используйте реквизит формы строкового типа неограниченной длины, привязанный к полю HTML документа через ПутьКДанным.
← На главную