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