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

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

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

Разбираем, как программно установить отбор в динамическом списке и форме 1С: ЭлементыОтбора, ОтборКомпоновкиДанных, работа с параметрами, примеры кода и типичные ошибки.

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

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

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

Где именно устанавливать отбор: динамический список или компоновщик настроек

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

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

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

Список.Отбор (ЭлементыОтбора)

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

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

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

Параметры формы с ключом Отбор

Стандартный способ при открытии формы списка из другой формы. Платформа сама применяет отбор к списку.

Установка отбора через ЭлементыОтбора динамического списка

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

&НаСервере

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаСервере

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

Отборы = Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор;

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

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

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

ЭлементОтбора.ПравоеЗначение = Ложь;

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

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

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

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

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

&НаКлиенте

Процедура ПоказатьЗаказыКлиента(Команда)

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

Отбор = Новый Структура;

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

ПараметрыФормы.Вставить("Отбор", Отбор);

ОткрытьФорму("Документ.ЗаказКлиента.ФормаСписка", ПараметрыФормы);

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

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

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

Если форма открывается с параметром Отбор, а список показывает все записи, первым делом сравните имя ключа структуры с именем поля в запросе динамического списка. Несовпадение хотя бы в одном символе (например, «Владелец» вместо «Контрагент») приводит к тому, что платформа игнорирует отбор без какого-либо сообщения об ошибке.
ПЗ
Практическое замечание

Отборы в обычных формах и у табличных частей

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

ЭлементОтбора = Список.Отбор.Найти("Организация");

Если ЭлементОтбора = Неопределено Тогда

ЭлементОтбора = Список.Отбор.Добавить("Организация");

КонецЕсли;

ЭлементОтбора.ВидСравнения = ВидСравнения.Равно;

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

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

В управляемых формах отдельный случай — отбор строк табличной части или динамического списка, выведенного как подчинённый. Для табличной части документа программный отбор строк выполняется через Элементы.ТабличнаяЧасть.ОтборСтрок = Новый ФиксированнаяСтруктура("Склад", Склад). Это полезно, когда на одной форме нужно показать только часть строк по условию.

Как проверить, что отбор применился

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

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

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

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

Содержимое списка после открытия формы
Норма

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

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

Видны все записи — отбор не применён или сброшен настройками

Поведение при обновлении списка
Норма

Отбор сохраняется после F5 и повторного открытия формы

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

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

Панель настроек списка
Норма

Отбор виден/скрыт в соответствии с заданным РежимОтображения

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

Пользовательский отбор перекрывает программный элементом с тем же полем

Типичные ошибки и ограничения

Чаще всего отбор «не работает» по трём причинам. Первая — несовпадение имени поля: в ЛевоеЗначение указано поле, которого нет в запросе динамического списка, или указано с опечаткой. Вторая — забыто свойство Использование = Истина: элемент создан, но не включён. Третья — код размещён в клиентском обработчике, тогда как отбор динамического списка корректно менять на сервере в ПриСозданииНаСервере.

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

Учитывайте и производительность: отбор по неиндексированному полю или по полю через точку (например, «Контрагент.Регион») на больших таблицах может заметно замедлить открытие формы. Если список тормозит, проверьте план запроса и по возможности отбирайте по индексированным реквизитам.

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

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

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

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

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

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

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

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

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

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

Можно ли установить отбор в форме выбора при подборе в документ?

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

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

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

Итог

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

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