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