В современной практике автоматизации на базе 1С:Предприятие часто возникает задача автоматической рассылки отчетности. Это может быть ежедневный отчет по продажам для руководства или счета на оплату для клиентов. В рамках данной статьи мы подробно разберем, как реализовать этот функционал с нуля, объединив возможности системы компоновки данных (СКД) и механизмы работы с почтой.
Для того чтобы автоматизировать процесс, нам необходимо последовательно выполнить четыре ключевых этапа. Проанализируем их подробнее:
ИнтернетПочтовыйПрофиль для подключения к серверу (SMTP).ИнтернетПочтовоеСообщение и выполнение метода Отправить.Рассмотрим ситуацию, когда у нас есть готовая схема компоновки данных. Нам нужно получить результат в объект ТабличныйДокумент, не выводя его на экран пользователю. Выясним причину, по которой это лучше делать на сервере: выполнение запросов и компоновка данных на стороне сервера значительно ускоряют процесс и позволяют работать в регламентных заданиях.
Посмотрим на пример кода, который выполняет программную компоновку:
// Получаем схему из макета отчета
СхемаКомпоновкиДанных = Отчеты.Продажи.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
// Устанавливаем настройки (можно взять настройки по умолчанию)
Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
// Передаем параметры, если они необходимы
ПараметрПериод = Настройки.ПараметрыДанных.Элементы.Найти("Период");
ПараметрПериод.Значение = Новый СтандартныйПериод(НачалоМесяца(ТекущаяДата()), КонецМесяца(ТекущаяДата()));
ПараметрПериод.Использование = Истина;
// Инициализируем компоновщик макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки);
// Выполняем компоновку данных
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(ИсточникДоступныхНастроекКомпоновкиДанных, МакетКомпоновки);
// Выводим результат в табличный документ
ТабДок = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабДок);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
После того как ТабличныйДокумент сформирован, нам необходимо подготовить его для отправки. Наиболее универсальным форматом для бизнес-отчетов является PDF. Проанализируем, как правильно сохранить файл, чтобы он автоматически удалился после отправки, не засоряя дисковое пространство сервера.
Используем метод ПолучитьИмяВременногоФайла, который гарантирует уникальность имени:
ИмяФайла = ПолучитьИмяВременногоФайла("pdf");
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);
Важный момент: если вы планируете отправлять отчет в формате Excel, достаточно изменить тип на ТипФайлаТабличногоДокумента.XLSX.
Для взаимодействия с внешними почтовыми сервисами (такими как Mail.ru, Gmail или корпоративный Exchange) в 1С используется объект ИнтернетПочтовыйПрофиль. Разберем по шагам, какие параметры критически важны для успешной авторизации.
Рассмотрим пример настройки профиля для сервера с использованием защищенного соединения (SSL/TLS):
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.mail.ru";
Профиль.ПортSMTP = 465;
Профиль.ПользовательSMTP = "robot@mail.ru";
Профиль.ПарольSMTP = "vash_parol_prilozheniya"; // Используйте пароль приложения, а не основной пароль
Профиль.АутентификацияSMTP = СпособSMTPАутентификации.Login;
Профиль.ИспользоватьSSLSMTP = Истина;
Профиль.ТолькоЛокальныйПросмотрСертификатов = Ложь;
Обратите внимание на свойство ИспользоватьSSLSMTP. Для большинства современных сервисов это обязательное требование. Также помните, что многие публичные сервисы требуют создания специального "пароля для внешних приложений" в настройках безопасности почтового ящика.
Теперь соберем все компоненты воедино. Создадим объект ИнтернетПочтовоеСообщение, прикрепим к нему наш файл и выполним отправку через объект ИнтернетПочта.
Проанализируем итоговую процедуру отправки:
Почта = Новый ИнтернетПочта;
Сообщение = Новый ИнтернетПочтовоеСообщение;
// Заполняем основные поля
Сообщение.Отправитель.Адрес = "robot@mail.ru";
Сообщение.Отправитель.ОтображаемоеИмя = "Робот 1С:Автоматизация";
Сообщение.Тема = "Ежедневный отчет по продажам от " + Формат(ТекущаяДата(), "ДЛФ=D");
// Добавляем получателя
Получатель = Сообщение.Получатели.Добавить("manager@company.com");
// Текст письма
ТекстПисьма = "Добрый день! Во вложении сформированный отчет. С уважением, ваша 1С.";
Сообщение.Тексты.Добавить(ТекстПисьма, ТипТекстаПочтовогоСообщения.ПростойТекст);
// Прикрепляем файл отчета
Сообщение.Вложения.Добавить(ИмяФайла, "ОтчетПродажи.pdf");
Попытка
Почта.Подключиться(Профиль);
Почта.Отправить(Сообщение);
Почта.Отключиться();
Сообщить("Письмо успешно отправлено!");
Исключение
Сообщить("Ошибка при отправке: " + ОписаниеОшибки());
КонецПопытки;
// Очищаем временный файл
УдалитьФайлы(ИмяФайла);
При реализации данного механизма важно учитывать несколько нюансов, которые помогут сделать решение более отказоустойчивым. Рассмотрим их подробнее:
УчетныеЗаписиЭлектроннойПочты. В этом случае параметры профиля можно получить функцией ПочтаКлиентСервер.ПолучитьПараметрыОтправки(УчетнаяЗапись).Попытка...Исключение. При возникновении ошибки записывайте детали в ЖурналРегистрации, чтобы администратор мог оперативно выяснить причину сбоя (например, блокировка порта брандмауэром или неверный пароль).ТипТекстаПочтовогоСообщения.HTML и передавайте соответствующую разметку в метод Добавить().Выясним причину возможных задержек: при отправке больших файлов (более 10 Мб) время выполнения метода Отправить() может увеличиться. В таких случаях рекомендуется выносить процесс отправки в отдельное фоновое задание, чтобы не блокировать работу основного сеанса или регламентного процесса.
Таким образом, мы разобрали полный цикл автоматизации: от извлечения данных из базы 1С:Предприятие до доставки готового документа адресату. Данный подход универсален и применим практически в любой конфигурации на платформе 8.3.