Выбор родителя верхнего уровня

1. FUXEARA 11.06.24 10:47 Сейчас в теме
Доброго всем.
Возникла вот такая ситуация.
Имеется иерархический справочник Партнеры с иерархией элементов и в разделе Выбрать запроса, нужно реализовать следующее:

"ВЫБРАТЬ
|ВЫБОР 
|      КОГДА ПродажиОбороты.АналитикаУчетаПоПартнерам.Партнер.Родитель = ЗНАЧЕНИЕ(Справочник.Партнеры.ПустаяСсылка)
|            ТОГДА ПродажиОбороты.АналитикаУчетаПоПартнерам.Партнер
|      ИНАЧЕ ВОТ ТУТ НАДО УКАЗАТЬ САМОГО ВЕРХНЕГО РОДИТЕЛЯ , КОЛИЧЕСТВО УРОВНЕЙ НЕИЗВЕСТНО
|КОНЕЦ КАК Партнер

Показать

Есть идеи у кого-то?
По теме из базы знаний
Найденные решения
24. FUXEARA 12.06.24 16:15 Сейчас в теме
В общем кому интересно, то решил так.
Не стал изобретать всякие регистры и промежуточные таблицы значений и всякие другое, а пошел по самомму простому пути и добавил реквизит ПартнерВерхнегоУрвня в спр.Партнеры и создал процедуру которая при записи или выборе головного партнера, дает самого верхнего партнера в иерархии и уже потом в запросе проверяю на заполненность "партнер.ПартнерВерхнегоУровня".
Всем огромное спасибо за участие.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. WasiliyMay 8 11.06.24 11:51 Сейчас в теме
(1)Если не подходит вариант на ИТС, где необходимо обозначать некий предполагаемый будущий максимум, то, наверное, определять максимальное количество уровней и собирать текст запроса. Можно добавить реквизит в партнера и записывать туда родителя верхнего уровня.
3. nomad_irk 76 11.06.24 11:57 Сейчас в теме
(1)Необходимо находить родителей транзитивным замыканием, 6 пакетов запроса - 64 уровней вложенности, думаю вам этого хватит
karamazoff; +1 Ответить
16. Vinzor 102 11.06.24 13:18 Сейчас в теме
(1) Ну если иерархия элементов, то попробуйте так. (напиши метод, где на входе есть &Партнер)

Шаг 1 .
Если  НЕ ЗначениеЗаполнено(&Партнер.Родитель) тогда 
Возврат &Партнер;
КонецЕсли;

Далее шаг 2.
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Ссылка", &Партнер);
Запрос.текст = 
"ВЫБРАТЬ
|	СправочникПартнеры.Ссылка КАК Ссылка
|ИЗ
|	Справочник.СправочникПартнерыКАК СправочникПартнеры
|ГДЕ
|	СправочникПартнеры.Ссылка = &Ссылка
|ИТОГИ ПО
|	Ссылка ТОЛЬКО ИЕРАРХИЯ";

Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
Возврат Выборка.Ссылка;
Показать

Я написал по аналогии со справочником "ПодразделенияОрганизаций" в ЗУПе. Ваш справочник, судя по описанию, такой же.

Суть в чем. Запрос возвращает всю иерархию элементов, начиная с высшего.
Поэтому делаем один раз "Следующий()" и этот высший элемент получаем.

Но если в качестве параметра подать самый высший (в иерархии) элемент, то запрос вернёт пустую ссылку.
Поэтому перед запросом проверка параметра на "родителя"

Если взлетит, тогда вам надо будет соединить это с вашим запросом, тут уж вы сами
17. laperuz 46 11.06.24 16:26 Сейчас в теме
(16)В ЗУПе же эта задача как раз решается очень просто для подразделений в связи с наличием регистра "Подчинённость подразделений", из которого родитель верхнего уровня получается прямым запросом, без всяких доп.проверок, соединений и прочего
18. Vinzor 102 11.06.24 20:15 Сейчас в теме
(17) Это я знаю, и активно пользуюсь.
Но то, что описал выше, я начал применять давно в ЗУПе 2.5, где такого регистра не было и в помине.
Тут я просто идею подал, вдруг она пригодится.
4. scarl1n 11.06.24 12:05 Сейчас в теме
Зачем транзитивное замыкание..? Во временной таблице получите все элементы, у которых Родитель = ПустаяСсылка и ЭтоГруппа = Истина - это будет верхний уровень. В ИНАЧЕ выводите этот элемент, в соединении условие на В ИЕРАРХИИ.
5. nomad_irk 76 11.06.24 12:08 Сейчас в теме
(4)
в соединении условие на В ИЕРАРХИИ

Вы сами-то пробовали так делать?
Зачем транзитивное замыкание..?

Затем, что в условиях 1С по-другому тока рекурсивный запрос сможет найти родителя самого верхнего уровня
6. FUXEARA 11.06.24 12:10 Сейчас в теме
(5)вот я тоже думаю на счет реализации подобного в ИНАЧЕ.
Далее в запросе, я могу отфильтровать Партнеров в Иерархии по верхнему родителю и таблицу верхних родителей я получил, но как соединить Текущего партнера, не зная его уровень в иерархии по верхнему уровню родителя, не совсем понятно
7. nomad_irk 76 11.06.24 12:13 Сейчас в теме
(6)
но как соединить Текущего партнера, не зная его уровень в иерархии по верхнему уровню родителя, не совсем понятно

Никак, нужно знать все связи родитель-потомок
8. scarl1n 11.06.24 12:32 Сейчас в теме
(5)Нет, редко пользовался условием В ИЕРАРХИИ, поэтому забыл, что его нельзя использовать в соединении. А если также сделать временную таблицу с верхнем уровнем, а с ней соединиться условием Родитель = Ссылка ИЛИ Родитель.Родитель = Ссылка Или Родитель.Родитель.Родитель = Ссылка... Те же условные 6 раз, которые вы предлагали транзитивно замкнуть?
9. nomad_irk 76 11.06.24 12:41 Сейчас в теме
(8)6 соединений дадут декартово произведение в результате, не дадут 64 уровня вложенности и соединение таблиц - медленнее
13. scarl1n 11.06.24 13:03 Сейчас в теме
14. karamazoff 112 11.06.24 13:08 Сейчас в теме
(13)ну, мы-же разработчики, 1 этап - реализация, чтобы заработало, 2 этап оптимизация, как раз тут все ускоряем
15. scarl1n 11.06.24 13:11 Сейчас в теме
(13)Лень было уже красоту наводить) Вроде бы там можно без ВЫБОР КОГДА написать только условие + еще добавить условие на Ссылка <> РодительВерхнегоУровня (т.к он сам в своей иерархии), но это условие только для отчета с моей логикой подходит. Если у вас в таблице не может быть групп, то и без него норм.
10. karamazoff 112 11.06.24 12:45 Сейчас в теме
Это тестовое задание? нужно чтобы шашечки или чтобы ехало? Может отказаться от запроса, раз так все в него уперлось, и попробовать через Выбрать в цикле? скорость потом оценивать будем
11. FUXEARA 11.06.24 12:50 Сейчас в теме
(10) это лишь фрагмент запроса, причем практически вначале, там еще несколько подзапросов. Идет вычисление и данные передаются из запроса в запрос в виде временных таблиц. Поэтому устраивать цикл по среди запроса и далее перекидывать в запрос не оч.хочется
12. karamazoff 112 11.06.24 12:58 Сейчас в теме
(11)мне кажется, вы все сильно усложняете, через цикл не надо ни куда ничего пихать, но простора для программного анализа куда больше, но не настаиваю, ИМХО, я бы попробовал
19. independ 1542 11.06.24 20:29 Сейчас в теме
Можно создать допсвойство РодительВерхнегоУровня для справочника Партнеры и перезаполнять при запуске открытии отчета, любым доступным кодом (маловероятно что количеству записей он большой), далее все просто
karamazoff; +1 Ответить
20. karamazoff 112 11.06.24 21:26 Сейчас в теме
(19)ну вот - мудрое и простое решение
21. FUXEARA 11.06.24 21:59 Сейчас в теме
(20)да, но это был крайний вариант, не хотелось изменять справочник Партнеры.
22. karamazoff 112 11.06.24 22:37 Сейчас в теме
(21)его не надо изменять, это доп. реквизит или доп. свойство
23. Free_Danial 56 12.06.24 10:25 Сейчас в теме
В ДО есть регистр для иерархии подразделений, можно регистр создать соответствия партнер и его верхний уровень или в запросе " транзитивными замыканиями"
24. FUXEARA 12.06.24 16:15 Сейчас в теме
В общем кому интересно, то решил так.
Не стал изобретать всякие регистры и промежуточные таблицы значений и всякие другое, а пошел по самомму простому пути и добавил реквизит ПартнерВерхнегоУрвня в спр.Партнеры и создал процедуру которая при записи или выборе головного партнера, дает самого верхнего партнера в иерархии и уже потом в запросе проверяю на заполненность "партнер.ПартнерВерхнегоУровня".
Всем огромное спасибо за участие.
25. karamazoff 112 12.06.24 19:07 Сейчас в теме
(24)Ну, молоток! оно же главное чтоб работало, но ты не говорил, что конфу можно менять, поэтому мы тебе регистры и советовали
26. FUXEARA 12.06.24 19:24 Сейчас в теме
(25) я и не хотел менять, но и мудрить сильно тоже не хотел. Чем проще тем надёжней. Через расширение прилепил автозаполнение и реквизит и подправил пару строк в запросе и взлетело
Оставьте свое сообщение

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