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

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

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

Разберем основную проблему: Родитель или Ссылка?

Проанализируем типичную ошибку. Когда мы устанавливаем отбор Родитель Равно [НужнаяГруппа], система выводит только те элементы, чей непосредственный владелец — указанная папка. Однако, если внутри этой папки есть другие подпапки, их содержимое не отобразится. Кроме того, в управляемых формах работа ведется через Динамический список, где коллекция отборов устроена сложнее, чем в обычных формах.

Для решения задачи "показать все внутри группы" правильно использовать вид сравнения ВИерархии. Рассмотрим основные способы реализации этого механизма.

Способ 1: Открытие формы с передачей параметров (Управляемые формы)

Самый простой и эффективный метод в современных конфигурациях — передача структуры отбора непосредственно при вызове формы. Это позволяет избежать написания лишнего кода внутри самой формы списка.

Рассмотрим пример кода:


ПараметрыОтбора = Новый Структура;
// Используем "Ссылка", чтобы отбор работал по иерархии
ПараметрыОтбора.Вставить("Родитель", ПредопределенноеЗначение("Справочник.Договоры.Арендодатели"));

ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Отбор", ПараметрыОтбора);

ОткрытьФорму("Справочник.Договоры.ФормаСписка", ПараметрыФормы);

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

Способ 2: Программная установка отбора в Динамическом списке

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

Проанализируем шаги установки отбора:

  1. Находим или создаем элемент отбора для поля Ссылка (именно ссылка позволяет искать по всей иерархии вниз).
  2. Устанавливаем вид сравнения ВидСравненияКомпоновкиДанных.ВИерархии.
  3. Присваиваем значение нашей группы.
  4. Активируем использование отбора.

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


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

КонецПроцедуры

Обратите внимание на РежимОтображения. Установив его в значение Недоступный, мы гарантируем, что пользователь случайно не отключит этот критически важный для логики приложения отбор.

Способ 3: Использование функций БСП

Если ваша конфигурация разработана на базе Библиотеки стандартных подсистем (БСП), задача упрощается в разы. Разработчики библиотеки уже создали универсальные механизмы для работы с динамическими списками.

Проанализируем ситуацию: нам нужно установить отбор, не заботясь о ручном переборе коллекции элементов. В этом нам поможет метод ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка.

Пример использования:


ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
    Список, 
    "Ссылка", 
    ГруппаАрендодатели, 
    ВидСравненияКомпоновкиДанных.ВИерархии
);

Этот метод самостоятельно проверит, есть ли уже такой отбор в списке Список, обновит его или создаст новый. Это стандарт "чистого кода" в современной разработке на платформе 1С.

Важные нюансы и частые ошибки

Рассмотрим несколько моментов, которые часто упускают из виду:

  1. Правильное именование объектов. Как было замечено в обсуждении, ошибка в имени справочника (например, Договора вместо Договоры) или неверное обращение к предопределенному элементу приведет к тому, что отбор просто не сработает, так как значение будет Неопределено. Всегда проверяйте написание имен метаданных.
  2. Режим просмотра. Если в справочнике включен режим "Дерево", установка отбора может выглядеть странно: пользователь увидит пустые ветки или только корень. При программной установке жесткого отбора рекомендуется принудительно устанавливать режим просмотра Список.
  3. Обычные формы (толстый клиент). В устаревших конфигурациях (на обычных формах) объект СправочникСписок имеет другую структуру отбора. Там код будет выглядеть иначе:
    
    СправочникСписок.Отбор.Родитель.ВидСравнения = ВидСравнения.ВИерархии;
    СправочникСписок.Отбор.Родитель.Значение = ГруппаСсылка;
    СправочникСписок.Отбор.Родитель.Использование = Истина;
    

Заключение

Мы проанализировали различные подходы к установке отбора по группе. Подведем итог: для большинства современных задач оптимальным решением является использование отбора по полю Ссылка с видом сравнения ВИерархии через параметры открытия формы или функции БСП. Это обеспечивает корректное отображение данных на всех уровнях вложенности и стабильную работу интерфейса.

← На главную