Как установить отбор в динамическом списке на управляемой форме когда он отображается в виде дерева или иерархического списка?
---
Да, это уже задачка поинтересней.

У меня получилось так:
1. В дин.списке делаете запрос
```1c
    ВЫБРАТЬ
    СправочникНоменклатура.Ссылка,
    СправочникНоменклатура.Наименование
    ИЗ
    Справочник.Номенклатура КАК СправочникНоменклатура
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ (Выбрать ссылка из Справочник.Номенклатура ГДЕ Наименование В (&Ссылка)) Фильтр
    По СправочникНоменклатура.ссылка = Фильтр.Ссылка
```

2. В параметре Ссылка указываете найденную номенклатуру и всех вышестоящих по иерархии родителей

3. А для родителей я бы при ваших объемах завел кэш в виде регистра сведений с измерениями "Родитель, ВышестоящийРодитель", и заполнял/обновлял бы его при записи группы номенклатуры.

Тогда получение всех вышестоящих родителей сведется к одному запросу к этому регистру. Причем регистр будет относительно небольшой (в сравнении со справочником номенклатуры), т.к. в нем будут только группы. А вся нагрузка ляжет на событие ПриЗаписи элемента группы номенклатуры, что при грамотном кодировании не критично.

Такое решение должно работать быстро, что и требуется.

PS Было бы замечательно, если бы вы все эти подробности сразу раскрыли. Сэкономили бы своё время и время отвечающих.
---
Задать условия отбора в запросе.
---
Точно так же, как и всегда

```1c
    ЭлементОтбора = Дерево1.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Наименование");
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ЭлементОтбора.Использование = Истина;
    ЭлементОтбора.ПравоеЗначение = "Наименование1";
```
---
, (3) Пробовали?
Цитирую ИТС

7.3.1.2. Ограничения и особенности

При установке отбора в динамическом списке следует помнить, что отбор не действует на группы, если для динамического списка выбран режим отображения Иерархический список или Дерево. Под «группами» понимается элемент справочника или плана видов характеристик, у которого свойство ЭтоГруппа установлено в значение Истина.

Может есть хоть какой-то вариант?

Через параметры запроса пробовал, не работает.

```1c
    ВЫБРАТЬ
    СправочникКаталог.Код КАК Код,
    СправочникКаталог.Наименование КАК Наименование
    ИЗ
    Справочник.Каталог КАК СправочникКаталог
    ГДЕ
    СправочникКаталог.Модель = &Модель
```

```1c
    &НаСервере
    Процедура ВыборМодели(Модель)
    Каталог.Параметры.УстановитьЗначениеПараметра("Модель", Модель);
    Элементы.Каталог.Обновить();
    КонецПроцедуры
```
---
Да, я пробовал. Для элементов прекрасно работает.

Если вам не нравится, что в списке отображаются пустые группы (о чем ни слова в первом сообщении) - можете попробовать их спрятать через условное оформление
https://infostart.ru/1c/articles/413242/

```1c
    ГруппаКонструктора = Справочники.Номенклатура.НайтиПоКоду("00-00000001");

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

    ЭлементОформления = Список.УсловноеОформление.Элементы.Добавить();
    ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Видимость", Истина );
    ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Отображать",Истина );

    ОтборПоГруппе = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ОтборПоГруппе.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
    ОтборПоГруппе.ВидСравнения = ВидСравненияКомпоновкиДанных.ВИерархии;
    ОтборПоГруппе.ПравоеЗначение = ГруппаКонструктора;
```
---
Автокаталог. 350000 только групп :(
---
Да, это уже задачка поинтересней.

У меня получилось так:
1. В дин.списке делаете запрос
```1c
    ВЫБРАТЬ
    СправочникНоменклатура.Ссылка,
    СправочникНоменклатура.Наименование
    ИЗ
    Справочник.Номенклатура КАК СправочникНоменклатура
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ (Выбрать ссылка из Справочник.Номенклатура ГДЕ Наименование В (&Ссылка)) Фильтр
    По СправочникНоменклатура.ссылка = Фильтр.Ссылка
```

2. В параметре Ссылка указываете найденную номенклатуру и всех вышестоящих по иерархии родителей

3. А для родителей я бы при ваших объемах завел кэш в виде регистра сведений с измерениями "Родитель, ВышестоящийРодитель", и заполнял/обновлял бы его при записи группы номенклатуры.

Тогда получение всех вышестоящих родителей сведется к одному запросу к этому регистру. Причем регистр будет относительно небольшой (в сравнении со справочником номенклатуры), т.к. в нем будут только группы. А вся нагрузка ляжет на событие ПриЗаписи элемента группы номенклатуры, что при грамотном кодировании не критично.

Такое решение должно работать быстро, что и требуется.

PS Было бы замечательно, если бы вы все эти подробности сразу раскрыли. Сэкономили бы своё время и время отвечающих.
---
Спасибо, добрый человек!
---
Не работает. Похоже, когда у динамического списка есть основная таблица он в любом случае считывает всё дерево.
Ваше вн. соединение имело бы смысл, если бы в группах не было поля фильтрации. У меня реквизит "Модель" для групп и элементов.
Всем спасибо, сделал через дерево значений.
---
Работает, я проверил. Видимо, вы что-то неправильно делаете. С основной таблицей, ровно так , как написано выше.

Если в группах есть дополнительный фильтр - во вложенном запросе накладываете его на группы дополнительно, и всё.
---
```1c
    ВЫБРАТЬ
    СправочникКаталог.Код КАК Код,
    СправочникКаталог.Наименование КАК Наименование
    ИЗ
    Справочник.Каталог КАК СправочникКаталог
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    Каталог.Ссылка КАК Ссылка
    ИЗ
    Справочник.Каталог КАК Каталог
    ГДЕ
    Каталог.Ссылка В(&Ссылки)) КАК Фильтр
    ПО СправочникКаталог.Ссылка = Фильтр.Ссылка
```

```1c
    Процедура ВыборМодели(Модель)

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | Каталог.Ссылка КАК Ссылка
    |ИЗ
    | Справочник.Каталог КАК Каталог
    |ГДЕ
    | Каталог.Модель = &Модель";

    Запрос.УстановитьПараметр("Модель", Модель);

    Ссылки = Новый Массив;
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
    Ссылки.Добавить(Выборка.Ссылка);
    КонецЦикла;
    Каталог.Параметры.УстановитьЗначениеПараметра("Ссылки", Ссылки);
    Элементы.Каталог.Обновить();
    КонецПроцедуры
```
---
А все вышестоящие уровни кто добавлять будет?
---
"Модель" есть во всех элементах дерева, я проверил формируемый массив, он полный.
Если бы урезало дерево - это одно, а так всё равно, в дереве 5000 двигателей. Бросаем это, может таки 1С вернётся к доработке динамического списка
---
Спасибо. Это вдруг заработало!!! Тормозит, но это уже вопросы оптимизации.