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