В современной практике автоматизации бизнеса часто возникает задача автоматической рассылки отчетности. Это может быть ежедневный отчет о продажах для руководства, сверка взаиморасчетов для контрагентов или уведомления о складских остатках. В рамках данной статьи мы подробно разберем процесс программного формирования отчета на базе Системы Компоновки Данных (СКД) и его последующую отправку через протокол SMTP.
Процесс автоматизации рассылки можно разделить на четыре ключевых этапа, которые мы проанализируем по отдельности:
Для начала рассмотрим, как программно получить результат отчета, если у нас есть только схема компоновки. Нам потребуется инициализировать основные объекты СКД: компоновщик макета, процессор компоновки и процессор вывода.
Разберем пример кода, который выполняет эти действия:
// 1. Получаем схему из общих макетов или объекта отчета
СхемаКомпоновкиДанных = Отчеты.Продажи.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
// 2. Инициализируем настройки
Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
// Если нужно установить параметр программно
ПараметрПериод = Настройки.ПараметрыДанных.Элементы.Найти("Период");
ПараметрПериод.Значение = Новый СтандартныйПериод(НачалоМесяца(ТекущаяДата()), КонецМесяца(ТекущаяДата()));
ПараметрПериод.Использование = Истина;
// 3. Компоновка макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
// 4. Процессор компоновки данных
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
// 5. Вывод в табличный документ
ТабДок = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабДок);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Важно помнить, что при использовании метода Выполнить объекта КомпоновщикМакетаКомпоновкиДанных, мы можем передать данные расшифровки, если планируем использовать их в дальнейшем, однако для простой отправки по почте это не требуется. Обратите внимание на использование объекта СтандартныйПериод — это наиболее удобный способ передачи временных интервалов в параметры СКД.
После того как данные сформированы в объекте ТабличныйДокумент, нам необходимо превратить их в файл, который поймет почтовый клиент получателя. Чаще всего используются форматы PDF или XLSX.
Проанализируем ситуацию с выбором пути сохранения. В среде 1С:Предприятие для этого идеально подходит функция ПолучитьИмяВременногоФайла, которая гарантирует уникальность имени и корректную работу в многопользовательском режиме на сервере.
ИмяФайла = ПолучитьИмяВременногоФайла("pdf");
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);
Использование формата PDF предпочтительно для отчетов, которые не требуют дальнейшего редактирования, так как он сохраняет форматирование и шрифты практически в неизменном виде на любых устройствах. Если же пользователю нужно работать с цифрами, заменим PDF на XLSX.
Для отправки письма нам понадобится объект ИнтернетПочтовыйПрофиль. В нем хранятся данные для авторизации на сервере. Рассмотрим подробнее основные свойства, которые необходимо заполнить для корректной работы с современными почтовыми сервисами (такими как Mail.ru, Gmail или корпоративный Exchange).
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.mail.ru";
Профиль.ПортSMTP = 465;
Профиль.Пользователь = "robot@example.ru";
Профиль.Пароль = "ваш_пароль_приложения";
Профиль.ИспользоватьSSLSMTP = Истина;
Профиль.ТолькоМетодAuthLogin = Истина;
Профиль.ВремяОжидания = 60;
Важный нюанс: большинство публичных почтовых сервисов сейчас требуют использования специальных "паролей приложений" вместо основных паролей от почтовых ящиков. Также обязательно проверьте свойство ИспользоватьSSLSMTP и порт (обычно 465 для SSL или 587 для TLS).
Теперь соберем все компоненты воедино. Создадим объект ИнтернетПочтовоеСообщение, добавим в него получателей, текст письма и наш сформированный файл отчета.
Почта = Новый ИнтернетПочта;
Письмо = Новый ИнтернетПочтовоеСообщение;
Письмо.Отправитель.Адрес = "robot@example.ru";
Письмо.Отправитель.ОтображаемоеИмя = "Робот системы 1С";
НовыйПолучатель = Письмо.Получатели.Добавить();
НовыйПолучатель.Адрес = "manager@example.ru";
Письмо.Тема = "Ежедневный отчет по продажам от " + Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy");
Письмо.Тексты.Добавить("Добрый день! Во вложении сформированный отчет. Сгенерировано автоматически.");
// Добавляем вложение
Письмо.Вложения.Добавить(ИмяФайла, "ОтчетПродажи.pdf");
Попытка
Почта.Подключиться(Профиль);
Почта.Послать(Письмо);
Почта.Отключиться();
Сообщить("Отчет успешно отправлен!");
Исключение
ТекстОшибки = ИнформацияОбОшибке().Описание;
Сообщить("Ошибка при отправке почты: " + ТекстОшибки);
КонецПопытки;
// Обязательно удаляем временный файл после отправки
УдалитьФайлы(ИмяФайла);
При реализации данного механизма в реальных условиях, мы рекомендуем обратить внимание на следующие аспекты:
ИнтернетПочта может быть ограничена или неэффективна.ФоновыеЗадания. Это позволит пользователю продолжать работу, пока система готовит и отправляет данные.ЖурналРегистрации. В случае сбоя (например, из-за изменения пароля почты), вы сможете быстро найти причину в блоке Исключение.ИнтернетПочта и чтение данных, необходимых для отчета.Выясним причину частых ошибок при подключении: чаще всего они связаны с блокировкой порта 465 брандмауэром сервера или антивирусом. Проанализируем ситуацию: если метод Подключиться() выдает ошибку по таймауту, первым делом проверьте доступность SMTP-сервера через команду telnet с сервера 1С.
Таким образом, мы рассмотрели полный цикл автоматизации: от извлечения данных из базы через ПроцессорКомпоновкиДанных до их доставки конечному адресату. Данный подход универсален и применим практически в любой конфигурации на платформе 1С:Предприятие 8.3.