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

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

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

Анализ задачи: основные этапы реализации

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

  1. Инициализация схемы: Нам нужно получить объект схемы компоновки данных из метаданных или внешнего файла.
  2. Настройка параметров: Программная установка параметров и отборов, которые обычно заполняет пользователь в диалоге.
  3. Компоновка макета: Формирование макета компоновки с помощью объекта КомпоновщикМакетаКомпоновкиДанных.
  4. Выполнение запроса и вывод: Использование процессора компоновки и процессора вывода для генерации итогового ТабличныйДокумент.
  5. Конвертация и сохранение: Сохранение полученного документа во временный файл (например, в формате PDF).
  6. Отправка: Создание письма и отправка его через объект ИнтернетПочта.

Рассмотрим подробнее каждый из этих этапов на примере конкретного кода.

Шаг 1: Программное формирование табличного документа через СКД

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

Посмотрим на пример кода, который выполняет генерацию отчета:


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

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

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

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

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

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

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

Шаг 2: Сохранение отчета во временный файл

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

Проанализируем процесс сохранения:


ИмяФайла = ПолучитьИмяВременногоФайла("pdf");
Результат.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);

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

Шаг 3: Настройка почтового профиля и отправка

Теперь разберем, как отправить сформированный файл. Для этого в 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. Фоновое выполнение: Рассылку отчетов лучше всего выносить в РегламентныеЗадания. Это позволит системе работать автономно, не отвлекая пользователей.
  2. Безопасность: Никогда не храните пароли от почты в открытом виде в коде. Используйте для этого БезопасноеХранениеДанных или специальные константы с ограниченным доступом.
  3. Очистка мусора: После отправки письма обязательно удаляйте временный файл с диска, используя команду УдалитьФайлы(ИмяФайла), чтобы не переполнять хранилище сервера.
  4. Настройки СКД: Если вы хотите использовать пользовательские настройки (например, те, что пользователь сохранил в режиме Предприятие), их нужно загружать через ХранилищеНастроек.

Выясним, как загрузить сохраненные настройки пользователя. Для этого можно использовать следующий подход:


КлючОбъекта = "Отчет.Продажи/ОсновнойВариант";
Пользователь = "Администратор";
НастройкиХранилища = ХранилищеВариантовОтчетов.Загрузить(КлючОбъекта, , Пользователь);
Если НастройкиХранилища <> Неопределено Тогда
    Настройки = НастройкиХранилища.Настройки;
КонецЕсли;

Таким образом, мы проанализировали полный цикл работы: от программного формирования сложного отчета на базе СхемаКомпоновкиДанных до его физической отправки конечному получателю. Этот метод является универсальным и подходит для большинства современных конфигураций на платформе 1С.

← На главную