Как подключить отчеты без СКД к стандартному механизму Рассылка отчетов БСП

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

Механизм Рассылки отчетов в Библиотеке стандартных подсистем (БСП) — это мощный инструмент, который по умолчанию ориентирован на работу с Системой компоновки данных (СКД). Однако в реальной практике программисты часто сталкиваются с необходимостью рассылать «ручные» отчеты, логика которых реализована программно в модуле объекта и выводит данные напрямую в табличный документ. Давайте подробно разберем, как интегрировать такой отчет в типовую подсистему, не переписывая его полностью на СКД.

Метод 1. Использование пустой схемы СКД в качестве обертки

Это самый эффективный и надежный способ. Подсистема рассылки БСП ожидает, что у отчета есть схема компоновки, из которой можно извлечь настройки и варианты. Чтобы «обмануть» систему, мы создадим минимальную схему-заглушку, а основной процесс формирования возьмем под свой контроль.

Рассмотрим пошагово, как это реализовать:

  1. В конфигураторе откройте ваш отчет и создайте основную схему компоновки данных. В ней не нужно создавать наборы данных. Достаточно добавить одно текстовое поле в раздел «Вычисляемые поля» или просто оставить ее пустой.
  2. Убедитесь, что в свойствах отчета эта схема назначена основной.
  3. Перейдите в Модуль объекта отчета. Нам необходимо переопределить стандартное поведение системы при формировании.

Проанализируем программный код, который должен появиться в модуле объекта:


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

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

Метод 2. Работа с параметрами и отборами через Компоновщик настроек

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

Разберем, как правильно извлечь эти данные в коде формирования:


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

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

Особенности работы в фоновом задании

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

  1. Никаких обращений к формам: Запрещено использовать ЭтаФорма, Элементы или вызывать методы клиентских модулей. Код должен быть полностью автономным.
  2. Использование серверных модулей: Весь расчет должен находиться в модуле объекта отчета или в общих модулях с установленным флагом «Сервер».
  3. Метод Печать: Если ваш ручной отчет изначально использовал процедуру Печать в модуле формы, ее необходимо перенести в модуль объекта и адаптировать для работы без контекста формы.

Регистрация отчета в справочнике «Варианты отчетов»

Подсистема рассылки БСП работает не с метаданными объектов, а с элементами справочника ВариантыОтчетов. Если ваш отчет не на СКД, он может автоматически не попасть в этот справочник. Посмотрим, как решить эту проблему:

Поддержка форматов вывода

Одним из преимуществ использования СКД-заглушки является автоматическая поддержка форматов. БСП получает от вашего кода заполненный ТабличныйДокумент и сама конвертирует его в PDF, Excel (XLSX) или HTML в зависимости от настроек рассылки. Вам не нужно писать код для сохранения файла на диск — БСП сделает это штатно, если вы корректно заполнили параметр ДокументРезультат в процедуре ПриКомпоновкеРезультата.

Рассмотрим пример правильной подготовки табличного документа для вывода:


// В модуле объекта
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    
    // Очищаем документ перед выводом, чтобы избежать наслоения данных
    ДокументРезультат.Очистить();
    
    // Устанавливаем параметры печати, если это необходимо для PDF
    ДокументРезультат.АвтоМасштаб = Истина;
    ДокументРезультат.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
    
    // Формируем контент
    Макет = ПолучитьМакет("МакетОтчета");
    ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
    ДокументРезультат.Вывести(ОбластьШапка);
    
    // ... логика вывода строк ...
КонецПроцедуры

Заключение

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

← На главную