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

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

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

Метод 1. Использование параметра ТекущаяСтрока

Проанализируем самый простой и эффективный способ, который предоставляет платформа 1С. Если наша цель — не скрыть остальные элементы, а просто подсказать системе, на какой папке нужно сфокусироваться при открытии, мы будем использовать параметр ТекущаяСтрока (полезно изучить Недокументированное использование стандартных форм). Этот параметр передается в структуру параметров при вызове функции ОткрытьФорму.

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


&НаСервере
Функция НайтиСсылкуНаПапку(КодПапки)
    Возврат Справочники.Номенклатура.НайтиПоКоду(КодПапки);
КонецФункции

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

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

Метод 2. Ограничение выбора через параметр Отбор

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

Посмотрим на пример реализации такого отбора:


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

Выясним причину, почему этот метод часто не подходит. Если структура справочника сложная (например, «Монтажи» -> «Внутренние монтажи» -> «Расходные материалы»), то, установив отбор по родителю «Монтажи», мы не увидим расходные материалы, так как их непосредственным родителем является папка «Внутренние монтажи». В этом случае нам поможет фильтрация по иерархии.

Метод 3. Фильтрация В иерархии через ФиксированныеНастройки

Для того чтобы показать всю ветку справочника целиком, включая все вложенные уровни, обычного Отбора через структуру недостаточно. Нам потребуется работа с механизмом компоновки данных, который управляет динамическим списком в форме выбора (рекомендуем Методы доработки динамических списков из моей практики [март 2026]). Мы можем передать параметр ФиксированныеНастройки.

Разберем по шагам, как это сделать:

  1. Создадим на сервере объект НастройкиКомпоновкиДанных.
  2. Добавим элемент отбора с видом сравнения ВидСравненияКомпоновкиДанных.ВИерархии.
  3. Передадим эти настройки в параметры открытия формы.

Проанализируем пример кода:


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

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

Этот способ является наиболее мощным, так как он жестко ограничивает область видимости пользователя выбранной веткой и всеми её дочерними элементами.

Метод 4. Прямое управление формой после получения

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

Рассмотрим подробнее этот сценарий:


&НаКлиенте
Процедура ОткрытьИУстановитьСтроку(Команда)
    // 1. Получаем форму, но пока не открываем её
    ФормаВыбора = ПолучитьФорму("Справочник.Номенклатура.ФормаВыбора", , Элементы.Товары);
    
    // 2. Устанавливаем текущую строку в основном списке формы
    // Список - это стандартное имя реквизита динамического списка в форме выбора
    ФормаВыбора.Элементы.Список.ТекущаяСтрока = НужнаяСсылкаНаПапку;
    
    // 3. Теперь открываем настроенную форму
    ФормаВыбора.Открыть();
КонецПроцедуры

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

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

При реализации подбора обратите внимание на следующие моменты:

Подводя итог, мы видим, что наиболее универсальным и «чистым» решением является передача ссылки в параметр ТекущаяСтрока. Если же требуется строгое ограничение области выбора, то использование ФиксированныхНастроек с видом сравнения ВИерархии обеспечит наилучший результат.

← На главную