При разработке пользовательских интерфейсов в 1С часто возникает задача отображения форматированных списков, карточек или отчетов в виде веб-страницы. Для этого на форму добавляется элемент Поле HTML документа, а верстка хранится в конфигурации в виде макета типа HTMLDocument (или текстового макета). Разберем, как правильно извлечь данные из регистра сведений, заполнить шаблон и отобразить итоговую страницу пользователю.
Проанализируем ключевое отличие макета HTML от классического табличного документа (ТабличныйДокумент). В табличных документах платформа предоставляет встроенный механизм именованных областей и параметров (ПолучитьОбласть(), Параметры.Заполнить()). HTML-макет в платформе 1С хранит обычный текст с HTML-разметкой и CSS-стилями.
При обращении к общему HTML-макету на сервере метод ПолучитьОбщийМакет() возвращает объект типа ОболочкаHTMLДокумента или текстовый документ. Чтобы динамически вывести строки из информационной базы, применяются два основных подхода:
[СТРОКИ_ТАБЛИЦЫ]). В коде 1С формируются строки таблицы и подставляются функцией СтрЗаменить().ДокументHTML, в который программно добавляются новые узлы и элементы.Рассмотрим по шагам реализацию наиболее простого и быстродействующего способа подстановки данных.
Шаг 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. Вывод данных на форму
Разберем, как связать полученный результат с элементами управляемой формы:
ТекстHTMLСтраницы с типом Строка (длина неограничена).ТекстHTMLСтраницы.ПриСозданииНаСервере или обработчике обновления вызываем нашу функцию и присваиваем значение реквизиту:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ТекстHTMLСтраницы = СформироватьТекстHTML(Объект.Ссылка);
КонецПроцедуры
Проанализируем альтернативный вариант, когда макет загружается в 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.Закрыть();
КонецФункции
Выясним еще одну удобную возможность платформы 1С. Если верстку в HTML делать неудобно, можно нарисовать шаблон в стандартном табличном документе (с шрифтами, рамками и цветами), заполнить его стандартными областями и сохранить в HTML:
&НаСервере
Функция СформироватьHTMLИзТабДокумента()
Макет = ПолучитьОбщийМакет("МакетТабличный");
ТабДок = Новый ТабличныйДокумент;
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ТабДок.Вывести(ОбластьШапка);
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
Запрос = Новый Запрос("ВЫБРАТЬ Оборудование, ЗначениеПараметров ИЗ РегистрСведений.ПараметрыОборудования");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ОбластьСтрока.Параметры.Заполнить(Выборка);
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
// Экспортируем табличный документ в строку HTML
Возврат ТабДок.ПолучитьHTML();
КонецФункции
<, >, & или кавычки, при строковой склейке их необходимо экранировать, чтобы не повредить структуру HTML.ПолучитьОбщийМакет() и выполнение запросов к регистрам сведений должны происходить строго на сервере (директивы &НаСервере или серверные общие модули).ПутьКДанным.