К статье
Практический материал

Разработка и Конфигурация · 12 мин

Как программно установить отбор в динамическом списке в 1С

Как программно установить отбор в динамическом списке 1С через КомпоновщикНастроек: примеры кода, виды сравнения, типичные ошибки и проверка результата.

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

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

Где находятся настройки отбора динамического списка

У реквизита формы типа «ДинамическийСписок» есть свойство КомпоновщикНастроек, через которое доступны три уровня настроек: Настройки (основные, хранятся вместе со списком), ФиксированныеНастройки (недоступны пользователю) и ПользовательскиеНастройки (то, что меняет пользователь через «Ещё — Настроить список»). Программный отбор чаще всего добавляется либо в основные настройки, либо в фиксированные.

Разница принципиальна. Элемент в основных настройках пользователь может увидеть и отключить. Элемент в фиксированных настройках скрыт от пользователя и не снимается интерактивно — это правильный выбор для ограничений, связанных с безопасностью и логикой разграничения данных. Пользовательский отбор при этом накладывается поверх программного по условию «И».

Базовый код установки отбора

Минимальный рабочий пример: отбор списка документов по организации в обработчике ПриСозданииНаСервере. Код добавляет новый элемент отбора в основные настройки компоновщика.

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

ЭлементОтбора = Список.КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(

Тип("ЭлементОтбораКомпоновкиДанных"));

ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Организация");

ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

ЭлементОтбора.ПравоеЗначение = ОрганизацияОтбор;

ЭлементОтбора.Использование = Истина;

ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;

КонецПроцедуры

Обратите внимание на свойство РежимОтображения: значение «Недоступный» показывает отбор пользователю, но не даёт его изменить или снять. Если элемент должен быть полностью скрыт, используйте фиксированные настройки вместо основных — тогда и режим отображения настраивать не потребуется.

bsl
ЭлементОтбора = Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
ЭлементОтбора.ПравоеЗначение = СписокСсылок;
ЭлементОтбора.Использование = Истина;

Виды сравнения и типичные сценарии

Свойство ВидСравнения определяет оператор условия. Выбор зависит от типа поля и задачи: для ссылочных полей чаще всего используются «Равно», «ВСписке» и «ВИерархии», для строк — «Содержит» и «НачинаетсяС», для дат — «БольшеИлиРавно» и «МеньшеИлиРавно» либо отбор по периоду через параметры.

Отбор по списку значений

Когда нужно показать записи по нескольким значениям, используется вид сравнения ВСписке, а в правое значение передаётся объект типа СписокЗначений, заполненный ссылками. Передача массива напрямую нередко приводит к тому, что отбор молча не срабатывает, поэтому безопаснее явно собрать СписокЗначений.

Отбор по иерархии справочника

Для отбора элементов, входящих в группу справочника вместе со всеми вложенными группами, применяется вид сравнения ВИерархии с правым значением — ссылкой на группу. Это стандартный способ показать, например, всю номенклатуру выбранного раздела каталога.

Отбор по периоду

Если в динамическом списке документов включена основная таблица с датой, период удобнее задавать через свойство Список.Параметры (элементы «НачалоПериода» и «КонецПериода»), а не через отбор по полю «Дата». Платформа при этом корректно учитывает границы дат и не заставляет писать два элемента отбора вручную.

Сравнение вариантов

Основные настройки (Настройки.Отбор)

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

Фиксированные настройки (ФиксированныеНастройки.Отбор)

Подходит для жёстких ограничений по правам и логике. Пользователь не видит и не может снять такой отбор.

Произвольный запрос с параметрами

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

Изменение и отключение существующего отбора

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

&НаСервере

Процедура УстановитьОтборПоСкладу(Склад)

Для Каждого Элемент Из Список.КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл

Если ТипЗнч(Элемент) = Тип("ЭлементОтбораКомпоновкиДанных")

И Элемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Склад") Тогда

Если ЗначениеЗаполнено(Склад) Тогда

Элемент.ПравоеЗначение = Склад;

Элемент.Использование = Истина;

Иначе

Элемент.Использование = Ложь;

КонецЕсли;

Возврат;

КонецЕсли;

КонецЦикла;

// Элемента не было — добавляем новый

ЭлементОтбора = Список.КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(

Тип("ЭлементОтбораКомпоновкиДанных"));

ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Склад");

ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

ЭлементОтбора.ПравоеЗначение = Склад;

ЭлементОтбора.Использование = ЗначениеЗаполнено(Склад);

КонецПроцедуры

Ключевой приём — управление через свойство Использование: элемент остаётся в настройках, но отключается установкой Использование = Ложь. Это предпочтительнее удаления элемента, потому что сохраняет вид сравнения и упрощает повторное включение. Удалять элементы стоит только при полной переустановке настроек.

Порядок установки отбора
  1. 1
    Определите, в какие настройки добавлять отбор: основные (видим пользователю) или фиксированные (скрыт).
  2. 2
    В обработчике ПриСозданииНаСервере получите коллекцию Список.КомпоновщикНастроек.Настройки.Отбор.Элементы.
  3. 3
    Добавьте элемент типа ЭлементОтбораКомпоновкиДанных и заполните ЛевоеЗначение, ВидСравнения, ПравоеЗначение.
  4. 4
    Установите Использование = Истина и при необходимости РежимОтображения = Недоступный.
  5. 5
    Откройте форму и проверьте, что список содержит только ожидаемые записи, а в настройке списка отбор виден в нужном режиме.

Отбор в произвольном запросе и через параметры

Когда динамический список переведён в режим произвольного запроса (флаг «ПроизвольныйЗапрос»), отбор по-прежнему можно накладывать через компоновщик — платформа обернёт запрос и добавит условие. Но если условие сложное (например, проверка значения в связанной таблице), надёжнее встроить его в текст запроса и управлять им через параметры.

Параметры запроса устанавливаются через коллекцию Список.Параметры: метод УстановитьЗначениеПараметра("ИмяПараметра", Значение). Это удобно и для производительности: условие с параметром попадает непосредственно в текст запроса к СУБД, тогда как программный отбор компоновки иногда применяется к уже соединённым данным. Для больших таблиц разница в скорости может быть заметной.

Типичные ошибки и как их избежать

Первая распространённая ошибка — добавление нового элемента отбора при каждом вызове процедуры. После нескольких переключений значений в настройках накапливаются дубли, которые объединяются по «И» и дают пустой список. Решение — искать существующий элемент по полю и обновлять его, как показано в примере выше.

Вторая ошибка — несовпадение типов: в правое значение передаётся строка вместо ссылки или массив вместо списка значений. Отбор при этом либо не работает, либо отсекает все записи без сообщения об ошибке. Перед установкой полезно убедиться, что тип значения совпадает с типом поля.

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

Типичные ошибки
01
Добавление элемента отбора при каждом вызове вместо поиска и обновления существующего — накапливаются дубли, список становится пустым.
02
Передача массива в правое значение при виде сравнения ВСписке вместо СписокЗначений — отбор молча не применяется.
03
Установка отбора в основных настройках без режима «Недоступный» там, где ограничение обязательное — пользователь снимает отбор и видит лишние данные.
04
Опечатка в имени поля ПолеКомпоновкиДанных — элемент добавляется, но условие не работает, ошибка не выводится.

Проверка результата

После установки отбора проверьте три вещи. Во-первых, содержимое списка: откройте форму и убедитесь, что отображаются только ожидаемые записи, а при смене значения отбора список обновляется. Во-вторых, поведение пользовательских настроек: через «Ещё — Настроить список» посмотрите, в каком режиме виден ваш элемент и нельзя ли его отключить там, где это недопустимо.

В-третьих, проверьте граничные случаи: пустое значение отбора (элемент должен отключаться через Использование = Ложь, а не отбирать по пустой ссылке), повторное открытие формы и совместную работу программного отбора с отбором, который задаёт сам пользователь. Оба условия должны применяться одновременно по «И», а не заменять друг друга.

Контрольные точки

Как проверить результат

Содержимое списка после установки отбора
Норма

Показаны только записи, удовлетворяющие условию

Тревожный признак

Список пуст или содержит лишние записи — проверьте тип значения и вид сравнения

Повторная установка отбора
Норма

Значение обновляется, число элементов в настройках не растёт

Тревожный признак

В настройках появляются дубли элементов по одному полю

Настройка списка пользователем
Норма

Программный отбор недоступен для отключения или скрыт в фиксированных настройках

Тревожный признак

Пользователь может снять обязательное ограничение

Частые вопросы

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

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

Почему отбор по полю не работает, хотя элемент добавлен?

Чаще всего поле недоступно для отбора: его нет в запросе динамического списка или оно исключено из доступных полей отбора в настройках. Также проверьте точное имя поля и совпадение типа правого значения с типом поля.

Как задать отбор «ИЛИ» между двумя условиями?

Добавьте в коллекцию элементов группу отбора: Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных")), установите у неё ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли и добавьте условия уже внутрь этой группы.

Можно ли установить отбор на клиенте без вызова сервера?

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

Как отобрать записи, где поле не заполнено?

Используйте вид сравнения НеЗаполнено — правое значение при этом не задаётся. Обратный вариант — вид сравнения Заполнено. Это надёжнее, чем сравнение с пустой ссылкой или пустой строкой, особенно для составных типов полей.

Итог

Что важно запомнить

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