Как настроить отбор списка выбора для параметров в СКД и сохранить их при смене варианта отчета?

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

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

В рамках этой статьи мы разберем, как решить две важные практические задачи:

  1. Настроить фильтрацию списка выбора для параметров СКД без написания кода.
  2. Обеспечить сохранение и перенос заполненных пользователем параметров при переключении вариантов отчетов.

Давайте подробно, шаг за шагом, проанализируем эти механизмы.

---

Часть 1. Настройка отбора списка выбора в параметрах СКД

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

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

Выполним настройку по шагам:

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

После сохранения этой настройки платформа автоматически применит указанный фильтр к динамическому списку формы выбора, когда пользователь попытается заполнить этот параметр на форме. Никакого программного кода писать не требуется!

---

Часть 2. Настройка динамической связи параметров выбора

А что делать, если отбор в одном параметре должен динамически зависеть от значения, выбранного в другом параметре? Например, если у нас есть параметры Контрагент и Договор, и мы хотим, чтобы в списке выбора договоров отображались только договоры выбранного контрагента.

Для решения этой задачи проанализируем механизм Связи параметров выбора, который также находится в свойствах редактирования параметра:

  1. Откроем Параметры редактирования для зависимого параметра (в нашем примере это Договор).
  2. Перейдем в строку Связи параметров выбора и нажмем кнопку выбора.
  3. Добавим новую строку:
    • В колонке «Параметр выбора» укажем путь отбора для зависимого справочника: Отбор.Владелец (так как владельцем договоров является контрагент).
    • В колонке «Поле» выберем имя того параметра СКД, который выступает в роли родителя: ПараметрыДанных.Контрагент.
  4. Также обратите внимание на режим очистки. Рекомендуется активировать автоматическую очистку зависимого поля при изменении родительского, чтобы избежать логических нестыковок в отчете (например, когда контрагент изменился, а в поле договора остался висеть договор старого контрагента).

---

Часть 3. Альтернативные формы выбора

Выясним еще одну полезную деталь. Если стандартный список выбора справочника с наложенными отборами нас все же не устраивает, и нам нужна сложная логика интерактивной работы, мы можем переопределить саму форму.

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

---

Часть 4. Сохранение параметров при смене варианта отчета

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

Рассмотрим три способа борьбы с этим поведением.

Способ 1. Программный перенос параметров (для собственных форм)

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

Посмотрим на пример реализации данного алгоритма в модуле управляемой формы отчета:


&НаСервере
Процедура ВосстановитьПараметрыПослеСменыВарианта(НовыйВариант)
    
    // Шаг 1. Получаем копию текущих настроек компоновщика до смены варианта
    // Важно использовать ПолучитьНастройки(), чтобы не работать со ссылкой на изменяемый объект
    ПредыдущиеНастройки = КомпоновщикНастроек.ПолучитьНастройки();
    
    // Шаг 2. Загружаем настройки нового варианта
    КомпоновщикНастроек.ЗагрузитьНастройки(НовыйВариант.Настройки);
    ТекущиеНастройки = КомпоновщикНастроек.Настройки;
    
    // Шаг 3. Переносим значения параметров из старых настроек в новые
    Для Каждого ТекЭлемент Из ПредыдущиеНастройки.ПараметрыДанных.Элементы Цикл
        
        // Ищем параметр с таким же именем в новой структуре настроек
        Параметр = ТекущиеНастройки.ПараметрыДанных.Элементы.Найти(ТекЭлемент.Параметр);
        
        Если Параметр <> Неопределено Тогда
            // Заполняем значение и признак использования параметра
            ЗаполнитьЗначенияСвойств(Параметр, ТекЭлемент);
        КонецЕсли;
        
    КонецЦикла;
    
    // Шаг 4. Аналогичным образом при необходимости переносим пользовательские отборы
    Для Каждого ЭлементОтбора Из ПредыдущиеНастройки.Отбор.Элементы Цикл
        // Здесь можно реализовать логику копирования пользовательских фильтров
    КонецЦикла;

КонецПроцедуры

Этот простой алгоритм гарантирует, что ключевые параметры, совпадающие в обоих вариантах, не будут утеряны при переключении.

Способ 2. Использование механизмов БСП (Библиотеки Стандартных Подсистем)

Если ваш отчет работает в типовой конфигурации (например, 1С:ERP, Комплексная автоматизация, Управление торговлей или Бухгалтерия предприятия) и использует стандартные общие формы отчетов БСП, то прямое редактирование формы отчета невозможно или нежелательно.

В БСП логика смены вариантов обрабатывается через общие обработчики событий (такие как клиентские методы Подключаемый_ЗагрузитьВариантОтчета и ЗагрузитьВариант). Чтобы внедрить туда сохранение параметров:

Способ 3. Интерактивное сохранение пользовательских вариантов

Иногда лучшим решением является обучение пользователей работе с механизмом пользовательских настроек:

---

Резюме

Мы проанализировали подходы к управлению параметрами в СКД. Использование свойства Параметры редактирования и префикса Отбор. позволяет быстро и надежно ограничивать списки выбора без программирования. А применение методов программного копирования настроек компоновщика или сохранение пользовательских вариантов решает проблему потери введенных данных при переключении отчетов.

← На главную