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