Механизм Рассылки отчетов в Библиотеке стандартных подсистем (БСП) — это мощный инструмент, который по умолчанию ориентирован на работу с Системой компоновки данных (СКД). Однако в реальной практике программисты часто сталкиваются с необходимостью рассылать «ручные» отчеты, логика которых реализована программно в модуле объекта и выводит данные напрямую в табличный документ. Давайте подробно разберем, как интегрировать такой отчет в типовую подсистему, не переписывая его полностью на СКД.
Это самый эффективный и надежный способ. Подсистема рассылки БСП ожидает, что у отчета есть схема компоновки, из которой можно извлечь настройки и варианты. Чтобы «обмануть» систему, мы создадим минимальную схему-заглушку, а основной процесс формирования возьмем под свой контроль.
Рассмотрим пошагово, как это реализовать:
Проанализируем программный код, который должен появиться в модуле объекта:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
// 1. Отключаем стандартный вывод СКД
СтандартнаяОбработка = Ложь;
// 2. Вызываем свой алгоритм формирования табличного документа
СформироватьРучнойОтчет(ДокументРезультат, КомпоновщикНастроек.ПолучитьНастройки());
КонецПроцедуры
Использование этого метода позволяет БСП видеть отчет как «стандартный», при этом фактическое наполнение параметра ДокументРезультат происходит по вашему алгоритму. Выясним причину, по которой это работает: БСП вызывает метод СкомпоноватьРезультат, который инициирует событие ПриКомпоновкеРезультата. Если мы подменим результат внутри, система подхватит его для дальнейшей отправки по почте.
Главная сложность при ручном формировании отчета для рассылки — получение параметров (период, организация, склад), которые пользователь указал в настройках рассылки. Поскольку мы используем пустую схему СКД, БСП все равно будет заполнять КомпоновщикНастроек нашего отчета перед запуском.
Разберем, как правильно извлечь эти данные в коде формирования:
Процедура СформироватьРучнойОтчет(Результат, Настройки)
// Получаем параметры из настроек компоновщика
ДатаНачала = Неопределено;
ДатаОкончания = Неопределено;
Для Каждого Параметр Из Настройки.ПараметрыДанных.Элементы Цикл
Если Строка(Параметр.Параметр) = "Период" Тогда
ДатаНачала = Параметр.Значение.ДатаНачала;
ДатаОкончания = Параметр.Значение.ДатаОкончания;
КонецЕсли;
КонецЦикла;
// Теперь используем полученные даты для запроса или вычислений
ВывестиДанныеВТаблицу(Результат, ДатаНачала, ДатаОкончания);
КонецПроцедуры
Важный момент: если ваш отчет использует специфические настройки, которые нельзя описать через стандартные параметры СКД, рекомендуется добавить их в схему-заглушку как доступные параметры. Тогда пользователь сможет выбирать их в интерфейсе настройки рассылки, а вы сможете прочитать их программно.
Рассылка отчетов всегда выполняется на сервере в фоновом задании. Это накладывает жесткие ограничения на программный код формирования отчета. Проанализируем основные правила, которые необходимо соблюдать, чтобы рассылка не завершилась ошибкой:
ЭтаФорма, Элементы или вызывать методы клиентских модулей. Код должен быть полностью автономным.Печать в модуле формы, ее необходимо перенести в модуль объекта и адаптировать для работы без контекста формы.Подсистема рассылки БСП работает не с метаданными объектов, а с элементами справочника ВариантыОтчетов. Если ваш отчет не на СКД, он может автоматически не попасть в этот справочник. Посмотрим, как решить эту проблему:
СведенияОВнешнейОбработке указан тип ДополнительныйОтчет.Одним из преимуществ использования СКД-заглушки является автоматическая поддержка форматов. БСП получает от вашего кода заполненный ТабличныйДокумент и сама конвертирует его в PDF, Excel (XLSX) или HTML в зависимости от настроек рассылки. Вам не нужно писать код для сохранения файла на диск — БСП сделает это штатно, если вы корректно заполнили параметр ДокументРезультат в процедуре ПриКомпоновкеРезультата.
Рассмотрим пример правильной подготовки табличного документа для вывода:
// В модуле объекта
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Очищаем документ перед выводом, чтобы избежать наслоения данных
ДокументРезультат.Очистить();
// Устанавливаем параметры печати, если это необходимо для PDF
ДокументРезультат.АвтоМасштаб = Истина;
ДокументРезультат.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
// Формируем контент
Макет = ПолучитьМакет("МакетОтчета");
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ДокументРезультат.Вывести(ОбластьШапка);
// ... логика вывода строк ...
КонецПроцедуры
Мы проанализировали ситуацию и выяснили, что даже «древние» отчеты, написанные на голом коде без СКД, могут быть интегрированы в современную инфраструктуру БСП. Основной секрет успеха — использование события ПриКомпоновкеРезультата и подавление СтандартнаяОбработка. Это позволяет сохранить гибкость ручного формирования, используя при этом все преимущества автоматической рассылки, такие как работа по расписанию, архивация файлов и отправка по списку получателей.