Отбор в дереве динамического списка

1. mkosirev 31.10.20 15:32 Сейчас в теме
Как установить отбор в динамическом списке на управляемой форме когда он отображается в виде дерева или иерархического списка?
По теме из базы знаний
Найденные решения
7. tetraren 37 02.11.20 20:39 Сейчас в теме
Да, это уже задачка поинтересней.

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


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

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

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

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

PS Было бы замечательно, если бы вы все эти подробности сразу раскрыли. Сэкономили бы своё время и время отвечающих.
tiltED; noxpina79; YLioY; Slypower; +4 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. alxarz 32 31.10.20 20:29 Сейчас в теме
(1) Задать условия отбора в запросе.
3. tetraren 37 31.10.20 23:54 Сейчас в теме
Точно так же, как и всегда

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

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

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


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

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

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

&НаСервере
Процедура ВыборМодели(Модель)
	Каталог.Параметры.УстановитьЗначениеПараметра("Модель",  Модель);
	Элементы.Каталог.Обновить();
КонецПроцедуры
5. tetraren 37 01.11.20 17:13 Сейчас в теме
(4) Да, я пробовал. Для элементов прекрасно работает.

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

    ГруппаКонструктора = Справочники.Номенклатура.НайтиПоКоду("00-00000001");
    
    ЭлементОформления = Список.УсловноеОформление.Элементы.Добавить();
    ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);
    
    ЭлементОформления = Список.УсловноеОформление.Элементы.Добавить();
    ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Видимость", Истина );
    ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Отображать",Истина );
    
    ОтборПоГруппе = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ОтборПоГруппе.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
    ОтборПоГруппе.ВидСравнения = ВидСравненияКомпоновкиДанных.ВИерархии;
    ОтборПоГруппе.ПравоеЗначение = ГруппаКонструктора;
Показать
6. mkosirev 02.11.20 09:30 Сейчас в теме
(5) Автокаталог. 350000 только групп :(
7. tetraren 37 02.11.20 20:39 Сейчас в теме
Да, это уже задачка поинтересней.

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


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

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

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

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

PS Было бы замечательно, если бы вы все эти подробности сразу раскрыли. Сэкономили бы своё время и время отвечающих.
tiltED; noxpina79; YLioY; Slypower; +4 Ответить
14. noxpina79 01.04.24 07:44 Сейчас в теме
Спасибо, добрый человек!
8. mkosirev 03.11.20 11:24 Сейчас в теме
(7) Не работает. Похоже, когда у динамического списка есть основная таблица он в любом случае считывает всё дерево.
Ваше вн. соединение имело бы смысл, если бы в группах не было поля фильтрации. У меня реквизит "Модель" для групп и элементов.
Всем спасибо, сделал через дерево значений.
9. tetraren 37 03.11.20 12:14 Сейчас в теме
(8) Работает, я проверил. Видимо, вы что-то неправильно делаете. С основной таблицей, ровно так , как написано выше.

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

Процедура ВыборМодели(Модель)
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	Каталог.Ссылка КАК Ссылка
		|ИЗ
		|	Справочник.Каталог КАК Каталог
		|ГДЕ
		|	Каталог.Модель = &Модель";
	
	Запрос.УстановитьПараметр("Модель", Модель);
	
	Ссылки = Новый Массив;
	Выборка = Запрос.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл
		Ссылки.Добавить(Выборка.Ссылка);
	КонецЦикла;
	Каталог.Параметры.УстановитьЗначениеПараметра("Ссылки",  Ссылки);
	Элементы.Каталог.Обновить();
КонецПроцедуры
Показать
11. tetraren 37 03.11.20 12:27 Сейчас в теме
(10) А все вышестоящие уровни кто добавлять будет?
12. mkosirev 03.11.20 12:30 Сейчас в теме
(11) "Модель" есть во всех элементах дерева, я проверил формируемый массив, он полный.
Если бы урезало дерево - это одно, а так всё равно, в дереве 5000 двигателей. Бросаем это, может таки 1С вернётся к доработке динамического списка
13. mkosirev 04.11.20 09:39 Сейчас в теме
(9) Спасибо. Это вдруг заработало!!! Тормозит, но это уже вопросы оптимизации.
tetraren; +1 Ответить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот