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

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

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

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

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

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

Ниже разобраны все три подхода с примерами кода, указаны ограничения каждого способа и типичные ошибки, из-за которых отбор «не срабатывает» или пропадает после перезапуска.

Способы добавления отбора: что выбрать под задачу

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

Сравнение способов

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

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

Программный отбор в модуле формы

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

Передача отбора через параметры

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

Отбор без кода: настройка списка пользователем

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

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

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

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

Программный отбор в модуле формы

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

Типовой пример — отбор документов по организации, хранящейся в параметре сеанса или функциональной опции:

&НаСервере

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

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

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

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

ЭлементОтбора.ПравоеЗначение = ПараметрыСеанса.ТекущаяОрганизация;

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

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

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

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

Если нужно объединить несколько условий по «ИЛИ», добавьте группу элементов отбора типа ГруппаЭлементовОтбораКомпоновкиДанных с типом группы «ГруппаИли» и поместите условия внутрь неё. По умолчанию элементы на верхнем уровне объединяются по «И».

Отбор при открытии формы через параметры

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

&НаКлиенте

Процедура ПоказатьДокументыКонтрагента(Команда)

ПараметрыФормы = Новый Структура;

ПараметрыФормы.Вставить("Отбор", Новый Структура("Контрагент", ТекущийКонтрагент));

ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаСписка", ПараметрыФормы);

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

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

Тот же приём работает и в обычных формах (для старых конфигураций на обычном приложении), но там отбор устанавливается через свойство Отбор объекта списка с другим синтаксисом — через Список.Отбор.ИмяПоля.Установить(Значение).

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

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

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

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

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

Типичные ошибки
01
Установка отбора на клиенте вместо сервера: динамический список изменяется только на сервере, код в клиентском обработчике не сработает
02
Опечатка в имени поля отбора: отбор молча не применяется или вызывает ошибку компоновки
03
Отбор добавлен, но пользовательская настройка списка перекрывает его: старые настройки пользователя могут конфликтовать с программным отбором
04
Забыт режим отображения: пользователь отключает обязательный отбор через «Настроить список» и видит лишние данные
05
Установка отбора в ПриОткрытии вместо ПриСозданииНаСервере: список уже сформирован, отбор применяется с задержкой или не применяется

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

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

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

Содержимое списка
Норма

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

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

Список не изменился или пропали нужные записи

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

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

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

После перезапуска отбор пропал

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

Обязательный отбор недоступен для отключения

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

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

FAQ

Как добавить отбор по периоду на форму списка документов?

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

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

Чаще всего отбор установлен в клиентском обработчике или перезаписывается пользовательскими настройками. Устанавливайте отбор в ПриСозданииНаСервере и задайте режим отображения «Недоступный», чтобы он не попадал в пользовательские настройки.

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

Да. Используйте вид сравнения «ВСписке» и передайте в ПравоеЗначение список значений или массив. Альтернатива — группа отборов с типом «ГруппаИли» и отдельным условием «Равно» на каждое значение.

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

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

Чем отличается отбор в динамическом списке от отбора в запросе?

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

Работает ли параметр «Отбор» при открытии формы выбора?

Да, формы выбора поддерживают тот же параметр «Отбор» со структурой. Это стандартный способ ограничить выбор, например, показать только договоры конкретного контрагента при подборе в документ.

Итог

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

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