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