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