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