При разработке на платформе 1С 8.3 программисты часто сталкиваются с задачей программной установки фильтров в динамических списках (формах списков документов или справочников). Однако стандартное добавление элемента в коллекцию Отбор часто приводит к тому, что фильтрация работает, но пользователь не видит этого отбора в интерфейсе и, соответственно, не может его отключить или изменить. Разберем детально, как сделать программный отбор "прозрачным" и управляемым для пользователя.
Для начала проанализируем, почему простой код добавления элемента в Список.Отбор.Элементы не всегда дает нужный результат в интерфейсе. В системе компоновки данных (СКД), на которой базируются динамические списки, существует два уровня настроек:
Чтобы программный отбор появился в интерфейсе (стал "юзверским"), нам нужно не просто создать элемент, а связать эти два уровня через специальный идентификатор.
Рассмотрим основной способ решения задачи. Чтобы отбор стал доступен пользователю для редактирования, мы должны выполнить три условия: установить режим отображения, включить использование и, самое главное, присвоить строковый ИдентификаторПользовательскойНастройки.
Разберем по шагам правильный алгоритм программного добавления отбора:
// 1. Создаем новый элемент в основных настройках компоновщика
НовыйЭлемент = Список.КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
// 2. Указываем поле, по которому будет идти фильтрация
НовыйЭлемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
НовыйЭлемент.ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСписке;
НовыйЭлемент.Использование = Истина;
// 3. Указываем значения отбора (например, массив ссылок)
НовыйЭлемент.ПравоеЗначение = СписокСчетов;
// 4. Настраиваем видимость для пользователя
// БыстрыйДоступ выведет отбор сразу на форму, Обычный — в окно настроек
НовыйЭлемент.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ;
// 5. КЛЮЧЕВОЙ МОМЕНТ: Присваиваем уникальный идентификатор
// Это заставит 1С автоматически создать соответствующий элемент в ПользовательскиеНастройки
НовыйЭлемент.ИдентификаторПользовательскойНастройки = "ОтборПоСчетамСубподряда";
После выполнения этого кода система сама свяжет объект в Настройки.Отбор.Элементы с визуальным представлением в ПользовательскиеНастройки.Элементы. Теперь пользователь сможет увидеть галочку и список значений в форме настройки списка.
Часто возникает ситуация, когда отбор уже добавлен в схему (в конфигураторе), и нам нужно лишь программно изменить его значение при открытии формы, сохранив возможность ручной правки. В этом случае мы должны найти элемент непосредственно в коллекции пользовательских настроек.
Проанализируем пример поиска элемента по идентификатору:
ИдентификаторНастройки = "МойПрограммныйОтбор"; // Имя, заданное в конфигураторе или ранее в коде
Для Каждого Элемент Из Список.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы Цикл
Если Элемент.ИдентификаторПользовательскойНастройки = ИдентификаторНастройки Тогда
Элемент.Значение = НовыйСписокСчетов;
Элемент.Использование = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
В некоторых случаях удобнее передавать настройки "извне" — из той обработки или формы, которая открывает наш список. Для этого используются параметры формы. Рассмотрим вариант использования параметра ФиксированныеНастройки и параметра Отбор.
Отбор, платформа попытается применить её к пользовательским настройкам формы. Это самый простой способ, но он работает только для простых сравнений "Равно".Пример вызова формы с передачей отбора, который пользователь сможет редактировать (если в форме списка поле доступно):
ПараметрыВыбора = Новый Структура;
ЗначенияОтбора = Новый Структура("Статус", Перечисления.СтатусыЗаказов.Активен);
ПараметрыВыбора.Вставить("Отбор", ЗначенияОтбора);
ОткрытьФорму("Документ.ЗаказПокупателя.ФормаСписка", ПараметрыВыбора);
Выясним причины, по которым отбор может не работать или вести себя непредсказуемо:
ПользовательскиеПоля — это ошибка. Эти поля предназначены для создания новых вычисляемых колонок (например, "Сумма + НДС"), а не для фильтрации существующих данных.ПриСозданииНаСервере, ваши изменения могут быть перезаписаны сохраненными настройками пользователя. Чтобы этого избежать, иногда требуется сначала очистить текущие настройки или явно искать элемент в ПользовательскиеНастройки.РежимОтображения.Недоступный, элемент никогда не появится в интерфейсе, даже если у него есть идентификатор.Важное примечание: При программной работе с КомпоновщикНастроек всегда помните, что коллекция Элементы может содержать не только ЭлементОтбораКомпоновкиДанных, но и ГруппаЭлементовОтбораКомпоновкиДанных. При обходе коллекции в цикле всегда проверяйте тип элемента, чтобы избежать ошибок времени выполнения.
Таким образом, для создания интерактивного отбора всегда используйте связку через ИдентификаторПользовательскойНастройки и управляйте объектом через коллекцию пользовательских настроек компоновщика.