При разработке на управляемых формах в 1С часто возникает задача управления отображением данных в ДинамическийСписок. Рассмотрим, как программно создавать, изменять и настраивать отборы, чтобы гибко управлять выводом информации для пользователя.
Для управления фильтрацией в ДинамическийСписок мы используем объект КомпоновщикНастроекКомпоновкиДанных. Основным местом для внесения изменений является коллекция Настройки.Отбор.Элементы. Важно понимать, что каждое изменение здесь напрямую влияет на запрос, исполняемый системой к базе данных.
Чтобы программно добавить новый элемент отбора, мы выполняем следующие шаги:
Отбор.Элементы конкретного динамического списка.ЭлементОтбораКомпоновкиДанных.ЛевоеЗначение), вид сравнения (ВидСравнения) и значение (ПравоеЗначение).Использование = Истина.Разберем типичную ситуацию, когда нам нужно отфильтровать список по значению, взятому из другой части формы. Для этого воспользуемся следующим подходом:
// Проверка наличия элементов отбора
Если СписокНаФорме.Отбор.Элементы.Количество() = 0 Тогда
// Создаем новый элемент отбора
ЭлементОтбора = СписокНаФорме.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ИмяВашегоПоля");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = ЗначениеДляОтбора;
ЭлементОтбора.Использование = Истина;
Иначе
// Изменяем существующий элемент
СписокНаФорме.Отбор.Элементы[0].ПравоеЗначение = ЗначениеДляОтбора;
СписокНаФорме.Отбор.Элементы[0].Использование = Истина;
КонецЕсли;
Зачастую требуется установить отбор на основе того, что выбрал пользователь в другом списке или таблице. Для получения доступа к данным текущей строки на управляемой форме используем коллекцию Элементы формы.
Рассмотрим, как получить значение идентификатора (например, ID) из выбранной строки динамического списка:
// Получаем данные текущей строки элемента формы
ТекущаяСтрокаДанные = Элементы.ИмяЭлементаСписка.ТекущиеДанные;
Если ТекущаяСтрокаДанные <> Неопределено Тогда
ВыбранныйID = ТекущаяСтрокаДанные.ID;
КонецЕсли;
Важно помнить, что обращение Элементы.ИмяЭлемента.ТекущиеДанные возвращает объект, содержащий значения всех колонок, которые выведены в динамический список. Если в списке нет нужной колонки (даже если она есть в запросе динамического списка, но не выведена на форму), ТекущиеДанные могут не содержать этого поля.
Разберем несколько важных моментов, которые помогут избежать ошибок при работе с программными отборами:
Использование: Никогда не забывайте устанавливать Использование = Истина. Если этого не сделать, добавленный элемент будет программно присутствовать в коллекции, но система его полностью проигнорирует.Добавить() может привести к накоплению лишних условий. Рекомендуется перед добавлением проверять, не существует ли уже нужный элемент, либо очищать коллекцию методом Очистить(), если это допустимо логикой вашей задачи.КомпоновщикНастроек вызывает пересчет запроса динамического списка. Старайтесь объединять все изменения отборов в одном блоке кода, чтобы избежать многократных запросов к серверу базы данных.ПравомЗначении соответствовал типу поля в ЛевомЗначении. Передача строки вместо ссылки или числа приведет к тому, что отбор не вернет ожидаемых результатов.Комбинируя эти приемы, вы сможете создавать сложные интерфейсы с динамическим поведением, где содержимое списков будет меняться в зависимости от контекста действий пользователя.