При программном открытии формы выбора списка документов часто возникает задача жестко ограничить отображаемые строки — например, показать электронные письма только из папки «Входящие». Однако разработчики нередко сталкиваются с ситуацией, когда код выполняется без ошибок или отладчик видит значение, но форма все равно открывается со всеми записями либо отбор вовсе не применяется. Разберем по шагам, почему это происходит и как правильно реализовать отбор как в обычных, так и в управляемых формах.
Проанализируем исходный фрагмент кода, вызвавший проблему:
ФормаВыбораПочты = Документы.ЭлектронноеПисьмо.ПолучитьФормуВыбора("ФормаСписка");
Входящие = Справочники.ГруппыПисемЭлектроннойПочты.НайтиПоНаименованию("Входящие");
ФормаВыбораПочты.Отбор.ГруппаПисем.Установить = Входящие;
В этом примере допущена грубая синтаксическая ошибка: свойству коллекции отбора пытаются присвоить значение через конструкцию Установить = Входящие. Свойство Установить не является реквизитом или полем для записи — это метод элемента отбора.
Выясним причину ошибки: в обычной форме свойство Отбор списка содержит элементы типа ЭлементОтбора. Метод Установить() принимает два основных параметра: значение отбора и признак использования. При попытке присвоить значение через знак равенства платформа не применит фильтр.
Рассмотрим правильный синтаксис вызова метода Установить():
ФормаВыбораПочты = Документы.ЭлектронноеПисьмо.ПолучитьФормуВыбора("ФормаСписка");
Входящие = Справочники.ГруппыПисемЭлектроннойПочты.НайтиПоНаименованию("Входящие");
// Первый параметр — значение, второй — флаг использования (Истина по умолчанию)
ФормаВыбораПочты.Отбор.ГруппаПисем.Установить(Входящие, Истина);
ФормаВыбораПочты.Открыть();
Если вы предпочитаете прямое обращение к свойствам элемента отбора без использования метода, можно воспользоваться альтернативным вариантом:
ФормаВыбораПочты.Отбор.ГруппаПисем.Значение = Входящие;
ФормаВыбораПочты.Отбор.ГруппаПисем.Использование = Истина;
Важная особенность типовых конфигураций: в типовых формах работы с электронной почтой в левой части экрана часто расположено дерево папок. В модуле формы в процедурах ПриОткрытии или при активизации строки дерева может быть прописан алгоритм, который автоматически считывает текущую позицию дерева и принудительно перезаписывает Отбор.ГруппаПисем. Если отбор после открытия все равно сбрасывается, проверьте код модуля открываемой формы на наличие переопределения отбора и обеспечьте программное позиционирование на нужной строке дерева каталогов.
Также помните, что метод ПолучитьФормуВыбора() ожидает передачу элемента-владельца (например, элемента формы или поля ввода) первым параметром, если необходимо, чтобы выбранное значение автоматически вернулось в вызывающий элемент:
ФормаВыбораПочты = Документы.ЭлектронноеПисьмо.ПолучитьФормуВыбора("ФормаСписка", ЭлементыФормы.ПолеПисьмо);
В управляемом интерфейсе логика работы с формами принципиально отличается: формы открываются с помощью метода ОткрытьФорму(), а данные отбора передаются через структуру параметров формы. Здесь разработчики часто совершают две распространенные ошибки:
ОткрытьФорму() ожидает, что настройки динамического списка будут переданы внутри структуры с ключом Отбор. Если передать плоскую структуру прямо в параметры вызова, платформа ее проигнорирует."Входящие") в поле отбора, имеющее ссылочный тип. Платформа 1С не выполняет неявный поиск по наименованию: отбор по строковому представлению приведет либо к ошибке, либо к пустому результату. В отбор необходимо передавать именно ссылку СправочникСсылка.ГруппыПисемЭлектроннойПочты.Посмотрим на пример корректного открытия формы с отбором на управляемых формах:
// Сначала получаем ссылку на нужную группу
Входящие = Справочники.ГруппыПисемЭлектроннойПочты.НайтиПоНаименованию("Входящие");
// Формируем структуру отбора со ссылочным значением
ОтборСписка = Новый Структура("ГруппаПисем", Входящие);
// Вкладываем отбор в общую структуру параметров формы
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Отбор", ОтборСписка);
// Открываем форму выбора, передавая элемент-владелец третьим параметром
ОткрытьФорму("Документ.ЭлектронноеПисьмо.ФормаВыбора", ПараметрыФормы, Элементы.ПолеВводаПисьма);
Рассмотрим подробнее нюансы, из-за которых переданный через параметры отбор может не отобразить ожидаемый результат:
Отбор, попадает в пользовательские настройки динамического списка. Если у пользователя ранее были сохранены собственные настройки для этой формы, платформа может восстановить их при открытии и затереть программный фильтр. Чтобы задать жесткий, неизменяемый фильтр, его следует устанавливать в процедуре ПриСозданииНаСервере открываемой формы через коллекцию Список.ФиксированныеНастройки.Отбор.Равно. Если группа «Входящие» содержит подпапки, документы из вложенных папок не попадут в список. Для выборки всех вложенных элементов требуется настраивать динамический список с видом сравнения ВидСравненияКомпоновкиДанных.ВИерархии.Альтернативный вариант без кода: если выбор документа осуществляется в поле ввода на форме, отбор можно настроить декларативно в конфигураторе. Для этого достаточно открыть свойства реквизита или элемента формы и настроить свойство Параметры выбора, указав требуемое значение отбора без написания программного кода.