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

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

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

Шаг 1. Получение схемы и настроек компоновки данных

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


// Получаем схему из состава конфигурации
СхемаКомпоновкиДанных = Отчеты.НашНужныйОтчет.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

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

Важно помнить, что если в отчете заданы параметры (например, Период или Организация), их необходимо установить программно. Рассмотрим пример установки значения параметра:


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

Шаг 2. Инициализация процессора компоновки и выполнение компоновки

Теперь разберем процесс "сборки" отчета. На этом этапе мы связываем схему, настройки и внешние данные (если они есть) в единый результат. Выясним причину использования объекта КомпоновщикМакетаКомпоновкиДанных: он преобразует абстрактную схему в макет, пригодный для исполнения в конкретной базе данных.

Последовательность действий выглядит следующим образом:

  1. Создаем компоновщик макета.
  2. Генерируем макет компоновки с помощью метода Выполнить.
  3. Инициализируем процессор компоновки данных.
  4. Выводим результат в табличный документ.

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

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

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

Шаг 3. Сохранение результата в файл

Посмотрим на пример сохранения полученного табличного документа в формат, удобный для отправки, например, PDF или Excel. Объект ТабличныйДокумент имеет встроенный метод Записать, который поддерживает различные расширения файлов.


ПутьКФайлу = "C:\Temp\Отчет.pdf";
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF);

Важный момент: при работе на сервере убедитесь, что у службы 1С есть права доступа к указанной директории, иначе возникнет ошибка доступа к файлу.

Шаг 4. Настройка почтового профиля и отправка письма

Проанализируем заключительный этап — интеграцию с почтовым сервером. Для этого в 1С используется объект ИнтернетПочтовыйПрофиль. Нам необходимо заполнить параметры сервера (SMTP), авторизацию и создать сообщение.


Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.mail.ru";
Профиль.ПортSMTP = 465;
Профиль.Пользователь = "login@mail.ru";
Профиль.Пароль = "password";
Профиль.ИспользоватьSSLSMTP = Истина;

Сообщение = Новый ИнтернетПочтовоеСообщение;
Сообщение.Отправитель = "login@mail.ru";
Сообщение.Получатели.Добавить("client@example.com");
Сообщение.Тема = "Автоматическая рассылка: Отчет по продажам";
Сообщение.Тексты.Добавить("Добрый день! Во вложении сформированный отчет.");

// Добавление файла во вложения
Сообщение.Вложения.Добавить(ПутьКФайлу);

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

Резюме и практические советы

Рассмотрев данный алгоритм, мы видим, что задача разделяется на три независимых блока: работа с СКД, файловая система и протоколы передачи данных (SMTP).

Для повышения надежности системы рекомендуем:

  1. Использовать Фоновые задания для выполнения этого кода, чтобы не блокировать работу пользователя.
  2. Хранить настройки почтового профиля в специальном справочнике (например, УчетныеЗаписиЭлектроннойПочты), а не прописывать их жестко в коде.
  3. После отправки файла обязательно удалять временный файл с диска с помощью команды УдалитьФайлы(ПутьКФайлу), чтобы не забивать память сервера.

Используя объект ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент, мы получаем гибкий инструмент, позволяющий формировать отчеты любой сложности полностью в автоматическом режиме.

← На главную