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