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

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

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

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


ФормаВыбораПочты = Документы.ЭлектронноеПисьмо.ПолучитьФормуВыбора("ФормаСписка");
Входящие = Справочники.ГруппыПисемЭлектроннойПочты.НайтиПоНаименованию("Входящие");
ФормаВыбораПочты.Отбор.ГруппаПисем.Установить = Входящие;

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

Решение для обычных форм (толстый клиент)

Выясним причину ошибки: в обычной форме свойство Отбор списка содержит элементы типа ЭлементОтбора. Метод Установить() принимает два основных параметра: значение отбора и признак использования. При попытке присвоить значение через знак равенства платформа не применит фильтр.

Рассмотрим правильный синтаксис вызова метода Установить():


ФормаВыбораПочты = Документы.ЭлектронноеПисьмо.ПолучитьФормуВыбора("ФормаСписка");
Входящие = Справочники.ГруппыПисемЭлектроннойПочты.НайтиПоНаименованию("Входящие");

// Первый параметр — значение, второй — флаг использования (Истина по умолчанию)
ФормаВыбораПочты.Отбор.ГруппаПисем.Установить(Входящие, Истина);
ФормаВыбораПочты.Открыть();

Если вы предпочитаете прямое обращение к свойствам элемента отбора без использования метода, можно воспользоваться альтернативным вариантом:


ФормаВыбораПочты.Отбор.ГруппаПисем.Значение = Входящие;
ФормаВыбораПочты.Отбор.ГруппаПисем.Использование = Истина;

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

Также помните, что метод ПолучитьФормуВыбора() ожидает передачу элемента-владельца (например, элемента формы или поля ввода) первым параметром, если необходимо, чтобы выбранное значение автоматически вернулось в вызывающий элемент:


ФормаВыбораПочты = Документы.ЭлектронноеПисьмо.ПолучитьФормуВыбора("ФормаСписка", ЭлементыФормы.ПолеПисьмо);

Решение для управляемых форм (динамические списки)

В управляемом интерфейсе логика работы с формами принципиально отличается: формы открываются с помощью метода ОткрытьФорму(), а данные отбора передаются через структуру параметров формы. Здесь разработчики часто совершают две распространенные ошибки:

  1. Передача неверной структуры параметров. Метод ОткрытьФорму() ожидает, что настройки динамического списка будут переданы внутри структуры с ключом Отбор. Если передать плоскую структуру прямо в параметры вызова, платформа ее проигнорирует.
  2. Несоответствие типов данных. Нельзя передавать текстовую строку (например, "Входящие") в поле отбора, имеющее ссылочный тип. Платформа 1С не выполняет неявный поиск по наименованию: отбор по строковому представлению приведет либо к ошибке, либо к пустому результату. В отбор необходимо передавать именно ссылку СправочникСсылка.ГруппыПисемЭлектроннойПочты.

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


// Сначала получаем ссылку на нужную группу
Входящие = Справочники.ГруппыПисемЭлектроннойПочты.НайтиПоНаименованию("Входящие");

// Формируем структуру отбора со ссылочным значением
ОтборСписка = Новый Структура("ГруппаПисем", Входящие);

// Вкладываем отбор в общую структуру параметров формы
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Отбор", ОтборСписка);

// Открываем форму выбора, передавая элемент-владелец третьим параметром
ОткрытьФорму("Документ.ЭлектронноеПисьмо.ФормаВыбора", ПараметрыФормы, Элементы.ПолеВводаПисьма);

Почему отбор может не срабатывать на управляемых формах?

Рассмотрим подробнее нюансы, из-за которых переданный через параметры отбор может не отобразить ожидаемый результат:

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

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

← На главную