Как в отборе СКД настроить фильтрацию архивных элементов при выборе значения?

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

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

Метод 1. Настройка на уровне метаданных реквизита

Начнем с самого простого и эффективного способа, который не требует написания кода. Если в вашей конфигурации у справочника (например, «Банки») уже есть реквизит Архивный (тип Булево), мы можем ограничить выбор прямо в свойствах объекта.

Рассмотрим по шагам, как это сделать:

  1. Откроем дерево метаданных и найдем нужный реквизит в документе или другом справочнике, который используется в отчете.
  2. Перейдем в палитру свойств этого реквизита.
  3. Найдем свойство Параметры выбора.
  4. Нажмем на кнопку выбора (три точки) и добавим условие: Отбор.Архивный(Ложь).

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

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

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

Разберем ситуацию на примере. Допустим, у нас есть поле Банк и поле Счет. Чтобы при выборе счета система понимала, к какому банку он относится, мы настраиваем связь:

  1. В поле «Связи параметров выбора» для реквизита Счет указываем: Отбор.Владелец(Объект.Банк).
  2. Дополнительно в «Параметрах выбора» прописываем Отбор.Архивный(Ложь).

Таким образом, система применит двойную фильтрацию: сначала по владельцу (выбранному банку), а затем по статусу записи. Это стандартный и наиболее правильный подход для реализации зависимых списков в 1С.

Метод 3. Настройка в схеме компоновки данных (СКД)

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

  1. Откроем конструктор СКД и перейдем на закладку Наборы данных.
  2. В списке полей найдем нужное поле (например, Банк).
  3. В колонке Параметры редактирования нажмем на кнопку выбора.
  4. Найдем строку Параметры выбора и установим там значение Отбор.Архивный = Ложь.

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

Метод 4. Программная установка отбора (событие ПриНачалеВыбора)

Иногда логика фильтрации должна быть динамической. Например, если пользователь обладает определенными правами, он может видеть архивные записи, а обычный пользователь — нет. В таком случае рассмотрим программный способ реализации в модуле формы.

Для этого используется обработчик события ПриНачалеВыбора. Посмотрим на пример кода:


&НаКлиенте
Процедура БанкПриНачалеВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь; // Отменяем стандартное открытие
    
    // Создаем структуру параметров для открытия формы выбора
    ПараметрыОтбора = Новый Структура("Архивный", Ложь);
    ПараметрыФормы = Новый Структура("Отбор", ПараметрыОтбора);
    
    // Открываем форму выбора справочника "Банки" с нашим отбором
    ОткрытьФорму("Справочник.Банки.ФормаВыбора", ПараметрыФормы, Элемент);
    
КонецПроцедуры

В данном примере мы полностью берем управление на себя. Важный момент: использование СтандартнаяОбработка = Ложь позволяет нам передать в форму выбора любые сложные структуры данных, которые невозможно задать в визуальном конструкторе.

Метод 5. Использование функциональных опций

В самописных конфигурациях хорошим тоном считается использование Функциональных опций. Если задача звучит как «скрыть архивные данные во всей системе одной кнопкой», то это лучший вариант. Мы можем создать функциональную опцию ПоказыватьАрхивныеДанные, привязать ее к константе и использовать в свойствах объектов метаданных. Если опция выключена, соответствующие данные или поля просто не будут отображаться или будут фильтроваться автоматически.

Метод 6. Режим выбора из списка

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

  1. Установим у поля формы свойство РежимВыбораИзСписка в значение Истина.
  2. В событии ПриСозданииНаСервере или ПриНачалеВыбора программно заполним СписокВыбора только актуальными данными.

Пример заполнения списка:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   Банки.Ссылка КАК Ссылка
    |ИЗ
    |   Справочник.Банки КАК Банки
    |ГДЕ
    |   Банки.Архивный = ЛОЖЬ";

Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();

Пока Выборка.Следующий() Цикл
    Элементы.Банк.СписокВыбора.Добавить(Выборка.Ссылка);
КонецЦикла;

Проблема «битых» ссылок и старых данных

Проанализируем ситуацию: что произойдет, если в отчете уже был выбран архивный банк, а мы установили жесткий отбор Архивный = Ложь? При попытке перевыбора или просто при открытии настроек пользователь может столкнуться с тем, что текущее значение «исчезло» или отображается некорректно.

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

Заключение

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

← На главную