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