Как в 1С 8.3 программно сформировать отчет и отправить его по электронной почте?

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

В современной практике автоматизации бизнеса часто возникает задача автоматической рассылки отчетности. Это может быть ежедневный отчет о продажах для руководства, сверка взаиморасчетов для контрагентов или уведомления о складских остатках. В рамках данной статьи мы подробно разберем процесс программного формирования отчета на базе Системы Компоновки Данных (СКД) и его последующую отправку через протокол SMTP.

Разбор архитектуры решения

Процесс автоматизации рассылки можно разделить на четыре ключевых этапа, которые мы проанализируем по отдельности:

  1. Программное исполнение схемы компоновки данных: формирование табличного документа без участия пользователя.
  2. Конвертация результата: сохранение полученного отчета во временный файл нужного формата (PDF, Excel).
  3. Настройка почтового профиля: установка параметров подключения к почтовому серверу (SMTP).
  4. Отправка сообщения: формирование объекта письма, добавление вложений и непосредственная передача данных.

Шаг 1: Программное формирование отчета на СКД

Для начала рассмотрим, как программно получить результат отчета, если у нас есть только схема компоновки. Нам потребуется инициализировать основные объекты СКД: компоновщик макета, процессор компоновки и процессор вывода.

Разберем пример кода, который выполняет эти действия:


// 1. Получаем схему из общих макетов или объекта отчета
СхемаКомпоновкиДанных = Отчеты.Продажи.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

// 2. Инициализируем настройки
Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;

// Если нужно установить параметр программно
ПараметрПериод = Настройки.ПараметрыДанных.Элементы.Найти("Период");
ПараметрПериод.Значение = Новый СтандартныйПериод(НачалоМесяца(ТекущаяДата()), КонецМесяца(ТекущаяДата()));
ПараметрПериод.Использование = Истина;

// 3. Компоновка макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));

// 4. Процессор компоновки данных
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

// 5. Вывод в табличный документ
ТабДок = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабДок);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);

Важно помнить, что при использовании метода Выполнить объекта КомпоновщикМакетаКомпоновкиДанных, мы можем передать данные расшифровки, если планируем использовать их в дальнейшем, однако для простой отправки по почте это не требуется. Обратите внимание на использование объекта СтандартныйПериод — это наиболее удобный способ передачи временных интервалов в параметры СКД.

Шаг 2: Сохранение отчета во временный файл

После того как данные сформированы в объекте ТабличныйДокумент, нам необходимо превратить их в файл, который поймет почтовый клиент получателя. Чаще всего используются форматы PDF или XLSX.

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


ИмяФайла = ПолучитьИмяВременногоФайла("pdf");
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);

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

Шаг 3: Настройка учетной записи почты

Для отправки письма нам понадобится объект ИнтернетПочтовыйПрофиль. В нем хранятся данные для авторизации на сервере. Рассмотрим подробнее основные свойства, которые необходимо заполнить для корректной работы с современными почтовыми сервисами (такими как Mail.ru, Gmail или корпоративный Exchange).


Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.mail.ru";
Профиль.ПортSMTP = 465;
Профиль.Пользователь = "robot@example.ru";
Профиль.Пароль = "ваш_пароль_приложения";
Профиль.ИспользоватьSSLSMTP = Истина;
Профиль.ТолькоМетодAuthLogin = Истина;
Профиль.ВремяОжидания = 60;

Важный нюанс: большинство публичных почтовых сервисов сейчас требуют использования специальных "паролей приложений" вместо основных паролей от почтовых ящиков. Также обязательно проверьте свойство ИспользоватьSSLSMTP и порт (обычно 465 для SSL или 587 для TLS).

Шаг 4: Формирование сообщения и отправка

Теперь соберем все компоненты воедино. Создадим объект ИнтернетПочтовоеСообщение, добавим в него получателей, текст письма и наш сформированный файл отчета.


Почта = Новый ИнтернетПочта;
Письмо = Новый ИнтернетПочтовоеСообщение;

Письмо.Отправитель.Адрес = "robot@example.ru";
Письмо.Отправитель.ОтображаемоеИмя = "Робот системы 1С";

НовыйПолучатель = Письмо.Получатели.Добавить();
НовыйПолучатель.Адрес = "manager@example.ru";

Письмо.Тема = "Ежедневный отчет по продажам от " + Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy");
Письмо.Тексты.Добавить("Добрый день! Во вложении сформированный отчет. Сгенерировано автоматически.");

// Добавляем вложение
Письмо.Вложения.Добавить(ИмяФайла, "ОтчетПродажи.pdf");

Попытка
    Почта.Подключиться(Профиль);
    Почта.Послать(Письмо);
    Почта.Отключиться();
    Сообщить("Отчет успешно отправлен!");
Исключение
    ТекстОшибки = ИнформацияОбОшибке().Описание;
    Сообщить("Ошибка при отправке почты: " + ТекстОшибки);
КонецПопытки;

// Обязательно удаляем временный файл после отправки
УдалитьФайлы(ИмяФайла);

Оптимизация и обработка ошибок

При реализации данного механизма в реальных условиях, мы рекомендуем обратить внимание на следующие аспекты:

  1. Выполнение на сервере: Весь этот код должен исполняться в серверном модуле. На стороне клиента работа с объектом ИнтернетПочта может быть ограничена или неэффективна.
  2. Фоновые задания: Если формирование отчета занимает длительное время (более нескольких секунд), лучше выносить этот процесс в ФоновыеЗадания. Это позволит пользователю продолжать работу, пока система готовит и отправляет данные.
  3. Логирование: Обязательно записывайте результаты рассылки в ЖурналРегистрации. В случае сбоя (например, из-за изменения пароля почты), вы сможете быстро найти причину в блоке Исключение.
  4. Проверка прав: Убедитесь, что у пользователя, под которым запускается фоновое задание, достаточно прав на работу с объектами ИнтернетПочта и чтение данных, необходимых для отчета.

Выясним причину частых ошибок при подключении: чаще всего они связаны с блокировкой порта 465 брандмауэром сервера или антивирусом. Проанализируем ситуацию: если метод Подключиться() выдает ошибку по таймауту, первым делом проверьте доступность SMTP-сервера через команду telnet с сервера 1С.

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

← На главную