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