Как программно передать параметры в отчет на СКД при открытии из формы объекта?

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

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

Использование механизма БСП для управления настройками

Наиболее правильным подходом при работе с внешними отчетами, интегрированными в систему через Дополнительные отчеты и обработки, является использование штатных процедур библиотеки стандартных подсистем. Чтобы вмешаться в процесс формирования формы отчета, нам необходимо использовать процедуру ОпределитьНастройкиФормы в модуле объекта отчета.

Выполним следующие шаги для настройки:

  1. Откройте модуль вашего внешнего отчета.
  2. Добавьте процедуру ОпределитьНастройкиФормы.
  3. В этой процедуре укажите, что система должна разрешить использование стандартного события ПриСозданииНаСервере для вашего отчета.

Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
    Настройки.ПриСозданииНаСервере = Истина;
КонецПроцедуры

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

Установка значений параметров через контекст формы

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

В модуле вашего отчета добавьте процедуру:


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

Альтернативные способы передачи параметров

Помимо работы через ПриСозданииНаСервере, рассмотрим еще два важных инструмента, которые помогут вам в разработке:

1. Передача через структуру параметров открытия. Если вы самостоятельно вызываете отчет кодом (не через стандартный справочник доп. отчетов), вы можете передать параметры непосредственно в функцию ОткрытьФорму. Система СКД умеет распознавать ключ ЗначенияПараметров, в который можно передать структуру с именами параметров и их значениями.

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


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

Советы по отладке

Чтобы точно знать, какие данные приходят в форму, не пренебрегайте использованием отладчика 1С. Поставьте точку останова в начале процедуры ПриСозданииНаСервере и изучите содержимое переменной Параметры. Часто там можно обнаружить не только ссылку на объект-владелец, но и дополнительные служебные параметры, которые помогут сделать отчет более гибким и интеллектуальным.

Помните, что использование КомпоновщикНастроек — это стандарт де-факто для работы с СКД. Всегда проверяйте доступность параметра через НайтиЗначениеПараметра, прежде чем обращаться к свойству Значение, это убережет вас от ошибок исполнения, если в схеме компоновки данные параметры будут переименованы или удалены.

← На главную