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

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

Довольно часто в практике автоматизации возникает классическая задача: в базу загружен внешний отчет, и требуется настроить регламентное задание, которое будет регулярно формировать этот отчет и отправлять его на электронную почту пользователям. Задача немного усложняется, если мы имеем дело с обычным отчетом, который написан программистом вручную без использования Схемы Компоновки Данных (СКД). Разберем по шагам, как грамотно реализовать данный функционал из общего модуля в современных типовых конфигурациях (например, 1С:Бухгалтерия предприятия 3.0), построенных на базе Библиотеки стандартных подсистем (БСП).

Шаг 1. Программное подключение внешнего отчета

Если стоит задача вызвать внешний отчет из произвольного общего модуля (например, в рамках собственного регламентного задания), правильным способом является использование встроенных механизмов БСП для работы с дополнительными отчетами и обработками. Рассмотрим подробнее, как это сделать.

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


ИмяОтчета = ДополнительныеОтчетыИОбработкиВызовСервера.ПодключитьВнешнююОбработку(СсылкаНаОтчет);
ОбъектОтчета = ВнешниеОтчеты.Создать(ИмяОтчета);

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

Шаг 2. Формирование отчета без СКД

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

Вызовем эту процедуру из нашего серверного кода, предварительно инициализировав пустой табличный документ:


ТабДок = Новый ТабличныйДокумент;
ОбъектОтчета.СформироватьОтчетПрограммно(ТабДок, ПараметрыОтчета);

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

Чтобы отправить сформированный табличный документ вложением в электронное письмо, мы должны сохранить его во временный файл в нужном формате. 1С поддерживает множество форматов экспорта (PDF, Excel, HTML и др.). Разберем пример сохранения отчета в популярном формате XLSX:


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

Шаг 4. Отправка электронного письма средствами БСП

Для отправки электронных писем в конфигурациях на базе БСП (в том числе БП 3.0) строго рекомендуется использовать не напрямую базовый объект платформы ИнтернетПочта, а высокоуровневый программный интерфейс подсистемы «Работа с почтовыми сообщениями». Это позволит использовать уже преднастроенные учетные записи из соответствующего справочника информационной базы и обеспечит корректное логирование.

Посмотрим на пример структуры кода для формирования и отправки письма с вложением:


ПараметрыПисьма = РаботаСПочтовымиСообщениями.ПараметрыПисьмаИОтправки();
ПараметрыПисьма.Кому.Добавить("client@email.com");
ПараметрыПисьма.Тема = "Прайсы";
ПараметрыПисьма.Текст = "Во вложении находится сформированный отчет за период.";

// Формируем вложение из ранее сохраненного файла
Вложение = Новый ОписаниеПередаваемогоФайла(ИмяВременногоФайла);
МассивВложений = Новый Массив;
МассивВложений.Добавить(Вложение);
ПараметрыПисьма.Вложения = МассивВложений;

// Получаем системную учетную запись (или любую другую нужную)
УчетнаяЗапись = Справочники.УчетныеЗаписиЭлектроннойПочты.СистемнаяУчетнаяЗапись;

// Отправляем письмо
РаботаСПочтовымиСообщениями.ОтправитьПочтовоеСообщение(УчетнаяЗапись, ПараметрыПисьма);

Альтернативный вариант №1: Использование команд внешних обработок

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

Разберем пример кода внутри модуля внешнего отчета:


Функция СведенияОВнешнейОбработке() Экспорт
    ПараметрыРегистрации = Новый Структура;
    // ... заполнение базовых параметров (Вид, Версия и т.д.)
    
    ТаблицаКоманд = ПолучитьТаблицуКоманд();
    // Добавим команду с возможностью настройки расписания
    ДобавитьКоманду(ТаблицаКоманд, "ПрайсыНаПочту", "ПрайсыНаПочту", "ВызовСерверногоМетода", Истина);
    
    ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
    Возврат ПараметрыРегистрации;
КонецФункции

Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды = Неопределено) Экспорт
    Если ИдентификаторКоманды = "ПрайсыНаПочту" Тогда    
        ТабДок = Новый ТабличныйДокумент;
        СформироватьОтчетПрограммно(ТабДок, Неопределено);
        // ... далее код сохранения файла и отправки письма (Шаги 3 и 4)
    КонецЕсли;
КонецПроцедуры

Альтернативный вариант №2: Использование типовой подсистемы «Рассылка отчетов»

В конфигурации 1С:Бухгалтерия 3.0 уже есть готовый мощный функционал — «Рассылки отчетов». Проблема лишь в том, что он "из коробки" рассчитан исключительно на варианты отчетов, построенные на базе СКД. Выясним, как элегантно обойти это ограничение и внедрить в рассылку наш отчет без СКД.

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

  1. Создадим в отчете формальную схему компоновки данных с одним пустым набором данных (без запросов и полей).
  2. Перейдем в модуль объекта отчета и переопределим стандартное событие ПриКомпоновкеРезультата.
  3. Внутри этого обработчика вызовем нашу процедуру формирования табличного документа по макету.
  4. Обязательно установим флаг СтандартнаяОбработка = Ложь, чтобы отключить типовой вывод пустого результата СКД.

Пример кода в модуле объекта отчета:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    // Отключаем стандартный вывод СКД
    СтандартнаяОбработка = Ложь;
    
    // Вызываем нашу собственную процедуру формирования отчета
    СформироватьОтчетПрограммно(ДокументРезультат, НастройкиОтчета);
    
КонецПроцедуры

Преимущества этого метода: вам больше не потребуется писать код для сохранения файлов в PDF/Excel, не нужно программировать работу с почтой и возиться с регламентными заданиями. Вы просто добавляете отчет в базу, а пользователи сами создают "Рассылку отчета", выбирают нужные форматы файлов, настраивают расписание и указывают получателей исключительно пользовательскими средствами.

← На главную