Как программно добавить отбор в динамический список, чтобы он был виден пользователю?

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

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

Понимаем структуру компоновщика настроек

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

  1. Общие настройки (Настройки): Это скелет настроек, который определяет логику выборки данных. Если вы добавляете отбор сюда, он работает на уровне запроса, но система "скрывает" его от глаз пользователя, если не указана явная связь.
  2. Пользовательские настройки: Это те самые флажки, поля ввода и условия, которые пользователь видит в окне "Настроить список" или на панели быстрых отборов.

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

Реализация через ИдентификаторПользовательскойНастройки

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

Разберем по шагам правильный алгоритм программного добавления отбора:


// 1. Создаем новый элемент в основных настройках компоновщика
НовыйЭлемент = Список.КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));

// 2. Указываем поле, по которому будет идти фильтрация
НовыйЭлемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
НовыйЭлемент.ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСписке;
НовыйЭлемент.Использование = Истина;

// 3. Указываем значения отбора (например, массив ссылок)
НовыйЭлемент.ПравоеЗначение = СписокСчетов;

// 4. Настраиваем видимость для пользователя
// БыстрыйДоступ выведет отбор сразу на форму, Обычный — в окно настроек
НовыйЭлемент.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ;

// 5. КЛЮЧЕВОЙ МОМЕНТ: Присваиваем уникальный идентификатор
// Это заставит 1С автоматически создать соответствующий элемент в ПользовательскиеНастройки
НовыйЭлемент.ИдентификаторПользовательскойНастройки = "ОтборПоСчетамСубподряда";

После выполнения этого кода система сама свяжет объект в Настройки.Отбор.Элементы с визуальным представлением в ПользовательскиеНастройки.Элементы. Теперь пользователь сможет увидеть галочку и список значений в форме настройки списка.

Управление значением в существующих настройках

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

Проанализируем пример поиска элемента по идентификатору:


ИдентификаторНастройки = "МойПрограммныйОтбор"; // Имя, заданное в конфигураторе или ранее в коде

Для Каждого Элемент Из Список.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы Цикл
    Если Элемент.ИдентификаторПользовательскойНастройки = ИдентификаторНастройки Тогда
        Элемент.Значение = НовыйСписокСчетов;
        Элемент.Использование = Истина;
        Прервать;
    КонецЕсли;
КонецЦикла;

Передача настроек при открытии формы

В некоторых случаях удобнее передавать настройки "извне" — из той обработки или формы, которая открывает наш список. Для этого используются параметры формы. Рассмотрим вариант использования параметра ФиксированныеНастройки и параметра Отбор.

  1. Параметр "Отбор": Если передать структуру в параметре Отбор, платформа попытается применить её к пользовательским настройкам формы. Это самый простой способ, но он работает только для простых сравнений "Равно".
  2. Параметр "ФиксированныеНастройки": Эти настройки добавляются к запросу жестко (через "И"). Пользователь не сможет их изменить или удалить. Это полезно для реализации прав доступа или жесткой фильтрации по контексту.

Пример вызова формы с передачей отбора, который пользователь сможет редактировать (если в форме списка поле доступно):


ПараметрыВыбора = Новый Структура;
ЗначенияОтбора = Новый Структура("Статус", Перечисления.СтатусыЗаказов.Активен);
ПараметрыВыбора.Вставить("Отбор", ЗначенияОтбора);

ОткрытьФорму("Документ.ЗаказПокупателя.ФормаСписка", ПараметрыВыбора);

Типичные ошибки при работе с отборами

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

Важное примечание: При программной работе с КомпоновщикНастроек всегда помните, что коллекция Элементы может содержать не только ЭлементОтбораКомпоновкиДанных, но и ГруппаЭлементовОтбораКомпоновкиДанных. При обходе коллекции в цикле всегда проверяйте тип элемента, чтобы избежать ошибок времени выполнения.

Таким образом, для создания интерактивного отбора всегда используйте связку через ИдентификаторПользовательскойНастройки и управляйте объектом через коллекцию пользовательских настроек компоновщика.

← На главную