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