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

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

При разработке интерфейсов на управляемых формах 1С часто возникает задача ограничить выбор элементов справочника конкретной группой (папкой). Например, при заполнении документа «Путевой лист» в поле выбора водителя должны отображаться только физические лица из папки «Водители», а вся остальная иерархия справочника должна быть скрыта от пользователя.

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

Выясняем причину: ловушка иерархического просмотра

Проанализируем, почему стандартный отбор вида Ссылка В ИЕРАРХИИ &Родитель или Родитель = &Родитель в динамическом списке формы выбора часто возвращает пустой экран. Дело в том, что для иерархических справочников в форме выбора по умолчанию включен режим просмотра «Иерархический список» или «Дерево».

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

Рассмотрим по шагам четыре практических способа реализации этой задачи.

Способ 1. Программное открытие формы с фиксированными настройками и плоским списком (Рекомендуемый)

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

Для реализации этого способа откроем форму документа, найдем элемент формы, в котором выбирается водитель (например, реквизит табличной части Водитель), и создадим для него обработчик события НачалоВыбора.

Пропишем следующий код в модуле формы документа:


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

&НаСервереБезКонтекста
Функция ПолучитьГруппуВодителиНаСервере()
    // Выполняем поиск группы. В реальных задачах надежнее использовать предопределенные элементы или константы БСП
    Возврат Справочники.ФизическиеЛица.НайтиПоНаименованию("Водители", Истина);
КонецФункции

Использование свойства ФиксированныеНастройки гарантирует, что установленный нами отбор будет применен «намертво». Пользователь не сможет отключить или сбросить его через стандартное меню настроек формы выбора.

Способ 2. Настройка «Параметров выбора» в метаданных (Без написания кода)

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

Выполним настройку по шагам:

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

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

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

Для реализации этого сценария выполним следующие действия:

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

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

Способ 4. Перехват ввода и генерация быстрого списка («ДанныеВыбора»)

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

Рассмотрим пример реализации обработчика события АвтоПодбор у поля ввода на форме:


&НаКлиенте
Процедура ВодительАвтоПодбор(Элемент, Текст, ДанныеВыбора, Параметры, СтандартнаяОбработка)
    
    // Отменяем стандартный поиск платформы
    СтандартнаяОбработка = Ложь;
    
    // Заполняем список выбора вручную через запрос
    ПолучитьСписокВодителейДляПодбора(Текст, ДанныеВыбора);
    
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ПолучитьСписокВодителейДляПодбора(СтрокаПоиска, ДанныеВыбора)
    
    СписокЭлементов = Новый СписокЗначений;
    
    ГруппаВодители = Справочники.ФизическиеЛица.НайтиПоНаименованию("Водители", Истина);
    Если Не ЗначениеЗаполнено(ГруппаВодители) Тогда
        ДанныеВыбора = СписокЭлементов;
        Возврат;
    КонецЕсли;
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ РАЗРЕШЕННЫЕ
        |	ФизическиеЛица.Ссылка КАК Ссылка,
        |	ФизическиеЛица.Наименование КАК Наименование
        |ИЗ
        |	Справочник.ФизическиеЛица КАК ФизическиеЛица
        |ГДЕ
        |	ФизическиеЛица.Ссылка В ИЕРАРХИИ(&ГруппаВодители)
        |	И ФизическиеЛица.ЭтоГруппа = ЛОЖЬ
        |	И ФизическиеЛица.Наименование ПОДОБНО &СтрокаПоиска";
        
    Запрос.УстановитьПараметр("ГруппаВодители", ГруппаВодители);
    // Добавляем спецсимволы для поиска по подстроке
    Запрос.УстановитьПараметр("СтрокаПоиска", "%" + СтрокаПоиска + "%"); 
    
    РезультатЗапроса = Запрос.Выполнить();
    Если Не РезультатЗапроса.Пустой() Тогда
        Выборка = РезультатЗапроса.Выбрать();
        Пока Выборка.Следующий() Цикл
            СписокЭлементов.Добавить(Выборка.Ссылка, Выборка.Наименование);
        КонецЦикла;
    КонецЕсли;
    
    ДанныеВыбора = СписокЭлементов;
    
КонецПроцедуры

Этот способ обеспечивает мгновенный отклик интерфейса. Пользователю не придется открывать форму выбора и блуждать по папкам — достаточно начать вводить первые буквы фамилии водителя прямо в поле ввода документа.

Подведем итоги

Мы подробно проанализировали особенности работы с иерархическими структурами в управляемых формах 1С 8.3. На практике выбор конкретного метода зависит от архитектуры вашей базы данных:

← На главную