Как ограничить выбор контрагента в параметрах отчета СКД по определенному реквизиту

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

При разработке отчетов на системе компоновки данных (СКД) часто возникает задача не просто добавить параметр, но и сделать так, чтобы пользователь мог выбирать не из всего справочника, а только из определенного подмножества элементов. Например, когда в поле Контрагент должны попадать только те организации, у которых установлен флаг Поставщик или Активен. Разберем по шагам все доступные методы решения этой задачи: от самых простых (настроечных) до более сложных (программных).

Метод 1. Использование стандартного свойства «Параметры выбора»

Это наиболее правильный и современный способ, который реализуется непосредственно в схеме компоновки данных без написания кода. Рассмотрим подробнее, как его настроить:

  1. Откроем Схему компоновки данных нашего отчета.
  2. Перейдем на закладку Параметры.
  3. Найдем параметр Контрагент. В строке этого параметра найдем колонку Параметры выбора.
  4. Нажмем на кнопку с многоточием. В открывшемся окне нажмем «Добавить».
  5. В поле «Имя параметра» выберем Отбор.ТвойРеквизит (где ТвойРеквизит — это имя булевского поля в справочнике, например, ЭтоПоставщик).
  6. В поле «Значение» установим Истина.

Результат: Теперь, когда пользователь нажмет кнопку выбора в поле параметра, платформа автоматически применит фильтр к открывшейся форме справочника. Пользователь увидит только нужных контрагентов.

Метод 2. Ограничение через «Доступные значения»

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

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

Метод 3. Связи параметров выбора (динамическая фильтрация)

Выясним причину, по которой иногда первый метод может не подойти. Бывает, что список контрагентов должен зависеть от другого параметра отчета (например, от выбранного Региона). В этом случае мы используем колонку Связи параметров выбора:

  1. В настройках параметра Контрагент выберем «Связи параметров выбора».
  2. Укажем в качестве поля связи другой параметр отчета.
  3. В поле «Путь к данным» укажем реквизит справочника, по которому будет идти связь (например, Регион).

Это позволит создать «умный» фильтр, который будет меняться «на лету» в зависимости от того, что пользователь указал в соседних полях.

Метод 4. Программная установка отбора в форме отчета

Если логика отбора слишком сложная для простых настроек, нам придется прибегнуть к программированию. Рассмотрим пример, когда мы создаем форму отчета и хотим программно управлять списком выбора. Как было отмечено в обсуждении на форуме, мы можем использовать событие ПриСозданииНаСервере или работать с компоновщиком настроек.

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


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

Метод 5. Различие между фильтром выбора и фильтром данных

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

Если вы просто пропишете условие в тексте запроса СКД:

ГДЕ Контрагент.ТвойРеквизит = Истина

Пользователь все равно сможет выбрать любого контрагента из справочника. Однако после нажатия кнопки «Сформировать» в отчет либо ничего не попадет, либо данные будут отфильтрованы. Это плохой тон проектирования интерфейсов, так как пользователь будет сбит с толку: «Я выбрал контрагента, а в отчете его нет». Поэтому всегда стремитесь ограничивать именно выбор в интерфейсе, используя методы, описанные выше.

Метод 6. Использование специальной формы выбора

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

  1. В справочнике Контрагенты создается отдельная форма выбора.
  2. В динамическом списке этой формы прописывается произвольный запрос с нужной логикой фильтрации.
  3. В СКД в поле Форма выбора для конкретного параметра указывается именно эта созданная форма.

Резюме: Для большинства задач идеально подходит Метод 1 (Параметры выбора в настройках СКД). Он не требует программирования, легко обновляется при изменении конфигурации и корректно работает как в тонком, так и в веб-клиенте.

← На главную