Вывод данных из 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-стилизацию прямо в документ
  • 📁 Сохранять результат в файл с динамическим именем (например, по дате)
📊 Какой способ генерации HTML вы используете чаще?
Ручная конкатенация строк
Объект ТекстовыйДокумент
Шаблоны XDTO
Внешние компоненты
Не генерирую HTML из 1С

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-сущности: &amp;, &lt;, &gt;
Таблица отображается без границ Не указан атрибут border или отсутствуют стили Добавьте border="1" или CSS-стилизацию
JavaScript не работает в сгенерированном файле Браузер блокирует скрипты из локальных файлов Открывайте файл через веб-сервер или используйте расширения
Документ открывается как текст, а не HTML Файл сохранен с расширением .txt Указывайте расширение .html при сохранении

Для экранирования специальных символов используйте функцию:

Функция ЭкранироватьHTML(Строка)

Строка = СтрЗаменить(Строка, "&", "&");

Строка = СтрЗаменить(Строка, "<", "<");

Строка = СтрЗаменить(Строка, ">", ">");

Строка = СтрЗаменить(Строка, """", """);

Строка = СтрЗаменить(Строка, "'", "'");

Возврат Строка;

КонецФункции

☑️ Проверка перед генерацией HTML

Выполнено: 0 / 5

8. Оптимизация производительности при генерации больших документов

При генерации HTML-документов с тысячами строк (например, большие отчеты) важно оптимизировать код, чтобы избежать:

  • 🐢 Замедления интерфейса 1С
  • 💥 Переполнения памяти
  • 🕒 Чрезмерного времени выполнения

Рекомендации по оптимизации:

  1. Используйте потоковую запись вместо конкатенации строк:
    ТекстовыйДокумент = Новый ТекстовыйДокумент;
    

    ТекстовыйДокумент.ДобавитьСтроку("<table>");

    // ... добавление строк ...

    ТекстовыйДокумент.Записать("путь\к\файлу.html");

  2. Разбивайте большие документы на части. Например, генерируйте отдельные файлы для каждого раздела отчета, а затем объединяйте их.
  3. Кэшируйте повторяющиеся фрагменты. Если в документе много одинаковых блоков (например, заголовков таблиц), храните их в переменных.
  4. Используйте фоновые задания для генерации больших отчетов, чтобы не блокировать интерфейс:
    ФоновоеЗадание = ФоновыеЗадания.Выполнить("ГенерацияОтчета", Новый Структура("Параметры", Параметры));
  5. Оптимизируйте запросы к базе. Получайте только необходимые данные с помощью ВЫБРАТЬ РАЗЛИЧНЫЕ и ГДЕ.

Критическая ошибка при работе с большими документами: если вы генерируете HTML строками через оператор "+", то при объеме данных более 10 000 строк 1С может выдать ошибку переполнения строки. В этом случае обязательно используйте ТекстовыйДокумент или запись в временный файл по частям.

💡

Для документов более 5000 строк всегда используйте потоковую запись через ТекстовыйДокумент или фоновые задания. Конкатенация строк в этом случае неэффективна и может привести к ошибкам памяти.

FAQ: Частые вопросы по выводу HTML из 1С

Можно ли вставить в HTML-документ картинку, хранящуюся в базе 1С?

Да, для этого нужно:

  1. Извлечь двоичные данные картинки из базы (поле типа ХранилищеЗначения)
  2. Сохранить во временный файл (например, C:\temp\image.png)
  3. В 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-документе есть тег