Как отправить таблицу из 1С по электронной почте?

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

При автоматизации бизнес-процессов в 1С часто возникает задача отправить сформированный отчет или таблицу данных по электронной почте. В зависимости от требований к оформлению и объема данных задачу можно решить двумя основными путями: отправить таблицу как файл-вложение (например, выгрузить в формат Excel и упаковать в ZIP-архив) или встроить форматированную таблицу непосредственно в тело письма в виде HTML-разметки.

Рассмотрим оба этих варианта подробно, разберем по шагам программную реализацию и проанализируем нюансы работы со встроенной почтовой службой платформы 1С.

Вариант 1. Сохранение таблицы во временный файл и отправка во вложении

Если таблица содержит большое количество колонок и строк, наиболее надежный и читабельный способ доставки — сохранение табличного документа в файл формата Excel или PDF с последующей упаковкой в архив и прикреплением к почтовому сообщению.

Разберем по шагам, как устроен этот алгоритм:

  1. Формируем и заполняем объект ТабличныйДокумент нужными данными.
  2. Сохраняем табличный документ во временную папку операционной системы с помощью метода Записать.
  3. Сжимаем полученный файл с помощью объекта ЗаписьZipФайла для уменьшения объема пересылаемых данных.
  4. Настраиваем параметры подключения к почтовому серверу в объекте ИнтернетПочтовыйПрофиль.
  5. Создаем объект ИнтернетПочтовоеСообщение, заполняем адреса, тему письма, текст и прикрепляем созданный архив в коллекцию Вложения.
  6. Выполняем отправку через объект ИнтернетПочта.

Посмотрим на пример программного кода:


ТабДок = Новый ТабличныйДокумент;
// Заполнение макета и вывод секций в ТабДок
// ...

ИмяФайла = КаталогВременныхФайлов() + "ПрайсЛист.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Файла);
Исключение
    // Обработка ошибки удаления при необходимости
КонецПопытки;

Вариант 2. Вставка таблицы непосредственно в тело письма (HTML)

Когда требуется, чтобы получатель увидел таблицу сразу при открытии письма без необходимости скачивать вложения, оптимально использовать HTML-форматирование. Платформа 1С позволяет сохранить ТабличныйДокумент в формат HTML с сохранением всех стилей ячеек, рамок и цветов шрифта.

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

  1. Сохраняем табличный документ во временный HTML-файл методом ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.HTML).
  2. Считываем содержимое HTML-файла в строковую переменную с помощью объекта ЧтениеТекста или ТекстовыйДокумент.
  3. В объекте ИнтернетПочтовоеСообщение добавляем текст с указанием типа ТипТекстаПочтовогоСообщения.HTML.

Посмотрим на пример кода для чтения HTML-таблицы в тело письма:


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

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

// Формируем письмо с HTML-содержимым
Сообщение = Новый ИнтернетПочтовоеСообщение;
Сообщение.Отправитель = "user@mail.ru";
Сообщение.Получатели.Добавить("client@domain.com");
Сообщение.Тема = "Таблица данных в теле письма";

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

// Отправка через ИнтернетПочта выполняется аналогично первому варианту

Вариант 3. Формирование 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;

Важные рекомендации при работе с почтой в 1С

  1. Пароли приложений и SSL: Большинство современных почтовых сервисов (Яндекс, Mail.ru, Gmail) требуют обязательного включения защищенного протокола ИспользоватьSSLSMTP = Истина и использования специально сгенерированных паролей приложений вместо обычного пароля от учетной записи.
  2. Очистка временных файлов: При выгрузке отчетов на диск (в КаталогВременныхФайлов()) обязательно удаляйте их процедурой УдалитьФайлы() после завершения отправки или в блоке обработки исключений, чтобы не переполнять дисковое пространство сервера 1С.
  3. Использование БСП: Если разработка ведется в типовой конфигурации на базе Библиотеки стандартных подсистем, рекомендуется использовать встроенную подсистему работы с почтой (модуль РаботаСПочтовымиСообщениями), где уже реализованы механизмы очередей отправки, логирования ошибок и централизованного хранения учетных записей.
← На главную