Как на управляемой форме ограничить выбор элементов справочника только верхним уровнем?

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

При разработке интерфейсов на управляемых формах 1С часто возникает задача: предоставить пользователю возможность выбора элементов иерархического справочника, находящихся строго в корне (на верхнем уровне иерархии), исключив выбор групп или вложенных подчиненных элементов. Дополнительно нередко требуется обеспечить выбор не одного, а сразу нескольких значений. Разберем по шагам, почему стандартные попытки заполнить список выбора вручную могут не работать, как правильно использовать штатные механизмы платформы и как настроить множественный выбор корневых элементов.

Анализ типичных ошибок при ручном формировании списка

Проанализируем частые ошибки, с которыми сталкиваются разработчики при попытке решить задачу «в лоб» через заполнение выпадающего списка:

  1. Произвольный тип реквизита формы: Если у реквизита формы не задан точный ссылочный тип, платформа теряет связь с метаданными объекта. В результате перестают штатно отрабатывать механизмы автоподбора, проверка типов, контекстные подсказки и трансляция отборов в стандартную форму выбора.
  2. Ошибочное заполнение коллекции списка выбора: При программном заполнении списка по результатам запроса разработчики иногда передают в метод Добавить сам объект СписокЗначений вместо конкретных элементов выборки. В коде это выглядит так: Элементы.ПолеВвода.СписокВыбора.Добавить(СписокВыб);. В таком случае в выпадающий список помещается одна пустая строка, содержащая внутри себя другую коллекцию, что делает выбор невозможным.
  3. Ограничение стандартного поля: Одиночное ссылочное поле не может хранить массив ссылок. Если требуется множественный выбор, тип реквизита формы должен быть явно задан как СписокЗначений.

Способ 1. Использование механизма «Параметры выбора» поля ввода

Рассмотрим наиболее простое, чистое и производительное решение, не требующее написания сложных запросов или переопределения стандартных форм выбора. Платформа 1С предоставляет встроенное свойство поля ввода — Параметры выбора.

Корневой элемент справочника всегда характеризуется тем, что его реквизит Родитель не заполнен, то есть равен пустой ссылке данного справочника.

Настроить такой отбор можно двумя путями:

Вариант А: Интерактивная настройка в конфигураторе

  1. Открываем свойства поля ввода на управляемой форме.
  2. Находим свойство Параметры выбора (Choice parameters) и открываем окно настройки.
  3. Добавляем строку: в колонке «Имя» указываем Отбор.Родитель, а в колонке «Значение» выбираем пустую ссылку нужного справочника.

Вариант Б: Программная установка в событии ПриСозданииНаСервере

Посмотрим на пример программной установки параметров выбора. Важно помнить, что свойство ПараметрыВыбора принимает строго объект типа ФиксированныйМассив, элементами которого являются объекты ПараметрВыбора:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    МассивПараметров = Новый Массив;
    МассивПараметров.Добавить(Новый ПараметрВыбора("Отбор.Родитель", ПредопределенноеЗначение("Справочник.МойСправочник.ПустаяСсылка")));
    
    Элементы.ИмяПоляВвода.ПараметрыВыбора = Новый ФиксированныйМассив(МассивПараметров);
    
КонецПроцедуры

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

Способ 2. Реализация множественного выбора корневых элементов

Разберем ситуацию, когда пользователю необходимо выбрать сразу несколько элементов верхнего уровня. Для этого свяжем поле ввода с реквизитом формы, имеющим тип СписокЗначений, и переопределим события выбора.

В модуле формы переопределим обработчик события поля ввода НачалоВыбора:


&НаКлиенте
Процедура ПолеВводаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    ПараметрыОткрытия = Новый Структура;
    ПараметрыОткрытия.Вставить("МножественныйВыбор", Истина);
    ПараметрыОткрытия.Вставить("Отбор", Новый Структура("Родитель", ПредопределенноеЗначение("Справочник.МойСправочник.ПустаяСсылка")));
    
    ОткрытьФорму("Справочник.МойСправочник.ФормаВыбора", ПараметрыОткрытия, Элемент);
    
КонецПроцедуры

Затем обработаем результат выбора в событии поля ОбработкаВыбора. При множественном выборе платформенный механизм возвращает массив выбранных ссылок:


&НаКлиенте
Процедура ПолеВводаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
    
    Если ТипЗнч(ВыбранноеЗначение) = Тип("Массив") Тогда
        // Заполняем реквизит формы типа СписокЗначений
        Объект.МойСписокКорневыхЭлементов.ЗагрузитьЗначения(ВыбранноеЗначение);
    КонецЕсли;
    
КонецПроцедуры

Способ 3. Переопределение динамического списка в форме выбора

Если справочник имеет сложную иерархию (например, иерархию групп и элементов) и стандартное дерево каталогов в форме выбора мешает пользователю, проанализируем настройку самой формы выбора.

При передаче структуры отбора в форму выбора платформа накладывает условие в ФиксированныеНастройки.Отбор динамического списка. Чтобы форма выбора не отображалась как пустое дерево каталогов, рекомендуется перевести режим отображения динамического списка в плоский вид:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    Если Параметры.Свойство("Отбор") И Параметры.Отбор.Свойство("Родитель") Тогда
        // Отключаем отображение дерева, оставляем только плоский список
        Элементы.Список.РежимОтображения = РежимОтображенияСписка.Список;
    КонецЕсли;
    
КонецПроцедуры

В таком режиме пользователь увидит простой список элементов, удовлетворяющих условию, без лишних элементов навигации по папкам.

Способ 4. Глобальное ограничение ввода через модуль менеджера

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


Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
    
    Параметры.Отбор.Вставить("Родитель", Справочники.МойСправочник.ПустаяСсылка());
    
КонецПроцедуры

Такой подход гарантирует, что автоподбор по строке всегда будет исключать дочерние позиции без необходимости дублирования кода на каждой отдельной форме.

← На главную