Вывод данных из 1С:Предприятие в формат HTML — задача, с которой рано или поздно сталкивается любой разработчик.hether вам нужно сгенерировать простой отчет для отправки по почте, создать веб-страницу на основе данных 1С или интегрировать систему с внешним сервисом, умение формировать HTML-код прямо из конфигурации сэкономит часы ручной работы. В этой статье мы разберем 5 практических способов вывода HTML-документов, от элементарных до продвинутых, с готовыми примерами кода и типичными ошибками.
Особенность работы с HTML в 1С заключается в том, что система изначально не предназначена для веб-разработки. Здесь нет встроенного движка шаблонов вроде Jinja2 или Twig, но есть мощный инструментарий для манипуляции строками, работы с файлами и интеграции через COM-объекты. Мы покажем, как обойти эти ограничения и получить гибкий результат — от статичных таблиц до документов с CSS-стилями и даже JavaScript-скриптами.
Важно понимать: подход к генерации HTML зависит от конечной цели. Для печати на принтере хватит минимальной разметки, а для отображения в браузере потребуется полноценный документ с тегами <!DOCTYPE>, <head> и <body>. Мы рассмотрим оба сценария, а также расскажем, как автоматизировать процесс и избежать типичных ошибок при работе с кодировками и специальными символами.
1. Простейший вывод HTML: метод Write() и строковые шаблоны
Начнем с самого базового способа — формирования HTML-кода через конкатенацию строк. Этот метод подходит для простых документов, где не требуется сложная структура или динамическое наполнение. Например, когда нужно сгенерировать письмо с таблицей данных для отправки по email.
Основной инструмент здесь — функция СтрокаHTML = "" и оператор конкатенации +. Рассмотрим пример создания HTML-таблицы с данными о номенклатуре:
Функция ПолучитьHTMLТаблицуНоменклатуры()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Наименование КАК Наименование,
| Номенклатура.Артикул КАК Артикул,
| Номенклатура.Цена КАК Цена
|ИЗ
| Справочник.Номенклатура КАК Номенклатура";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
СтрокаHTML = "<table border='1' cellpadding='5'>";
СтрокаHTML = СтрокаHTML + "<tr><th>Наименование</th><th>Артикул</th><th>Цена</th></tr>";
Пока Выборка.Следующий() Цикл
СтрокаHTML = СтрокаHTML +
"<tr>" +
"<td>" + Выборка.Наименование + "</td>" +
"<td>" + Выборка.Артикул + "</td>" +
"<td>" + Формат(Выборка.Цена, "ЧДЦ=2") + "</td>" +
"</tr>";
КонецЦикла;
СтрокаHTML = СтрокаHTML + "</table>";
Возврат СтрокаHTML;
КонецФункции
Этот код генерирует простую таблицу с границами. Обратите внимание на использование функции Формат() для корректного отображения числовых значений. Основной недостаток метода — сложность поддержки: при изменении структуры данных придется переписывать весь HTML-шаблон.
⚠️ Внимание: При таком подходе легко забыть про экранирование специальных символов (например,&,<,>). Если в данных номенклатуры встречаются такие символы, они сломают структуру HTML. Используйте функциюСтрЗаменить()для их замены на HTML-сущности.
Для вывода результата в файл достаточно добавить:
HTML = ПолучитьHTMLТаблицуНоменклатуры();
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.УстановитьТекст(HTML);
ТекстовыйДокумент.Записать("C:\temp\номенклатура.html", КодировкаТекста.UTF8);
2. Использование объекта ТекстовыйДокумент для сложных структур
Объект ТекстовыйДокумент предоставляет более удобные методы для работы с текстом, включая HTML. Его преимущество — возможность добавлять строки построчно без ручной конкатенации, что упрощает чтение кода и уменьшает риск ошибок.
Пример генерации HTML-отчета с заголовком и стилями:
Процедура СформироватьHTMLОтчет()
ТекстHTML = Новый ТекстовыйДокумент;
// Добавляем заголовок документа
ТекстHTML.ДобавитьСтроку("<!DOCTYPE html>");
ТекстHTML.ДобавитьСтроку("<html>");
ТекстHTML.ДобавитьСтроку("<head>");
ТекстHTML.ДобавитьСтроку("<meta charset='UTF-8'>");
ТекстHTML.ДобавитьСтроку("<title>Отчет по продажам</title>");
ТекстHTML.ДобавитьСтроку("<style>");
ТекстHTML.ДобавитьСтроку(" body { font-family: Arial; }");
ТекстHTML.ДобавитьСтроку(" table { border-collapse: collapse; width: 100%; }");
ТекстHTML.ДобавитьСтроку(" th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }");
ТекстHTML.ДобавитьСтроку(" th { background-color: #f2f2f2; }");
ТекстHTML.ДобавитьСтроку("</style>");
ТекстHTML.ДобавитьСтроку("</head>");
ТекстHTML.ДобавитьСтроку("<body>");
ТекстHTML.ДобавитьСтроку("<h1>Отчет по продажам за " + ТекущаяДата() + "</h1>");
// Добавляем таблицу с данными (аналогично предыдущему примеру)
// ...
ТекстHTML.ДобавитьСтроку("</body>");
ТекстHTML.ДобавитьСтроку("</html>");
// Сохраняем в файл
ТекстHTML.Записать("C:\Отчеты\продажи_" + Формат(ТекущаяДата(), "ДЛФ=Д") + ".html");
КонецПроцедуры
Такой подход позволяет:
- 📝 Разделять логику формирования заголовка, стилей и тела документа
- 🎨 Легко добавлять CSS-стилизацию прямо в документ
- 📁 Сохранять результат в файл с динамическим именем (например, по дате)
3. Шаблоны XDTO: структурированный подход для XML/HTML
Для более сложных документов с жесткой структурой рекомендуем использовать механизм XDTO (XML Data Transfer Objects). Он позволяет работать с XML-шаблонами, которые затем можно преобразовать в HTML. Этот метод особенно удобен, если вам нужно генерировать документы по фиксированной схеме (например, счета-фактуры в электронном виде).
Пример создания HTML через XDTO:
// 1. Создаем пакет XDTO
Пакет = XDTOФабрика.ПолучитьПакет("");
Пакет.ПространстваИмен.Добавить("http://www.w3.org/1999/xhtml", "html");
// 2. Создаем корневой элемент HTML
ДокументXDTO = Пакет.СоздатьДокумент();
Корень = ДокументXDTO.СоздатьКорневойЭлемент("html", "http://www.w3.org/1999/xhtml");
// 3. Добавляем структуру документа
Заголовок = Корень.СоздатьДочернийЭлемент("head");
Тело = Корень.СоздатьДочернийЭлемент("body");
Заголовок.СоздатьДочернийЭлемент("title").УстановитьЗначение("Отчет из 1С");
Тело.СоздатьДочернийЭлемент("h1").УстановитьЗначение("Список контрагентов");
// 4. Добавляем таблицу с данными
Таблица = Тело.СоздатьДочернийЭлемент("table");
Таблица.УстановитьАтрибут("border", "1");
// Заголовок таблицы
Строка = Таблица.СоздатьДочернийЭлемент("tr");
Строка.СоздатьДочернийЭлемент("th").УстановитьЗначение("Наименование");
Строка.СоздатьДочернийЭлемент("th").УстановитьЗначение("ИНН");
// Данные из справочника Контрагенты
Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 10 Наименование, ИНН ИЗ Справочник.Контрагенты");
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Строка = Таблица.СоздатьДочернийЭлемент("tr");
Строка.СоздатьДочернийЭлемент("td").УстановитьЗначение(Выборка.Наименование);
Строка.СоздатьДочернийЭлемент("td").УстановитьЗначение(Выборка.ИНН);
КонецЦикла;
// 5. Преобразуем в строку и сохраняем
СтрокаHTML = ДокументXDTO.Записать();
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.УстановитьТекст(СтрокаHTML);
ТекстовыйДокумент.Записать("C:\Отчеты\контрагенты.html");
Преимущества XDTO:
- 🛠️ Строгая типизация — ошибки структуры выявляются на этапе компиляции
- 🔄 Легко преобразовывать данные между XML и HTML
- 📋 Удобно для документов с фиксированной структурой (счета, акты)
⚠️ Внимание: При работе с XDTO в 1С:Предприятие 8.3 версии ниже8.3.10могут возникать проблемы с кодировками при записи в файл. Всегда проверяйте результат в браузере и при необходимости применяйтеКодировкаТекста.UTF8.
4. Генерация HTML через COM-объекты (MS Word, Excel)
Если вам нужно сгенерировать документ со сложным форматированием (например, договор с логотипом компании, таблицами и подписями), удобнее использовать COM-объекты Microsoft Word или Excel. Эти программы позволяют создавать документы с богатым оформлением, а затем сохранять их в формате HTML.
Пример генерации HTML через Word:
Процедура СоздатьHTMLЧерезWord()
Попытка
Word = Новый COMОбъект("Word.Application");
Документ = Word.Documents.Add();
// Добавляем заголовок
Выбор = Word.Selection;
Выбор.ParagraphFormat.Alignment = 1; // По центру
Выбор.Font.Size = 18;
Выбор.Font.Bold = Истина;
Выбор.TypeText("Отчет по продажам");
// Добавляем таблицу
Таблица = Документ.Tables.Add(Выбор.Range, 5, 3);
Таблица.Borders.Enable = Истина;
// Заполняем таблицу данными
Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 5 Наименование, Количество, Сумма ИЗ Документ.РеализацияТоваровУслуг");
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
СтрокаНомер = 1;
Пока Выборка.Следующий() Цикл
Таблица.Cell(СтрокаНомер, 1).Range.Text = Выборка.Наименование;
Таблица.Cell(СтрокаНомер, 2).Range.Text = Выборка.Количество;
Таблица.Cell(СтрокаНомер, 3).Range.Text = Формат(Выборка.Сумма, "ЧДЦ=2");
СтрокаНомер = СтрокаНомер + 1;
КонецЦикла;
// Сохраняем как HTML
ПутьКФайлу = "C:\Отчеты\продажи_word.html";
Документ.SaveAs(ПутьКФайлу, 8); // 8 - формат HTML
Word.Quit();
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Этот метод дает максимальную гибкость в оформлении, но имеет ограничения:
| Преимущества | Недостатки |
|---|---|
| 🎨 Полное форматирование (шрифты, цвета, выравнивание) | 🐢 Медленная работа при большом объеме данных |
| 📊 Поддержка диаграмм и графиков | 🖥️ Требует установленного MS Office на сервере |
| 📑 Легко добавлять колонтитулы и нумерацию страниц | 🔄 Сложно автоматизировать для массовой генерации |
Если вам нужно сгенерировать документ с логотипом компании, лучше заранее подготовить шаблон Word с нужным оформлением и заполнять только динамические данные через закладки (Bookmarks).
5. Продвинутые техники: встраивание CSS и JavaScript
Для создания интерактивных HTML-документов (например, отчетов с сортировкой или фильтрацией прямо в браузере) можно встраивать CSS-стили и JavaScript-скрипты. Это актуально, если документ будет открываться в браузере, а не печататься.
Пример добавления сортировки таблицы через JavaScript:
Функция ПолучитьHTMLСJavaScript()
СтрокаHTML = ""
+ "<!DOCTYPE html>"
+ "<html>"
+ "<head>"
+ " <meta charset='UTF-8'>"
+ " <title>Интерактивный отчет</title>"
+ " <script src='https://cdn.jsdelivr.net/npm/sorttable@1.0.1/sorttable.min.js'></script>"
+ " <style>"
+ " table.sortable thead { background-color: #eee; cursor: pointer; }"
+ " table.sortable td, table.sortable th { padding: 8px; }"
+ " </style>"
+ "</head>"
+ "<body>"
+ " <h1>Отчет с возможностью сортировки</h1>"
+ " <table class='sortable'>"
+ " <thead>"
+ " <tr><th>Дата</th><th>Контрагент</th><th>Сумма</th></tr>"
+ " </thead>"
+ " <tbody>";
// Получаем данные из 1С и добавляем строки таблицы
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 20 Дата, Контрагент, Сумма ИЗ Документ.РеализацияТоваровУслуг";
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
СтрокаHTML = СтрокаHTML +
"<tr>" +
"<td>" + Формат(Выборка.Дата, "ДЛФ=Д") + "</td>" +
"<td>" + Выборка.Контрагент + "</td>" +
"<td>" + Формат(Выборка.Сумма, "ЧДЦ=2") + "</td>" +
"</tr>";
КонецЦикла;
СтрокаHTML = СтрокаHTML +
" </tbody>"
+ " </table>"
+ "</body>"
+ "</html>";
Возврат СтрокаHTML;
КонецФункции
В этом примере мы подключаем библиотеку Sorttable для сортировки таблицы по столбцам. Обратите внимание:
- 🌐 JavaScript подключается через CDN (сеть доставки контента)
- 🎨 Стили определяют внешний вид сортируемых заголовков
- 📊 Данные динамически подставляются из запроса к базе 1С
Как проверить работоспособность скрипта?
Откройте сгенерированный HTML-файл в браузере и попробуйте кликнуть на заголовки столбцов. Если сортировка работает — скрипт подключен правильно. Если нет, проверьте подключение к интернету (для загрузки библиотеки с CDN) или скачайте Sorttable локально и подключите через относительный путь.
6. Вывод HTML в веб-клиенте и на печать
Сгенерированный HTML-документ можно не только сохранить в файл, но и:
- 🖨️ Напечатать напрямую из 1С
- 🌍 Отобразить в веб-клиенте
- 📧 Отправить по электронной почте
- 📎 Вставить в документ Word/Excel как OLE-объект
Рассмотрим каждый вариант подробнее.
Печать HTML-документа
Для печати HTML из 1С проще всего сохранить его во временный файл и открыть в браузере по умолчанию с командой печати:
Процедура НапечататьHTML(СтрокаHTML)
ИмяФайла = ПоложитьВоВременноеХранилище(Новый ДвоичныеДанные(СтрокаHTML, КодировкаТекста.UTF8));
ПутьКФайлу = КаталогВременныхФайлов() + "print.html";
ДвоичныеДанные = ПолучитьИзВременногоХранилища(ИмяФайла);
ДвоичныеДанные.Записать(ПутьКФайлу);
// Открываем файл в браузере с командой печати
КоманднаяСтрока = "cmd /c start """" /max """ + ПутьКФайлу + """";
ЗапуститьПриложение(КоманднаяСтрока);
// Альтернативно: отправить напрямую на принтер через браузер
// КоманднаяСтрока = "cmd /c start """" /max ""msedge --headless --print-to-default --print-to-pdf=no """ + ПутьКФайлу + """";
КонецПроцедуры
Отображение в веб-клиенте
В веб-клиенте 1С можно показать HTML через элемент управления ПолеHTMLДокумента. Пример:
&НаКлиенте
Процедура ОтобразитьHTMLНаФорме(СтрокаHTML)
ЭлементыФормы.ПолеHTML.УстановитьТекст(СтрокаHTML);
КонецПроцедуры
⚠️ Внимание: В веб-клиенте 1С:Предприятие есть ограничения на выполнение скриптов в ПолеHTMLДокумента по соображениям безопасности. JavaScript-код может быть заблокирован браузером. Для интерактивных элементов лучше использовать расширения 1С или внешние компоненты.
Отправка по email
Для отправки HTML-письма используйте объект Почта:
Процедура ОтправитьHTMLПоПочте(СтрокаHTML, АдресПолучателя)
Почта = Новый Почта;
Сообщение = Почта.СоздатьСообщение();
Сообщение.Текст = СтрокаHTML;
Сообщение.Тема = "Отчет из 1С: " + Формат(ТекущаяДата(), "ДЛФ=Д");
Сообщение.ФорматПисьма = ФорматПисьма.HTML;
Сообщение.Получатели.Добавить(АдресПолучателя);
Попытка
Почта.Отправить(Сообщение);
Сообщить("Письмо отправлено успешно!");
Исключение
Сообщить("Ошибка отправки: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
7. Типичные ошибки и как их избежать
При генерации HTML из 1С разработчики часто сталкиваются с типичными проблемами. Вот самые распространенные и способы их решения:
| Проблема | Причина | Решение |
|---|---|---|
| Русские буквы отображаются как "???" | Неверная кодировка при записи файла | Используйте КодировкаТекста.UTF8 при записи |
| Специальные символы (&, <, >) ломают разметку | Символы не экранированы | Заменяйте на HTML-сущности: &, <, > |
| Таблица отображается без границ | Не указан атрибут border или отсутствуют стили |
Добавьте border="1" или CSS-стилизацию |
| JavaScript не работает в сгенерированном файле | Браузер блокирует скрипты из локальных файлов | Открывайте файл через веб-сервер или используйте расширения |
| Документ открывается как текст, а не HTML | Файл сохранен с расширением .txt | Указывайте расширение .html при сохранении |
Для экранирования специальных символов используйте функцию:
Функция ЭкранироватьHTML(Строка)
Строка = СтрЗаменить(Строка, "&", "&");
Строка = СтрЗаменить(Строка, "<", "<");
Строка = СтрЗаменить(Строка, ">", ">");
Строка = СтрЗаменить(Строка, """", """);
Строка = СтрЗаменить(Строка, "'", "'");
Возврат Строка;
КонецФункции
☑️ Проверка перед генерацией HTML
8. Оптимизация производительности при генерации больших документов
При генерации HTML-документов с тысячами строк (например, большие отчеты) важно оптимизировать код, чтобы избежать:
- 🐢 Замедления интерфейса 1С
- 💥 Переполнения памяти
- 🕒 Чрезмерного времени выполнения
Рекомендации по оптимизации:
- Используйте потоковую запись вместо конкатенации строк:
ТекстовыйДокумент = Новый ТекстовыйДокумент;ТекстовыйДокумент.ДобавитьСтроку("<table>");
// ... добавление строк ...
ТекстовыйДокумент.Записать("путь\к\файлу.html");
- Разбивайте большие документы на части. Например, генерируйте отдельные файлы для каждого раздела отчета, а затем объединяйте их.
- Кэшируйте повторяющиеся фрагменты. Если в документе много одинаковых блоков (например, заголовков таблиц), храните их в переменных.
- Используйте фоновые задания для генерации больших отчетов, чтобы не блокировать интерфейс:
ФоновоеЗадание = ФоновыеЗадания.Выполнить("ГенерацияОтчета", Новый Структура("Параметры", Параметры)); - Оптимизируйте запросы к базе. Получайте только необходимые данные с помощью
ВЫБРАТЬ РАЗЛИЧНЫЕиГДЕ.
Критическая ошибка при работе с большими документами: если вы генерируете HTML строками через оператор "+", то при объеме данных более 10 000 строк 1С может выдать ошибку переполнения строки. В этом случае обязательно используйте ТекстовыйДокумент или запись в временный файл по частям.
Для документов более 5000 строк всегда используйте потоковую запись через ТекстовыйДокумент или фоновые задания. Конкатенация строк в этом случае неэффективна и может привести к ошибкам памяти.
FAQ: Частые вопросы по выводу HTML из 1С
Можно ли вставить в HTML-документ картинку, хранящуюся в базе 1С?
Да, для этого нужно:
- Извлечь двоичные данные картинки из базы (поле типа
ХранилищеЗначения) - Сохранить во временный файл (например,
C:\temp\image.png) - В HTML-коде указать путь к файлу:
<img src="file:///C:/temp/image.png">
Для веб-клиента лучше преобразовать картинку в base64:
ДвоичныеДанные = ПолучитьКартинкуИзБазы();
Base64Строка = Base64Строка(ДвоичныеДанные);
HTMLКод = "<img src='data:image/png;base64," + Base64Строка + "'>";
Как сделать адаптивный HTML-отчет для мобильных устройств?
Добавьте в заголовок документа мета-тег viewport и адаптивные CSS-стили:
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
table { width: 100% !important; }
@media (max-width: 600px) {
th, td { padding: 4px; font-size: 12px; }
}
</style>
Для сложных отчетов рассмотрите возможность генерации отдельных версий для десктопа и мобильных устройств.
Почему при открытии HTML-файла в браузере русские буквы отображаются как иероглифы?
Это проблема с кодировкой. Убедитесь, что:
- При записи файла указана кодировка
UTF-8 - В HTML-документе есть тег