При автоматизации бизнес-процессов в 1С часто возникает задача отправить сформированный отчет или таблицу данных по электронной почте. В зависимости от требований к оформлению и объема данных задачу можно решить двумя основными путями: отправить таблицу как файл-вложение (например, выгрузить в формат Excel и упаковать в ZIP-архив) или встроить форматированную таблицу непосредственно в тело письма в виде HTML-разметки.
Рассмотрим оба этих варианта подробно, разберем по шагам программную реализацию и проанализируем нюансы работы со встроенной почтовой службой платформы 1С.
Если таблица содержит большое количество колонок и строк, наиболее надежный и читабельный способ доставки — сохранение табличного документа в файл формата Excel или PDF с последующей упаковкой в архив и прикреплением к почтовому сообщению.
Разберем по шагам, как устроен этот алгоритм:
ТабличныйДокумент нужными данными.Записать.ЗаписьZipФайла для уменьшения объема пересылаемых данных.ИнтернетПочтовыйПрофиль.ИнтернетПочтовоеСообщение, заполняем адреса, тему письма, текст и прикрепляем созданный архив в коллекцию Вложения.ИнтернетПочта.Посмотрим на пример программного кода:
ТабДок = Новый ТабличныйДокумент;
// Заполнение макета и вывод секций в ТабДок
// ...
ИмяФайла = КаталогВременныхФайлов() + "ПрайсЛист.xls";
ТабДок.Вывод = ИспользованиеВывода.Разрешить;
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLS);
// Архивируем сформированный файл Excel
ИмяZIPФайла = СтрЗаменить(ИмяФайла, ".xls", ".zip");
ФайлАрхива = Новый ЗаписьZipФайла(ИмяZIPФайла, , , МетодСжатияZIP.Сжатие, УровеньСжатияZIP.Оптимальный);
ФайлАрхива.Добавить(ИмяФайла, РежимСохраненияПутейZIP.НеСохранятьПути);
ФайлАрхива.Записать();
// Настройка почтового профиля
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АутентификацияSMTP = СпособSMTPАутентификации.Login;
Профиль.АдресСервераSMTP = "smtp.mail.ru";
Профиль.ПортSMTP = 465;
Профиль.ИспользоватьSSLSMTP = Истина;
Профиль.ПользовательSMTP = "user@mail.ru";
Профиль.ПарольSMTP = "секретный_пароль_приложения";
Профиль.ВремяОжидания = 30;
Почта = Новый ИнтернетПочта;
Попытка
Почта.Подключиться(Профиль);
Исключение
Сообщить("Ошибка при подключении к почтовому серверу: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
Сообщение = Новый ИнтернетПочтовоеСообщение;
Сообщение.Отправитель = "user@mail.ru";
Сообщение.ИмяОтправителя = "Уведомления 1С";
ПочтовыйАдрес = Сообщение.Получатели.Добавить();
ПочтовыйАдрес.Адрес = "client@domain.com";
Сообщение.Тема = "Сформированный отчет из 1С";
// Добавляем файл архива во вложения
Сообщение.Вложения.Добавить(ИмяZIPФайла);
// Формируем текстовое сопровождение
ТекстПисьма = Сообщение.Тексты.Добавить();
ТекстПисьма.Текст = "Добрый день! Высылаем запрошенный отчет во вложении.";
ТекстПисьма.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст;
Попытка
Почта.Послать(Сообщение);
Сообщить("Письмо успешно отправлено!");
Исключение
Сообщить("Не удалось отправить сообщение: " + ОписаниеОшибки());
КонецПопытки;
Почта.Отключиться();
// Удаляем временные файлы с диска
Попытка
УдалитьФайлы(ИмяФайла);
УдалитьФайлы(ИмяZIPФайла);
Исключение
// Обработка ошибки удаления при необходимости
КонецПопытки;
Когда требуется, чтобы получатель увидел таблицу сразу при открытии письма без необходимости скачивать вложения, оптимально использовать HTML-форматирование. Платформа 1С позволяет сохранить ТабличныйДокумент в формат HTML с сохранением всех стилей ячеек, рамок и цветов шрифта.
Рассмотрим подробнее шаги реализации:
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.HTML).ЧтениеТекста или ТекстовыйДокумент.ИнтернетПочтовоеСообщение добавляем текст с указанием типа ТипТекстаПочтовогоСообщения.HTML.Посмотрим на пример кода для чтения HTML-таблицы в тело письма:
ИмяФайлаHTML = КаталогВременныхФайлов() + "Таблица.html";
ТабДок.Записать(ИмяФайлаHTML, ТипФайлаТабличногоДокумента.HTML);
// Считываем разметку в строку
Чтение = Новый ЧтениеТекста;
Чтение.Открыть(ИмяФайлаHTML, КодировкаТекста.UTF8);
HTMLТекст = Чтение.Прочитать();
Чтение.Закрыть();
// Формируем письмо с HTML-содержимым
Сообщение = Новый ИнтернетПочтовоеСообщение;
Сообщение.Отправитель = "user@mail.ru";
Сообщение.Получатели.Добавить("client@domain.com");
Сообщение.Тема = "Таблица данных в теле письма";
ТекстПисьма = Сообщение.Тексты.Добавить();
ТекстПисьма.Текст = HTMLТекст;
ТекстПисьма.ТипТекста = ТипТекстаПочтовогоСообщения.HTML;
// Отправка через ИнтернетПочта выполняется аналогично первому варианту
Если данные изначально находятся в объекте ТаблицаЗначений или Массив, нет необходимости создавать табличный документ и записывать его на диск. Мы можем быстро скомпоновать простую HTML-таблицу напрямую в строковой переменной.
HTMLТекст = "<html><body>";
HTMLТекст = HTMLТекст + "<h2>Сводные данные</h2>";
HTMLТекст = HTMLТекст + "<table border='1' cellpadding='5' style='border-collapse: collapse; font-family: Arial, sans-serif;'>";
// Заголовки таблицы
HTMLТекст = HTMLТекст + "<tr bgcolor='#f2f2f2'><th>Номенклатура</th><th>Количество</th><th>Сумма</th></tr>";
// Заполнение строк
Для Каждого Стр Из ТаблицаДанных Цикл
HTMLТекст = HTMLТекст + "<tr>";
HTMLТекст = HTMLТекст + "<td>" + Стр.Номенклатура + "</td>";
HTMLТекст = HTMLТекст + "<td align='right'>" + Формат(Стр.Количество, "ЧДЦ=2") + "</td>";
HTMLТекст = HTMLТекст + "<td align='right'>" + Формат(Стр.Сумма, "ЧДЦ=2") + "</td>";
HTMLТекст = HTMLТекст + "</tr>";
КонецЦикла;
HTMLТекст = HTMLТекст + "</table></body></html>";
ТекстПисьма = Сообщение.Тексты.Добавить();
ТекстПисьма.Текст = HTMLТекст;
ТекстПисьма.ТипТекста = ТипТекстаПочтовогоСообщения.HTML;
ИспользоватьSSLSMTP = Истина и использования специально сгенерированных паролей приложений вместо обычного пароля от учетной записи.КаталогВременныхФайлов()) обязательно удаляйте их процедурой УдалитьФайлы() после завершения отправки или в блоке обработки исключений, чтобы не переполнять дисковое пространство сервера 1С.РаботаСПочтовымиСообщениями), где уже реализованы механизмы очередей отправки, логирования ошибок и централизованного хранения учетных записей.