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