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

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

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

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

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

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

Ниже разобраны все основные подходы с примерами кода на встроенном языке 1С, типичными ошибками и способами проверки результата. Материал применим к конфигурациям на управляемых формах (1С:Предприятие 8.3), где динамический список работает на базе системы компоновки данных.

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

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

Внутри динамический список использует систему компоновки данных (СКД). Это значит, что у него есть компоновщик настроек, в котором доступны отбор, порядок, группировка и условное оформление. Отбор, который вы видите в настройках, преобразуется платформой в условие ГДЕ (WHERE) итогового запроса к базе данных.

Добраться до отбора можно двумя путями. Первый — в конфигураторе: открыть форму списка, найти реквизит типа «ДинамическийСписок» (обычно называется «Список») и открыть его свойства. Второй — программно, обратившись к реквизиту формы по имени и далее к его настройкам компоновки.

Установка отбора в конфигураторе через настройки списка

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

В открывшемся окне настроек перейдите на закладку «Отбор». В левой части будет список доступных полей — это поля основной таблицы списка и связанных таблиц. Перетащите нужное поле в правую часть, выберите вид сравнения (равно, не равно, в списке, в группе и т.д.) и укажите значение. Например, чтобы показывать только непомеченные на удаление элементы, добавьте условие «ПометкаУдаления Равно Ложь».

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

Порядок действий в конфигураторе
  1. 1
    Откройте форму списка объекта в конфигураторе
  2. 2
    В реквизитах формы найдите динамический список и откройте его свойства
  3. 3
    Откройте настройку отбора (закладка «Отбор» в настройках СКД)
  4. 4
    Добавьте элемент отбора: поле, вид сравнения, значение
  5. 5
    Сохраните форму и проверьте результат в режиме предприятия

Программная установка отбора через настройки компоновщика

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

Типовой пример добавления отбора по организации выглядит так. Сначала получаем коллекцию элементов отбора: Список.КомпоновщикНастроек.Настройки.Отбор.Элементы. Затем добавляем новый элемент, задаём левое значение (поле), вид сравнения и правое значение. Обязательно устанавливаем свойства «Использование» и «РежимОтображения», иначе отбор может не примениться или оказаться доступным пользователю для отключения.

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

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

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

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

Важно понимать разницу между основными настройками и пользовательскими. Изменения, внесённые в КомпоновщикНастроек.Настройки, действуют до тех пор, пока пользователь не применил собственные настройки списка — тогда ваши программные добавления могут перестать отображаться в его настройках, хотя фиксированные условия продолжат работать.

Отбор через фиксированные настройки и свойство Список.Отбор

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

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

Отдельный случай — отбор по периоду в списках документов. У динамического списка документов есть стандартная настройка периода, доступная через Список.Параметры или через стандартный элемент пользовательских настроек. Программно период можно задать через параметры компоновки: найти параметр «НачалоПериода» и «КонецПериода» (если они есть в схеме) или добавить отбор по полю «Дата» с видом сравнения «БольшеИлиРавно» и «МеньшеИлиРавно».

Способы установки отбора

Настройки в конфигураторе

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

Программно через КомпоновщикНастроек.Настройки

Подходит для отборов, зависящих от параметров формы и пользователя. Ограничение: пользователь может снять отбор через настройки списка, если не задан режим отображения.

ФиксированныеНастройки

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

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

Подходит для разовых и личных фильтров без доработки конфигурации. Ограничение: настройки индивидуальны и не переносятся между пользователями автоматически.

Отбор в режиме предприятия: что доступно пользователю

Конечный пользователь может установить отбор без программирования. В форме списка нужно открыть меню «Ещё» и выбрать пункт «Настроить список». Откроется окно с закладками «Отбор», «Сортировка», «Группировка» и «Условное оформление». На закладке «Отбор» пользователь добавляет поля, выбирает условие и значение — например, «Склад В списке» и отмечает нужные склады.

Быстрые отборы также доступны через панель навигации формы, если разработчик вынес туда поля: тогда над списком появляются поля ввода, и при изменении значения список перечитывается автоматически. В типовых конфигурациях так реализованы отборы по организации, контрагенту, ответственному.

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

Отбор по полям связанных таблиц и сложные условия

В динамическом списке можно отбирать не только по полям основной таблицы, но и по полям связанных объектов через точку: «Контрагент.Родитель», «Договор.Организация» и т.п. В конфигураторе такие поля видны в дереве доступных полей, программно они задаются тем же способом — в конструкторе поля компоновки указывается полный путь: Новый ПолеКомпоновкиДанных("Контрагент.Родитель").

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

Полезные виды сравнения, которые часто упускают: «ВСписке» и «ВГруппеИзСписка» (для иерархических справочников — отбор по нескольким папкам сразу), «Содержит» (поиск подстроки, работает медленно на больших таблицах), «Заполнено» и «НеЗаполнено». Отбор «Содержит» по неиндексированным строковым полям на миллионах записей может подвесить список — в таких случаях лучше использовать полнотекстовый поиск.

Типичные ошибки и проверка результата

Самая частая ошибка — отбор добавлен, но не работает, потому что не установлено свойство «Использование = Истина». Вторая по частоте — неверное имя поля в левом значении: если поля нет в схеме компоновки, платформа молча игнорирует условие или выдаёт ошибку при открытии формы. Всегда проверяйте, что поле доступно в настройках списка в конфигураторе.

Третья группа проблем связана с типами значений: отбор по строковому представлению ссылки вместо самой ссылки, отбор по дате без учёта времени (условие «Равно» по дате почти никогда не срабатывает, нужен диапазон), отбор по NULL вместо пустой ссылки. Для проверки пустых значений используйте вид сравнения «НеЗаполнено» — он корректно обрабатывает и NULL, и пустые ссылки.

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

Типичные ошибки
01
Не установлено Использование = Истина — элемент отбора существует, но не применяется
02
Указано имя поля, которого нет среди доступных полей СКД — условие игнорируется или форма падает с ошибкой
03
Отбор по ссылке сравнивается со строкой — типы не совпадают, записей нет
04
Отбор добавляется в цикле или при каждом вызове обработчика — накапливаются дубли условий
05
Условие добавлено в основные настройки, а пользовательские настройки его перекрыли — кажется, что отбор не работает
06
Отбор по дате через «Равно» без учёта времени — документы за день не находятся
Контрольные точки

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

Откройте «Ещё → Настроить список» в режиме предприятия
Норма

Добавленное условие видно в списке отборов и отмечено флажком

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

Условия нет или флажок снят — отбор не применился

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

Список сократился, лишние записи исчезли

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

Состав записей не изменился

Повторное открытие формы
Норма

Отбор сохраняется и работает после перезапуска

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

После переоткрытия условие пропадает — значит, оно добавлялось не в том обработчике или перекрыто настройками

FAQ: частые вопросы об отборах в динамическом списке

Как снять программно установленный отбор?

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

Почему пользователь не видит добавленный программно отбор в настройках списка?

Потому что задан режим отображения «Недоступный» или условие добавлено в фиксированные настройки — такие элементы намеренно скрываются из интерфейса. Чтобы пользователь видел условие, установите РежимОтображения = Обычный или добавьте элемент в пользовательские настройки компоновщика.

Как сделать отбор по текущему пользователю?

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

Работает ли отбор, если у списка установлен произвольный запрос?

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

Как установить отбор по нескольким значениям одного поля?

Используйте вид сравнения «ВСписке», а в правое значение передайте список значений (объект СписокЗначений) с нужными элементами. Для иерархических справочников удобен вид «ВГруппеИзСписка» — он включает все вложенные элементы выбранных папок.

Почему список стал медленно открываться после добавления отбора?

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

Итог

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

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