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

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

При разработке интерфейсов в 1С часто возникает задача упростить работу пользователя, минимизировав количество кликов. Одной из таких задач является автоматический переход в нужную группу (папку) справочника при выборе значения в документе. Например, если пользователь выбирает материал в поле "Канцтовары", логично сразу открыть справочник на соответствующей группе, а не заставлять человека искать её в корне дерева. Рассмотрим, как это реализовать для обычных и управляемых форм.

Проблема позиционирования в обычных формах

В обычных формах (платформа 8.2 или 8.3 в режиме совместимости) стандартное поведение системы при открытии формы выбора — это позиционирование на уже выбранном элементе или открытие корня справочника. Простое использование НачальноеЗначениеВыбора не всегда решает задачу, если нам нужно не просто выделить элемент, а именно "войти" в конкретную папку. Проанализируем ситуацию, описанную в теме: автор пытался использовать НайтиПоКоду и НачальноеЗначениеВыбора, но курсор лишь устанавливался на группу, не открывая её содержимое.

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

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

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

Разберем по шагам правильный алгоритм в обработчике НачалоВыбора:

  1. Отключаем стандартную обработку события, чтобы система не открывала форму выбора самостоятельно.
  2. Получаем форму выбора программно.
  3. Находим нужную группу (по коду, наименованию или через предопределенные элементы).
  4. Устанавливаем свойство ТекущийРодитель для списка.
  5. Открываем форму.

Рассмотрим пример кода, который решает эту задачу:


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

Метод через НачальноеЗначениеВыбора

Существует и более простой, но "хитрый" способ. Если в НачальноеЗначениеВыбора передать не саму группу, а любой элемент, находящийся внутри этой группы, система автоматически откроет форму именно в этой папке, чтобы показать данный элемент. Этот метод сработал у автора темы, хотя он и имеет свои недостатки (нужно гарантировать наличие хотя бы одного элемента в папке).

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

Использование предопределенных элементов вместо поиска по коду

Важно помнить о правилах хорошего тона в разработке 1С. Поиск группы по строковому коду НайтиПоКоду("000027") — это потенциально опасный участок кода. Если пользователь в режиме "1С:Предприятие" изменит код группы или случайно удалит её и создаст новую с другим кодом, логика программы сломается.

Рекомендуется:

Особенности реализации в Управляемых формах (8.3)

Если вы работаете в современном интерфейсе "Такси" на управляемых формах, подход к решению задачи будет иным. В управляемом приложении мы стараемся меньше писать кода в обработчиках событий и больше использовать свойства метаданных.

Рассмотрим два варианта для управляемых форм:

1. Параметры выбора (без программирования)

В конфигураторе откройте свойства реквизита документа (например, "Материал"). Найдите пункт Параметры выбора. Там можно добавить условие: Отбор.Родитель(ВашаНужнаяГруппа). В этом случае пользователь при открытии справочника увидит только элементы этой группы без возможности выйти выше (если не настроено иначе).

2. Программное открытие через Параметры

Если нужно именно позиционирование (возможность видеть другие группы, но открыться в конкретной), используйте структуру параметров при вызове ОткрытьФорму. В управляемых формах за это отвечают параметры ТекущийУзел или ЗначениеКопирования.

Рассмотрим пример кода для управляемой формы:


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

Жесткое ограничение через Отбор

Иногда задача стоит иначе: не просто "зайти" в папку, а запретить пользователю выбирать что-либо за её пределами. В обычных формах это реализуется через объект Отбор. Посмотрим, как это выглядит в коде:


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

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

Подводя итог, выбор метода зависит от версии платформы и бизнес-задачи. Для старых конфигураций на обычных формах используйте прямое управление ТекущийРодитель, а для современных систем на управляемых формах — механизмы параметров выбора и отборов в свойствах реквизитов.

← На главную