В процессе автоматизации бизнес-процессов часто возникает задача автоматической рассылки отчетности. Рассмотрим подробнее, как реализовать механизм формирования отчета на базе Системы компоновки данных (СКД) без открытия формы отчета, с последующим сохранением результата в файл и отправкой через электронную почту. Этот процесс требует понимания программного интерфейса взаимодействия с объектами метаданных и механизмами обмена данными.
Для начала разберем, как получить доступ к схеме компоновки данных конкретного отчета. Проанализируем ситуацию, когда отчет является объектом конфигурации. Программная работа начинается с обращения к объекту метаданных и извлечения основной схемы компоновки.
// Получаем схему из состава конфигурации
СхемаКомпоновкиДанных = Отчеты.НашНужныйОтчет.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
// Получаем настройки по умолчанию или из конкретного варианта
Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
Важно помнить, что если в отчете заданы параметры (например, Период или Организация), их необходимо установить программно. Рассмотрим пример установки значения параметра:
ЗначениеПараметра = Настройки.ПараметрыДанных.Найти("Период");
Если ЗначениеПараметра <> Неопределено Тогда
ЗначениеПараметра.Значение = Новый СтандартныйПериод(НачалоГода(ТекущаяДата()), КонецГода(ТекущаяДата()));
ЗначениеПараметра.Использование = Истина;
КонецЕсли;
Теперь разберем процесс "сборки" отчета. На этом этапе мы связываем схему, настройки и внешние данные (если они есть) в единый результат. Выясним причину использования объекта КомпоновщикМакетаКомпоновкиДанных: он преобразует абстрактную схему в макет, пригодный для исполнения в конкретной базе данных.
Последовательность действий выглядит следующим образом:
Выполнить.
// Инициализация компоновщика макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
// Процессор компоновки
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
// Вывод в табличный документ
ТабДок = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабДок);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Посмотрим на пример сохранения полученного табличного документа в формат, удобный для отправки, например, PDF или Excel. Объект ТабличныйДокумент имеет встроенный метод Записать, который поддерживает различные расширения файлов.
ПутьКФайлу = "C:\Temp\Отчет.pdf";
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF);
Важный момент: при работе на сервере убедитесь, что у службы 1С есть права доступа к указанной директории, иначе возникнет ошибка доступа к файлу.
Проанализируем заключительный этап — интеграцию с почтовым сервером. Для этого в 1С используется объект ИнтернетПочтовыйПрофиль. Нам необходимо заполнить параметры сервера (SMTP), авторизацию и создать сообщение.
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.mail.ru";
Профиль.ПортSMTP = 465;
Профиль.Пользователь = "login@mail.ru";
Профиль.Пароль = "password";
Профиль.ИспользоватьSSLSMTP = Истина;
Сообщение = Новый ИнтернетПочтовоеСообщение;
Сообщение.Отправитель = "login@mail.ru";
Сообщение.Получатели.Добавить("client@example.com");
Сообщение.Тема = "Автоматическая рассылка: Отчет по продажам";
Сообщение.Тексты.Добавить("Добрый день! Во вложении сформированный отчет.");
// Добавление файла во вложения
Сообщение.Вложения.Добавить(ПутьКФайлу);
Почта = Новый ИнтернетПочта;
Попытка
Почта.Подключиться(Профиль);
Почта.Послать(Сообщение);
Почта.Отключиться();
Исключение
Сообщить("Ошибка при отправке почты: " + ОписаниеОшибки());
КонецПопытки;
Рассмотрев данный алгоритм, мы видим, что задача разделяется на три независимых блока: работа с СКД, файловая система и протоколы передачи данных (SMTP).
Для повышения надежности системы рекомендуем:
УчетныеЗаписиЭлектроннойПочты), а не прописывать их жестко в коде.УдалитьФайлы(ПутьКФайлу), чтобы не забивать память сервера.Используя объект ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент, мы получаем гибкий инструмент, позволяющий формировать отчеты любой сложности полностью в автоматическом режиме.