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