При автоматизации рассылок из 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 может отобразиться как некорректный символ или нарушить верстку.
Если дизайн письма сложный, писать весь код в модуле неудобно. В таком случае выясним причину использования макетов: это позволяет отделить оформление от логики. Мы создаем макет типа «Текст» или «HTML-документ», в котором размечаем каркас таблицы, а вместо строк данных вставляем параметр-маркер, например, [СтрокиТаблицы].
Рассмотрим, как это реализовать программно:
<tr>...</tr>.СтрЗаменить.
// Получаем макет-шаблон
ШаблонПисьма = ПолучитьМакет("МакетHTML").ПолучитьТекст();
ВсеСтроки = "";
Для Каждого Стр Из Объект.Товары Цикл
СтрокаДанных = "<tr>
|<td>" + Стр.Товар + "</td>
|<td>" + Стр.ЕдИзм + "</td>
|<td>" + Стр.Кол + "</td>
|</tr>";
ВсеСтроки = ВсеСтроки + СтрокаДанных;
КонецЦикла;
// Вставляем сформированные строки в шаблон
ИтоговыйHTML = СтрЗаменить(ШаблонПисьма, "[СтрокиТаблицы]", ВсеСтроки);
Выясним еще один интересный подход. Если у вас уже есть готовая печатная форма (макет ТабличныйДокумент), вы можете просто сохранить её в формате HTML. Это избавит вас от необходимости вручную прописывать теги и стили оформления.
Посмотрим на пример реализации через временный файл:
// Создаем табличный документ и выводим в него данные (как для печати)
ТабДок = Новый ТабличныйДокумент;
// ... тут код вывода областей из макета в ТабДок ...
// Сохраняем во временный файл
ИмяФайла = ПолучитьИмяВременногоФайла("html");
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.HTML);
// Читаем содержимое файла в строку
ТекстовыйДок = Новый ТекстовыйДокумент;
ТекстовыйДок.Прочитать(ИмяФайла, КодировкаТекста.UTF8);
ТекстHTML = ТекстовыйДок.ПолучитьТекст();
// Удаляем временный файл после использования
УдалитьФайлы(ИмяФайла);
Важное примечание: При использовании этого метода 1С генерирует достаточно «тяжелый» HTML-код с большим количеством внутренних стилей. Некоторые почтовые клиенты могут отображать такую таблицу некорректно. Поэтому для максимально стабильного результата рекомендуется первый или второй способы с использованием Inline CSS.
При формировании таблицы важно учитывать специфику работы почтовых сервисов (Outlook, Gmail, Яндекс.Почта). Проанализируем основные правила качественной верстки:
<style> в заголовке документа, пишите атрибут style прямо внутри тегов <table>, <td>, <th>.border-collapse: collapse;.<table cellpadding="5" cellspacing="0" border="1">.<, >, &, обязательно заменяйте их, иначе структура HTML-документа может быть нарушена. В 1С для этого можно написать небольшую вспомогательную функцию.Использование объекта ТекстовыйДокумент вместо обычного сложения строк (конкатенации) через оператор + может существенно ускорить процесс, если количество строк в таблице исчисляется сотнями или тысячами. Метод ДобавитьСтроку() работает быстрее, чем постоянное перевыделение памяти под огромную строку.
Таким образом, мы разобрали три основных подхода. Для простых таблиц идеально подойдет сборка в цикле. Для красивых писем с дизайном — шаблонизация. А если нужно быстро отправить точную копию печатной формы — используйте экспорт ТабличногоДокумента в HTML.