В процессе разработки на платформе 1С:Предприятие 8.3 часто возникает задача автоматизации рассылки отчетности. Рассмотрим ситуацию, когда нам необходимо сформировать отчет, построенный на базе системы компоновки данных (СКД), сохранить его во внешний файл (например, Excel) и отправить получателю без участия пользователя. Мы подробно разберем, как реализовать этот механизм программно, проанализируем необходимые объекты платформы и инструменты автоматизации, такие как СКДБилдер для упрощения программного создания СКД.
Для начала нам необходимо получить доступ к схеме компоновки данных (СхемаКомпоновкиДанных), которая обычно хранится в макете отчета. Разберем процесс инициализации основных объектов. Если вы разрабатываете сложные отчеты, где используются две разных схемы в одном отчете СКД, важно правильно указать имя макета. Проанализируем код получения настроек:
// Получаем схему из макета отчета
СхемаКомпоновки = Отчеты.НашОтчет.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
// Получаем настройки по умолчанию или из конкретного варианта
Настройки = СхемаКомпоновки.НастройкиПоУмолчанию;
// Если необходимо передать параметры программно
ПараметрПериод = Настройки.ПараметрыДанных.Элементы.Найти("Период");
ПараметрПериод.Значение = Новый СтандартныйПериод(НачалоМесяца(ТекущаяДата()), КонецМесяца(ТекущаяДата()));
ПараметрПериод.Использование = Истина;
Важно помнить, что НастройкиКомпоновкиДанных определяют, какие поля будут выбраны, какие фильтры применены и как данные будут сгруппированы. Для интерактивной настройки параметров на стороне клиента может быть полезна Пользовательская СКД, которая расширяет стандартные возможности компоновщика.
Теперь рассмотрим процесс преобразования схемы и настроек в готовый макет, который платформа сможет наполнить данными. Для этого используется КомпоновщикМакетаКомпоновкиДанных. Выясним причину, почему этот этап обязателен: макет компоновки — это промежуточное звено, которое учитывает особенности конкретного типа вывода (например, для табличного документа или для коллекции значений).
// Инициализируем компоновщик макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
// Формируем макет компоновки
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновки, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляРезультакаКомпоновки"));
После создания макета нам необходимо запустить процесс получения данных из базы. Для этого мы задействуем ПроцессорКомпоновкиДанных. Этот объект связывает макет с источниками данных и выполняет запросы.
// Инициализируем процессор компоновки
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
Проанализируем ситуацию, когда результатом должен стать визуальный отчет. Мы будем использовать ТабличныйДокумент в качестве "контейнера". Чтобы передать данные из процессора компоновки в таблицу, нам понадобится ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент.
// Создаем результирующий табличный документ
ТабДок = Новый ТабличныйДокумент;
// Инициализируем процессор вывода
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабДок);
// Выводим результат
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
На этом этапе ТабличныйДокумент уже содержит сформированный отчет со всеми итогами и группировками. Мы можем дополнительно настроить его параметры, например, АвтоМасштаб или ОриентацияСтраницы, перед сохранением.
Чтобы отправить отчет по почте, его необходимо физически сохранить на диске сервера. Рассмотрим сохранение табличных документов в различных форматах, таких как Excel (XLSX) и PDF. Обратите внимание на использование метода Записать() объекта ТабличныйДокумент.
// Определим путь к временному файлу
ПутьКФайлу = КаталогВременныхФайлов() + "Отчет_" + Формат(ТекущаяДата(), "ДФ=yyyyMMddHHmmss") + ".xlsx";
// Сохраняем документ в формате Excel
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
Важный момент: если вы работаете в клиент-серверном варианте, помните, что КаталогВременныхФайлов() на сервере — это папка службы 1С. Убедитесь, что у пользователя, под которым запущен сервер 1С, есть права на запись в эту директорию.
Разберем финальный этап — программную отправку файла. Для этого в 1С используются объекты ИнтернетПочтовыйПрофиль и ИнтернетПочта. Также можно использовать готовое расширение для отправки почтовых сообщений, которое упрощает интеграцию этого функционала в конфигурацию. Мы должны выполнить настройку почтовых протоколов SMTP и IMAP, создать сообщение и прикрепить наш файл.
// Настраиваем профиль подключения
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.mail.ru";
Профиль.ПортSMTP = 465;
Профиль.Пользователь = "login@mail.ru";
Профиль.Пароль = "your_password";
Профиль.ИспользоватьSSLSMTP = Истина;
// Создаем сообщение
Сообщение = Новый ИнтернетПочтовоеСообщение;
Сообщение.Отправитель.Адрес = "login@mail.ru";
Сообщение.Получатели.Добавить("customer@gmail.com");
Сообщение.Тема = "Ежедневный отчет СКД";
Сообщение.Тексты.Добавить("Добрый день! Во вложении сформированный отчет.", ТипТекстаПочтовогоСообщения.ПростойТекст);
// Прикрепляем файл
Сообщение.Вложения.Добавить(ПутьКФайлу, "Отчет.xlsx");
// Выполняем отправку
Почта = Новый ИнтернетПочта;
Попытка
Почта.Подключиться(Профиль);
Почта.Послать(Сообщение);
Почта.Отключиться();
Сообщить("Отчет успешно отправлен!");
Исключение
Сообщить("Ошибка при отправке: " + ОписаниеОшибки());
КонецПопытки;
Для более продвинутой автоматизации, например, сохранения входящих отчетов или фильтрации, изучите пример работы с почтовыми вложениями в 1С.
При реализации массовых рассылок мы рекомендуем придерживаться следующих правил:
ФоновыеЗадания.Выполнить) или используйте специализированную библиотеку для создания конвейеров фоновых задач, чтобы не блокировать работу пользователя.УдалитьФайлы(ПутьКФайлу). Это предотвратит переполнение дискового пространства на сервере.Попытка...Исключение, так как проблемы с сетевым соединением или доступом к файловой системе являются наиболее частыми причинами сбоев.Мы рассмотрели полный цикл программной генерации отчета на базе СКД. Этот метод универсален и подходит для большинства современных конфигураций 1С, позволяя автоматизировать регулярную отчетность без привлечения дополнительных внешних утилит.