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

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

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

Решение для обычных форм (ОБ)

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

Шаг 1. Установка отбора по иерархии

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


// В обработчике нажатия кнопки выбора или в другом месте вызова
СтандартнаяОбработка = Ложь;
ФормаВыбора = Справочники.СтатьиЗатрат.ПолучитьФормуВыбора("ФормаВыбора", Элемент);

// Находим нужную группу (лучше использовать предопределенные или ссылки из настроек)
ГруппаТЭК = Справочники.СтатьиЗатрат.НайтиПоКоду("000000445");

// Устанавливаем отбор
ФормаВыбора.СправочникСписок.Отбор.Ссылка.ВидСравнения = ВидСравнения.ВИерархии;
ФормаВыбора.СправочникСписок.Отбор.Ссылка.Значение = ГруппаТЭК;
ФормаВыбора.СправочникСписок.Отбор.Ссылка.Использование = Истина;

ФормаВыбора.Открыть();

Шаг 2. Скрытие пустых групп и отключение иерархии

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


// Отключаем иерархический режим отображения (делаем список «плоским»)
ФормаВыбора.ЭлементыФормы.СправочникСписок.ИерархическийПросмотр = Ложь;

// Добавляем условие, чтобы сами группы не выводились в списке
ФормаВыбора.СправочникСписок.Отбор.ЭтоГруппа.Установить(Ложь);

Использование метода Установить() является более лаконичным способом настройки отбора, чем прямое обращение к свойствам ВидСравнения и Использование.

Решение для управляемых форм (УФ)

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

Способ 1. Передача параметров открытия

Это наиболее «чистый» способ, так как он не требует вмешательства в модуль самой формы выбора. Мы просто передаем структуру отбора при вызове метода ОткрытьФорму.


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

Способ 2. Использование Фиксированных настроек

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


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

Важные рекомендации и нюансы

  1. Отказ от поиска по коду: Старайтесь избегать конструкции НайтиПоКоду("000000445"). Коды могут измениться при обновлении базы или перенумерации. Правильнее использовать Предопределенные элементы (если группа создана в конфигураторе) или выносить ссылку на группу в константы или настройки пользователя.
  2. Выбор групп и элементов: Если вам нужно, чтобы группы были видны для навигации, но их нельзя было выбрать, используйте свойство ВыборГруппИЭлементов. Установите его в значение Элементы.
  3. Различие «Родитель» и «Ссылка»:
    • Отбор по полю Родитель покажет только «детей» первого уровня.
    • Отбор по полю Ссылка с видом сравнения ВИерархии покажет все вложенные элементы на любую глубину.
  4. Оптимизация: При работе с динамическими списками в управляемых формах старайтесь использовать стандартные параметры отбора. Это позволяет платформе оптимизировать SQL-запросы к базе данных и сохраняет работоспособность поиска и сортировки в списке.

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

← На главную