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