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

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

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

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

Шаг 1. Подготовка схемы компоновки данных (СКД)

Прежде чем передавать ссылку из документа, мы должны подготовить «принимающую сторону» — саму схему СКД внешнего отчета. Проанализируем, как настроить запрос и параметры.

Откроем схему компоновки данных и перейдем на закладку «Наборы данных». В тексте запроса нам необходимо добавить условие фильтрации. Например, если мы выводим данные из табличной части документа РеализацияТоваровУслуг, запрос может выглядеть так:


ВЫБРАТЬ
    РеализацияТоваровУслугТовары.Ссылка КАК Ссылка,
    РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура,
    РеализацияТоваровУслугТовары.Количество КАК Количество,
    РеализацияТоваровУслугТовары.Сумма КАК Сумма
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ГДЕ
    РеализацияТоваровУслугТовары.Ссылка = &ДокументСсылка

После написания запроса перейдем на закладку «Параметры». Убедимся, что параметр ДокументСсылка появился в списке. Рекомендуется установить для него тип ссылки на соответствующий документ и, при необходимости, включить ограничение доступности, если вы не хотите, чтобы пользователь менял его вручную в настройках отчета.

Шаг 2. Вызов внешнего отчета из формы документа

Теперь рассмотрим, как программно вызвать внешний отчет из формы документа. Нам необходимо сформировать команду (кнопку) и прописать логику открытия формы отчета с передачей параметров. Разберем пример кода, который обычно размещается в модуле команды документа или непосредственно в модуле формы документа.

Для открытия формы внешнего отчета используется метод ОткрытьФорму(). Главный секрет заключается в структуре параметров, которую мы передаем в этот метод.


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

Рассмотрим подробнее: в структуру параметров мы можем вставить ключ Отбор или ЗначенияПараметров. Платформа 1С при открытии типовой формы отчета старается автоматически применить эти данные к КомпоновщикуНастроек.

Шаг 3. Обработка ссылки внутри внешнего отчета

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

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


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

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

Шаг 4. Использование механизмов БСП (Дополнительные отчеты)

Большинство современных конфигураций (УТ 11, ERP, КА 2, БП 3.0) работают на базе Библиотеки стандартных подсистем (БСП). Если вы регистрируете отчет через справочник «Дополнительные отчеты и обработки», механизм передачи ссылки уже стандартизирован.

В этом случае в модуле объекта внешнего отчета обязательно должна присутствовать экспортная процедура ОпределитьНастройкиФормы или Печать. Проанализируем стандартный подход БСП:

  1. При вызове внешнего отчета из списка документов БСП передает в отчет массив ссылок выбранных объектов.
  2. В процедуре Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) параметр МассивОбъектов содержит ссылку на ваш документ.
  3. Вы можете программно подставить МассивОбъектов[0] в параметры СКД прямо перед формированием отчета.

Шаг 5. Работа с «Фиксированными настройками»

Выясним одну важную деталь: если вы передаете ссылку просто как параметр, пользователь может зайти в настройки отчета и сбросить его. Чтобы «жестко» ограничить отчет только одним документом, рекомендуется использовать Фиксированные настройки КомпоновщикаНастроек.

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


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

Итоги и рекомендации

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

Помните: для того чтобы ПараметрыДанных были доступны в коде, они должны быть корректно объявлены в самой схеме СКД. Использование Фиксированных настроек — лучший способ гарантировать, что отчет покажет данные именно по тому документу, из которого он был вызван.

← На главную