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