Как программно открыть форму выбора справочника и сфокусироваться внутри группы в обычных формах 1С?

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

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

Первоначальная проблема и почему стандартный отбор не всегда работает

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

Если использовать отбор с видом сравнения ВИерархии и отключить иерархический просмотр, мы получим плоский список всех элементов. Но что, если нам нужна именно иерархическая навигация внутри целевой папки? Выясним причину такого поведения и посмотрим на пример корректного кода.

Решение 1: Использование свойства ТекущийРодитель

Для того чтобы табличное поле списка справочника открылось внутри конкретной группы, необходимо обратиться к элементам формы выбора и установить свойство ТекущийРодитель. Разберем по шагам готовый код, который решает эту задачу в обработчике события НачалоВыбора.


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

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

Особенность пустых групп (папок)

Проанализируем ситуацию: что произойдет, если папка «Спецодежда 10.10» окажется пустой? К сожалению, мы столкнемся со специфической особенностью обычных форм 1С. Если попытаться установить ТекущийРодитель на пустую группу, в которой нет ни элементов, ни подгрупп, платформе становится «не за что зацепиться» для установки фокуса на конкретную строку. Из-за этого алгоритмы позиционирования сбрасывают отображение на уровень выше, вплоть до корневого каталога справочника.

Решение 2: Запрет изменения текущего родителя

Если нам нужно не просто открыть папку, но и запретить пользователю выходить из неё на уровень выше, мы можем использовать свойство ИзменятьТекущегоРодителя. Рассмотрим подробнее этот подход.

Вместо сложного отбора мы можем установить родителя и запретить навигацию вверх:


// ... получение формы ...
ФормаВыбора.ЭлементыФормы.СправочникСписок.ТекущийРодитель = НоменклатураСпецодежда;
ФормаВыбора.ЭлементыФормы.СправочникСписок.ИзменятьТекущегоРодителя = Ложь;
ФормаВыбора.Открыть();

Важный нюанс: Установив ИзменятьТекущегоРодителя = Ложь, пользователь не сможет нажать кнопку «Уровень вверх» (или Backspace) и выйти из целевой папки. Однако, в некоторых версиях платформы (например, в 8.2) этот запрет может заблокировать и попытку «провалиться» в подпапки внутри целевой папки. Если вам обязательно нужна навигация по подпапкам, безопаснее использовать комбинацию свойства ТекущийРодитель и отбора с видом сравнения ВИерархии.

Решение 3: Использование плоского списка (без иерархии)

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

  1. Устанавливаем отбор с видом ВИерархии по нужной папке.
  2. Отключаем иерархический просмотр в списке элементов формы.

ФормаВыбора.Отбор.Ссылка.ВидСравнения = ВидСравнения.ВИерархии;
ФормаВыбора.Отбор.Ссылка.Значение = НоменклатураСпецодежда;
ФормаВыбора.Отбор.Ссылка.Использование = Истина;

ФормаВыбора.ЭлементыФормы.СправочникСписок.ИерархическийПросмотр = Ложь;

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

Дополнительные рекомендации

Помните, что частая проблема при программном открытии форм выбора — это стандартные механизмы сохранения пользовательских настроек (особенно в типовых конфигурациях вроде УТ 10.3 или УПП). Система может восстановить предыдущие настройки отбора пользователя или его предыдущее позиционирование. Чтобы ваш код всегда отрабатывал корректно, иногда требуется программно очищать сохраненные настройки для конкретной формы перед её открытием в обработчиках событий самой формы.

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

← На главную