При автоматизации бизнес-процессов в 1С часто возникает необходимость информировать контрагентов или сотрудников о важных показателях: остатках на складах, задолженности или результатах закупок — для этого есть обработка автоматического контроля показателей и отправки уведомлений. Отправка данных простым текстом не всегда удобна для восприятия, поэтому лучшим решением является формирование полноценной HTML-таблицы непосредственно в теле письма. В этой статье мы подробно разберем, как правильно реализовать эту задачу, избежав типичных ошибок отображения кода.
Рассмотрим ситуацию, с которой часто сталкиваются разработчики при использовании Библиотеки Стандартных Подсистем (БСП). Проанализируем исходный код, который на первый взгляд кажется верным:
Процедура ОтправитьСообщение(Выборка)
Кому = Новый Массив;
Кому.Добавить(Новый Структура("Адрес, Представление", Выборка.ЭлПочтаДилераДляБаланса, Выборка.Дилер));
Тема = "Результат закупки аксессуаров на " + Формат(Выборка.Период, "ДФ=dd.MM.yyyy");
// Формируем HTML-разметку таблицы
ТекстHTML =
"<table border=""1"">
|<tbody>
|<tr>
|<td><strong>Дилер</strong></td>
|<td><strong>Сумма</strong></td>
|</tr>
|<tr>
|<td>"+ Строка(Выборка.Дилер) +"</td>
|<td>" + Выборка.Сумма +"</td>
|</tr>
|</tbody>
|</table>";
Тело = "Уважаемые коллеги, ниже ваши результаты:" + Символы.ПС + ТекстHTML;
УчетнаяЗапись = РаботаСПочтовымиСообщениями.СистемнаяУчетнаяЗапись();
ПараметрыОтправки = Новый Структура("Кому, Тема, Тело", Кому, Тема, Тело);
РаботаСПочтовымиСообщениями.ОтправитьПочтовоеСообщение(УчетнаяЗапись, ПараметрыОтправки);
КонецПроцедуры
При выполнении такого кода получатель письма увидит в сообщении «сырой» текст с тегами <table>, <tr> и <td>. Выясним причину: почтовый клиент (Outlook, Gmail или мобильное приложение) по умолчанию интерпретирует тело письма как обычный текст (Plain Text), если явно не указано иное. Для решения этой задачи нам необходимо сообщить подсистеме БСП, что передаваемая строка является именно HTML-документом.
Чтобы письмо отобразилось корректно, нам нужно дополнить структуру ПараметрыОтправки специальным ключом ТипТекста. В конфигурациях, использующих БСП (УТ 11, ERP, КА 2), за это отвечает перечисление ТипыТекстовЭлектронныхПисем. Разберем по шагам исправленный вариант формирования параметров:
// Добавляем четвертый параметр в структуру - ТипТекста
ПараметрыОтправки = Новый Структура();
ПараметрыОтправки.Вставить("Кому", Кому);
ПараметрыОтправки.Вставить("Тема", Тема);
ПараметрыОтправки.Вставить("Тело", Тело);
ПараметрыОтправки.Вставить("ТипТекста", Перечисления.ТипыТекстовЭлектронныхПисем.HTML);
Попытка
РаботаСПочтовымиСообщениями.ОтправитьПочтовоеСообщение(УчетнаяЗапись, ПараметрыОтправки);
Исключение
// Обработка ошибки отправки
ЗаписьЖурналаРегистрации("Отправка почты", УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Обратите внимание: при использовании РаботаСПочтовымиСообщениями.ОтправитьПочтовоеСообщение система сама сконструирует объект ИнтернетПочтовоеСообщение и установит свойство ТипТекста для его содержимого на основании вашего параметра.
Писать HTML-код вручную внутри строковых переменных — трудоемкий процесс, в котором легко допустить ошибку (например, забыть закрыть тег </td>). Кроме того, такая таблица будет выглядеть очень просто. Рассмотрим более профессиональный метод — использование объекта ТабличныйДокумент — для этой задачи есть обработка для автоматической рассылки печатных форм и отчетов из 1С.
Проанализируем преимущества этого подхода:
Посмотрим на пример кода для реализации этого метода:
// 1. Создаем табличный документ и заполняем его данными (можно через макет)
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("МакетТаблицыПисьма");
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ТабДок.Вывести(ОбластьШапка);
// ... цикл по данным ...
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
ОбластьСтрока.Параметры.Заполнить(ТекущиеДанные);
ТабДок.Вывести(ОбластьСтрока);
// 2. Сохраняем табличный документ во временный файл в формате HTML
ИмяФайла = ПолучитьИмяВременногоФайла("html");
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.HTML);
// 3. Читаем полученный HTML-код в строку
ЧтениеТекста = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8);
СтрокаHTML = ЧтениеТекста.Прочитать();
ЧтениеТекста.Закрыть();
УдалитьФайлы(ИмяФайла);
// 4. Формируем окончательное тело письма
ТелоПисьма = "<html><body>"
+ "<p>Добрый день! Публикуем результаты отчета:</p>"
+ СтрокаHTML
+ "<p>С уважением, Ваш робот 1С.</p>"
+ "</body></html>";
Выясним несколько критических моментов, которые помогут сделать ваши письма профессиональными и читаемыми во всех почтовых сервисах:
Inline CSS (Встроенные стили). Почтовые программы (особенно старые версии Outlook) игнорируют внешние файлы стилей и блоки <style> в заголовке письма. Если вы хотите раскрасить таблицу, используйте атрибут style непосредственно в тегах, например: <td style="border: 1px solid #ccc; background-color: #f9f9f9;">.
Кодировка. Всегда используйте КодировкаТекста.UTF8 при чтении и записи временных файлов HTML. Это гарантирует отсутствие «кракозябр» вместо кириллицы.
Экранирование символов. Если вы все же решили собирать HTML-строку вручную, обязательно обрабатывайте данные. Если в названии дилера встретится символ <, вся верстка может «поплыть». В современных конфигурациях для этого можно использовать функцию РаботаСHTML.ЗаэкранироватьСпецсимволыHTML().
Использование шаблонов сообщений. Если ваша конфигурация содержит подсистему БСП «Шаблоны сообщений», рассмотрите возможность настройки письма через пользовательский интерфейс — в этом поможет расширение для автоматической отправки оповещений по шаблонам. Это позволит изменять текст и оформление таблицы без привлечения программиста и внесения правок в программный код.
Таким образом, для успешной отправки таблицы достаточно правильно настроить структуру параметров для РаботаСПочтовымиСообщениями, указав ТипТекста — для этого подойдёт модуль автоматизации Email-рассылок с шаблонами HTML-писем. Однако для получения эстетичного и стабильного результата рекомендуется использовать связку ТабличныйДокумент и экспорт в HTML.