Как программно сформировать динамическую HTML-таблицу в 1С для отправки по почте

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

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

Способ 1. Программная сборка HTML-строки в цикле

Этот метод является наиболее гибким и часто используемым. Суть его заключается в том, что мы создаем строковую переменную и последовательно «склеиваем» в ней теги HTML вместе с данными из нашей информационной базы. Разберем этот процесс по шагам.

Сначала мы создаем «шапку» таблицы, которая остается неизменной. Затем запускаем цикл по строкам табличной части документа и для каждой итерации добавляем новую строку таблицы <tr> и ячейки <td>.

Проанализируем пример кода:


// Инициализируем начало таблицы и заголовок
ТекстHTML = "<table border='1' style='border-collapse: collapse; width: 100%;'>
|<thead>
|<tr style='background-color: #f2f2f2;'>
|<th>Наименование товара</th>
|<th>Ед. изм.</th>
|<th>Количество</th>
</tr>
|</thead>
|<tbody>";

// Перебираем строки табличной части документа
Для Каждого СтрокаТовар Из Объект.Товары Цикл
    
    // Формируем строку таблицы с данными
    СтрокаТаблицы = "<tr>
    |<td>" + СтрокаТовар.Номенклатура + "</td>
    |<td>" + СтрокаТовар.ЕдиницаИзмерения + "</td>
    |<td align='right'>" + Формат(СтрокаТовар.Количество, "ЧГ=0") + "</td>
    |</tr>";
    
    ТекстHTML = ТекстHTML + СтрокаТаблицы;
    
КонецЦикла;

// Закрываем таблицу
ТекстHTML = ТекстHTML + "</tbody></table>";

// Передаем сформированный текст в письмо
ТекстСообщения = Письмо.Тексты.Добавить();
ТекстСообщения.ТипТекста = ТипТекстаПочтовогоСообщения.HTML;
ТекстСообщения.Текст = ТекстHTML;

В данном примере мы использовали функцию Формат с параметром ЧГ=0. Это критически важно, так как по умолчанию 1С разделяет группы разрядов неразрывным пробелом, который в HTML может отобразиться как некорректный символ или нарушить верстку.

Способ 2. Использование метода шаблонизации (СтрЗаменить)

Если дизайн письма сложный, писать весь код в модуле неудобно. В таком случае выясним причину использования макетов: это позволяет отделить оформление от логики. Мы создаем макет типа «Текст» или «HTML-документ», в котором размечаем каркас таблицы, а вместо строк данных вставляем параметр-маркер, например, [СтрокиТаблицы].

Рассмотрим, как это реализовать программно:

  1. Получаем текст шаблона из макета.
  2. В цикле формируем только фрагменты <tr>...</tr>.
  3. Заменяем маркер в основном шаблоне на сформированный блок строк с помощью функции СтрЗаменить.

// Получаем макет-шаблон
ШаблонПисьма = ПолучитьМакет("МакетHTML").ПолучитьТекст();

ВсеСтроки = "";
Для Каждого Стр Из Объект.Товары Цикл
    СтрокаДанных = "<tr>
    |<td>" + Стр.Товар + "</td>
    |<td>" + Стр.ЕдИзм + "</td>
    |<td>" + Стр.Кол + "</td>
    |</tr>";
    ВсеСтроки = ВсеСтроки + СтрокаДанных;
КонецЦикла;

// Вставляем сформированные строки в шаблон
ИтоговыйHTML = СтрЗаменить(ШаблонПисьма, "[СтрокиТаблицы]", ВсеСтроки);

Способ 3. Конвертация табличного документа в HTML

Выясним еще один интересный подход. Если у вас уже есть готовая печатная форма (макет ТабличныйДокумент), вы можете просто сохранить её в формате HTML. Это избавит вас от необходимости вручную прописывать теги и стили оформления.

Посмотрим на пример реализации через временный файл:


// Создаем табличный документ и выводим в него данные (как для печати)
ТабДок = Новый ТабличныйДокумент;
// ... тут код вывода областей из макета в ТабДок ...

// Сохраняем во временный файл
ИмяФайла = ПолучитьИмяВременногоФайла("html");
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.HTML);

// Читаем содержимое файла в строку
ТекстовыйДок = Новый ТекстовыйДокумент;
ТекстовыйДок.Прочитать(ИмяФайла, КодировкаТекста.UTF8);
ТекстHTML = ТекстовыйДок.ПолучитьТекст();

// Удаляем временный файл после использования
УдалитьФайлы(ИмяФайла);

Важное примечание: При использовании этого метода 1С генерирует достаточно «тяжелый» HTML-код с большим количеством внутренних стилей. Некоторые почтовые клиенты могут отображать такую таблицу некорректно. Поэтому для максимально стабильного результата рекомендуется первый или второй способы с использованием Inline CSS.

Особенности оформления HTML для электронных писем

При формировании таблицы важно учитывать специфику работы почтовых сервисов (Outlook, Gmail, Яндекс.Почта). Проанализируем основные правила качественной верстки:

Использование объекта ТекстовыйДокумент вместо обычного сложения строк (конкатенации) через оператор + может существенно ускорить процесс, если количество строк в таблице исчисляется сотнями или тысячами. Метод ДобавитьСтроку() работает быстрее, чем постоянное перевыделение памяти под огромную строку.

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

← На главную