Как вставить таблицу из 1С (MXL) в тело электронного письма?

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

При автоматизации рассылок из 1С часто возникает задача отправить данные не в виде прикрепленного файла (Excel или PDF), а непосредственно внутри текста письма. Это удобно для получателя: информацию можно просмотреть сразу, не скачивая вложения. Рассмотрим подробнее, как реализовать вставку табличного документа (MXL) в тело электронного письма, используя встроенные механизмы платформы 1С:Предприятие.

Метод 1: Автоматическая конвертация табличного документа в HTML

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

Разберем по шагам алгоритм действий:

  1. Сформируем нужный нам табличный документ (выведем макет, заполним параметры).
  2. Сохраним его во временный файл на диске с расширением .html.
  3. Прочитаем содержимое этого файла в строковую переменную.
  4. Поместим эту строку в текст почтового сообщения.

Проанализируем пример кода, реализующий этот подход:


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

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

// 3. Формируем письмо
Почта = Новый ИнтернетПочта;
Письмо = Новый ИнтернетПочтовоеСообщение;
Письмо.Тема = "Отчет по задолженности";

// Важно указать тип текста как HTML
ТекстПисьма = Письмо.Тексты.Добавить();
ТекстПисьма.ТипТекста = ТипТекстаПочтовогоСообщения.HTML;
ТекстПисьма.Текст = "<html><body>" + HTMLКодТаблицы + "</body></html>";

Обратите внимание: При таком способе 1С генерирует полноценный HTML-документ со своими стилями в секции head. Некоторые почтовые клиенты (например, Gmail или мобильные приложения) могут игнорировать внешние блоки стилей, что приведет к "рассыпанию" оформления таблицы.

Метод 2: Ручное формирование HTML-таблицы

Если таблица имеет простую структуру и нам нужен полный контроль над кодом, мы можем сформировать HTML-теги вручную. Это гарантирует более стабильное отображение в сложных почтовых клиентах, таких как Microsoft Outlook.

Выясним, как собрать таблицу с помощью конкатенации строк. Рассмотрим пример формирования шапки таблицы и заполнения строк данными:


ТекстПисьма = "<DIV>Добрый день!</DIV><BR>" + 
              "<TABLE border='1' cellspacing='0' cellpadding='5' style='border-collapse: collapse; width: 100%;'>" +
              "<TR style='background-color: #f2f2f2;'>" +
              "<TD><strong>Документ</strong></TD>" +
              "<TD><strong>Сумма</strong></TD>" +
              "</TR>";

Для Каждого СтрокаДанных Из ТаблицаДолгов Цикл
    ТекстПисьма = ТекстПисьма + 
                  "<TR>" +
                  "<TD>" + СтрокаДанных.Документ + "</TD>" +
                  "<TD>" + Формат(СтрокаДанных.Сумма, "ЧДЦ=2") + "</TD>" +
                  "</TR>";
КонецЦикла;

ТекстПисьма = ТекстПисьма + "</TABLE>";

В данном примере мы используем Inline CSS (стили непосредственно внутри тегов), что является "золотым стандартом" для верстки электронных писем. Атрибуты border-collapse и cellpadding позволяют сделать таблицу аккуратной и читаемой.

Тонкости отображения: Стили и Картинки

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

Чтобы решить эту проблему, рекомендуется использовать механизм Inline CSS. В 1С это можно сделать программно, прочитав полученный HTML-код и заменив классы (например, class="R1C1") на конкретные стили из блока стилей документа. Однако это трудоемкая задача, требующая написания парсера.

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

  1. Добавить в коллекцию Вложения почтового сообщения.
  2. Установить вложением свойство Идентификатор (Content-ID).
  3. В HTML-коде заменить путь к картинке на конструкцию src="cid:Идентификатор".

Использование объекта ФорматированныйДокумент

Начиная с версии платформы 8.3.6, для работы с HTML-содержимым писем удобно использовать объект ФорматированныйДокумент. Он позволяет более гибко манипулировать текстом и оформлением.

Рассмотрим пример использования:


// Создаем объект и загружаем в него HTML, полученный из табличного документа
ФормДок = Новый ФорматированныйДокумент;
ФормДок.УстановитьHTML(HTMLКодТаблицы, Новый Структура);

// Теперь мы можем программно получить очищенный и подготовленный HTML
ТекстДляПисьма = "";
КартинкиПисьма = Новый Структура;
ФормДок.ПолучитьHTML(ТекстДляПисьма, КартинкиПисьма);

Этот метод помогает "причесать" HTML-код и упрощает работу с внедренными изображениями.

Особенности рендеринга в Outlook

Посмотрим на ситуацию со стороны получателя, использующего Microsoft Outlook. Этот почтовый клиент использует движок Microsoft Word для отображения писем. Он очень капризен к современным стандартам верстки. Для того чтобы ваша таблица выглядела в нем корректно, придерживайтесь следующих правил:

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

← На главную