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