Как правильно обратиться к реквизиту параметра в СКД

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

При разработке отчетов в системе компоновки данных (СКД) разработчики часто сталкиваются с ситуацией, когда значение одного параметра должно вычисляться на основании реквизита другого ссылочного параметра. Например, требуется установить границу периода отчета равной дате документа, выбранного пользователем в параметре &ДокументПлан.

Попытка написать в колонке Выражение на вкладке Параметры конструкцию вида &ДокументПлан.Дата приводит к ошибке: "Параметр не найден: ДокументПлан.Дата". Разберем по шагам, почему возникает эта ошибка и какие существуют правильные способы решения задачи.

Причины возникновения ошибки

Выясним причину такого поведения платформы. Здесь действуют два ключевых ограничения архитектуры СКД:

  1. Ограничение синтаксиса выражений параметров: В поле Выражение на вкладке параметров символ амперсанда & воспринимается парсером как префикс всего имени целиком. Платформа ищет параметр с полным именем ДокументПлан.Дата, а не обращается к свойству объекта по ссылке.
  2. Порядок вычисления в СКД: Выражения параметров рассчитываются до выполнения запросов к базе данных. По этой причине в выражении параметра нельзя использовать псевдонимы полей из секции ВЫБРАТЬ набора данных — в момент расчета параметров поля набора данных еще не сформированы.

Способ 1. Получение реквизита параметра в тексте запроса

Если дата документа нужна для фильтрации или расчетов внутри самого набора данных, наиболее эффективным и быстрым решением является извлечение реквизита прямо в запросе. Для ссылочных параметров составного или неопределенного типа необходимо использовать конструкцию ВЫРАЗИТЬ, чтобы платформа знала точную таблицу метаданных.

Посмотрим на пример запроса:


ВЫБРАТЬ
    УстановкаПланПродаж.МенеджерПоПродажам,
    УстановкаПланПродаж.План,
    ВЫРАЗИТЬ(&ДокументПлан КАК Документ.УстановкаПланПродаж).Дата КАК ДатаДокумента
ИЗ
    Документ.УстановкаПланПродаж.ПланПродаж КАК УстановкаПланПродаж
ГДЕ
    УстановкаПланПродаж.Ссылка = &ДокументПлан

В этом случае обращение через точку происходит на уровне СУБД, что гарантирует корректное выполнение запроса без дополнительных параметров.

Способ 2. Вызов экспортной функции в выражении параметра

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

Для этого в конфигурациях на базе БСП (Библиотеки Стандартных Подсистем) доступна стандартная функция:

ОбщегоНазначения.ЗначениеРеквизитаОбъекта(&ДокументПлан, "Дата")

Если БСП не используется, можно создать собственную функцию в серверном неглобальном общем модуле и вызывать её в выражении параметра:

МойСерверныйМодуль.ПолучитьДатуДокумента(&ДокументПлан)

Способ 3. Передача значений через связи наборов данных

Когда в схеме компоновки данных используются два набора данных и второй набор должен фильтроваться по дате документа из первого набора, оптимально настроить связь между ними:

  1. В первом наборе данных выбираем поле Ссылка.Дата по переданному параметру &ДокументПлан.
  2. Переходим на вкладку Связи наборов данных.
  3. Указываем источник (НаборДанных1) и приемник (НаборДанных2).
  4. В колонке Параметры указываем имя параметра второго набора (например, НачалоПериода), в который будет передаваться значение поля даты из первого набора.

Способ 4. Программная инициализация в модуле отчета

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

Разберем пример программного кода:


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

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

Таким образом, для обращения к реквизитам параметров СКД следует использовать явное приведение типа в запросе через ВЫРАЗИТЬ, либо получать значение с помощью серверных функций в выражении параметра.

← На главную