Как вызвать отчет на СКД из состава внешней обработки в отдельном окне?

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

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

В этой статье мы подробно разберем, как реализовать вызов СКД-отчета, который хранится непосредственно в макетах внешней обработки, без его предварительной регистрации в справочнике «Дополнительные отчеты и обработки». Мы проанализируем механизмы программного подключения внешних объектов и выясним, как передать данные из обработки в отчет.

Суть проблемы и выбор стратегии решения

Основная сложность заключается в том, что схема компоновки данных (макет СКД) сама по себе не является экранной формой. Для того чтобы платформа открыла привычное окно отчета с кнопками «Сформировать», «Настройки» и «Варианты», ей нужен объект типа ВнешнийОтчет. Если мы просто создадим макет СКД внутри обработки, нам придется вручную «рисовать» форму для вывода результата, что значительно увеличивает трудозатраты.

Оптимальным решением, как показывает практика, является создание полноценного внешнего отчета (файл .erf), который затем сохраняется внутри основной обработки как макет с типом Двоичные данные. Рассмотрим этот алгоритм пошагово.

Шаг 1. Подготовка внешнего отчета

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

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


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    Сообщить("Внешний отчет успешно запущен!");
КонецПроцедуры

После создания отчета сохраним его на диск как ВнешнийОтчет1.erf. Далее откроем нашу основную внешнюю обработку и добавим новый макет с типом Двоичные данные, загрузив в него созданный файл .erf. Назовем макет, например, МакетОтчета.

Шаг 2. Программное подключение отчета из обработки

Теперь нам необходимо написать код в основной обработке, который будет «извлекать» отчет из макета, регистрировать его в сеансе и открывать форму. Этот процесс должен происходить на стороне сервера, так как работа с бинарными данными и подключение внешних объектов требуют серверного контекста.

Рассмотрим процедуру подключения в модуле формы обработки:


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

Шаг 3. Открытие формы отчета в отдельном окне

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


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

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

Передача данных (Таблицы значений) в отчет

Часто задача стоит шире: нужно не просто открыть отчет, а передать в него данные, сформированные в основной обработке (например, Таблицу значений для набора данных «Объект»). Поскольку отчет после подключения становится самостоятельным объектом, прямой доступ к реквизитам обработки у него отсутствует.

Рассмотрим алгоритм передачи ТаблицыЗначений:

  1. В обработке формируем таблицу и помещаем ее во ВременноеХранилище.
  2. Передаем АдресХранилища в параметры открываемой формы отчета.
  3. В модуле объекта отчета в процедуре ПриКомпоновкеРезультата извлекаем таблицу из хранилища и подставляем в ВнешниеНаборыДанных.

Пример кода для передачи данных в обработке:


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

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


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

КонецПроцедуры

Особенности отладки и технические нюансы

При использовании метода ВнешниеОтчеты.Подключить() программисты часто сталкиваются с тем, что отладчик «пролетает» мимо точек останова во внешнем отчете. Чтобы успешно отладить код в процедуре ПриКомпоновкеРезультата, рекомендуется:

Проанализируем также вопрос безопасности. При установке флага БезопасныйРежим = Истина многие привычные действия (например, работа с файловой системой или вызов некоторых серверных процедур) будут запрещены. Поэтому, если вы доверяете коду своего отчета, устанавливайте Ложь.

Таким образом, мы рассмотрели универсальный и надежный способ вызова отчета в отдельном окне. Использование внешнего .erf файла внутри макета Двоичные данные — это наиболее «чистый» подход, который позволяет разделить интерфейсную логику обработки и аналитическую мощь СКД, сохраняя при этом мобильность решения в виде одного файла .epf.

← На главную