Вход | Регистрация
 

Запрос для получение всех родителей иерархического справочника

Запрос для получение всех родителей иерархического справочника
Я
   Vlaloplo
 
23.11.21 - 09:39
Доброго времени суток!

написал быстрый запрос, для выборки всех родителей для номенклатуры:

ВЫБРАТЬ
    Номенклатура.ВидНоменклатуры.Родитель КАК ВидНоменклатурыРодитель
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Ссылка = &Ссылка
ИТОГИ ПО
    ВидНоменклатурыРодитель ТОЛЬКО ИЕРАРХИЯ

Но в результате выполнения обход получается с верхней группы, мне нужно каким то образом отсортировать список так, чтобы начать обход запроса с самой нижней группы. Для примера сейчас результат выглядит как:
Группа1
Группа2
Группа3
И соответственно в выборке сначала проверятеся группа1, мне же нужно, чтобы дерево обходилось снизу в верх. Есть идеи, как можно это сделать?
   Vlaloplo
 
1 - 23.11.21 - 09:39
Сортировка в запросе не помогает, пробовал результат вгонять в список значений, но тоже не вышло
   Vlaloplo
 
2 - 23.11.21 - 09:45
Возможно каким то другим способом нужно получить всех родителей, не претендую на то, что этот вариант необходимо использовать
   НЕА123
 
3 - 23.11.21 - 09:50
https://program1s.com/uporyadochit-po/
может поможет.(с)
   Галахад
 
4 - 23.11.21 - 10:24
Выгрузи в таблицы и начинай обход с конца. :-)
   dubolom
 
5 - 23.11.21 - 10:25
Эмм, для начала - постановка.
Нужно выбрать все группы справочника номенклатуры? Или всю иерархию конкретного элемента?
   VladZ
 
6 - 23.11.21 - 10:27
(0) Зачем?
   Vlaloplo
 
7 - 23.11.21 - 11:27
(5) Для группы установлен определенный признак, соответственно если его нет в первой группе, то нужно искать этот признак в группе выше и т.д, пока либо не найдется группа с заполненным признаком, либо пока все группы не закончатся)
   Vlaloplo
 
8 - 23.11.21 - 11:29
(4) каким образом можно обойти таблицу с конца..? Не слышал про такой способ
   Vlaloplo
 
9 - 23.11.21 - 11:32
(3), к сожалению в моем варианте не получится так, я запросом получаю только группы, элементы этих групп меня не интересуют. Получаю группы через итоги, а использование итогов и сортировку по иерархии 1с не допускает.
   Галахад
 
10 - 23.11.21 - 11:34
(8) Ну да, ну да. Наверное это невозможно...
   Vlaloplo
 
11 - 23.11.21 - 11:38
(0) У группы есть свойство "стоимость доставки" - число, обозначающие можно ли доставить номенклатуру из этой группы и по какой цене. Но это свойство может быть как для родителя элемента, так и для родителя этой группы и т.д. по иерархии. При заполнении пользователем номенклатуры в тч, нужно проверить, по какой цене можем доставить товар из этой группы..

Просто если обходить сверху вниз, то могут попасть не правильные данные, т.к для элементов в самой верхней группе - одна цена, а для элементов группой ниже - другая
Соответственно поэтому  требуется идти снизу в верх по группам иерархического справочника
   Vlaloplo
 
12 - 23.11.21 - 11:40
Вроде бы обычная задача, но я себе уже всю голову сломал как это можно сделать
   Asmody
 
13 - 23.11.21 - 11:48
(11) А надо ли делать это в запросе?
   Vlaloplo
 
14 - 23.11.21 - 11:50
(13) Не обязательно, а как ещё можно?
   Spieluhr
 
15 - 23.11.21 - 11:56
(14) Удивительно, но через реквизит ссылки Родитель
   dubolom
 
16 - 23.11.21 - 11:56
(14) Совершенно незачем городить запрос, здесь - цикл или рекурсивная процедура, перебор всех уровней иерархии, начиная с нижнего.
   dubolom
 
17 - 23.11.21 - 12:01
фПродолжать = Истина;
ТекНоменклатура = МояНоменклатура;
Пока фПродолжать Цикл
   Если Не ЗначениеЗаполнено(ТекНоменклатура) Или ТекНоменклатура.МойПризнак = Истина Тогда
      фПродолжать = Ложь;
   КонецЕсли;
   ТекНоменклатура = ТекНоменклатура.Родитель;
КонецЦикла;
Если ЗначениеЗаполнено(ТекНоменклатура) Тогда
  //нашли группу в иерархии с нужным признаком

Иначе
  //не нашли

КонецЕсли;
   Vlaloplo
 
18 - 23.11.21 - 12:12
(17) Огромное спасибо) Мозг уже этим запросом заплыл и даже не мог принять что то другое) Думаю это точно поможет
   МихаилМ
 
19 - 23.11.21 - 12:15
(0)задача решается неправильно.
создайте отдельный рс и в нем храните признак. при изменении в группе - обновляйте всю ветвь .
таким образом не реляционные структуры приводятся к реляционным.
простое правило работы с бд- "подальше положишь- поближе возьмешь".
в этом форуме подобные темы обсуждались со времен 1с77.  

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

поэтому ну жен РС, а не реквизит.
   mistеr
 
20 - 23.11.21 - 12:20
(7) В типовых эта задача решается запросом в цикле. Наверное один из редких случаев, когда запрос в цикле оправдан.

Сделать это одним запросом невозможно (в рамках языка запросов 1С).
   lodger
 
21 - 23.11.21 - 12:24
ужас, то какой.
про архитектуру этой свалки уже сказали в (19) 

про рекурсивное цикличное чтение СУБД обсуждается тут Чем плох запрос в цикле??

про вменяемое решение задачи в существующей помойке (0) скажу так против мнения из (20):
делаем пакетный запрос,
в первом пакете достаём из справочника ЭтоГруппа=Истина с нужными полями + Родитель.
во втором пакете достаём уже сами нужные элементы.
первый пакет выгружаем в ТЗ, индексируем ссылки.
второй можно так обойти.

в ходе обхода ищем родителя в ТЗ, в найденом проверяем Родителя и ищем в ТЗ снова.

обычно, структура папок не бесконечное дерево, а вполне умещается в приемлемое ТЗ.
   Vlaloplo
 
22 - 23.11.21 - 12:26
Я согласен, архитектура построена оч плохо, к сожалению не знаю этих программистов, которые так сделали, но такой ужасный код редко где встречал. Если бы делал с нуля, то избежал бы такой проблемы
   Галахад
 
23 - 23.11.21 - 12:31
(22) Т.е. твой код лучше чем у предыдущих программистов? :-) Ну-ну.
   Zapal
 
24 - 23.11.21 - 12:32
можно попробовать через заполненность Номенклатура.Родитель.Родитель.Родитель.Родитель вычислить уровень группы
и потом сортировать по этому уровню
   Zapal
 
25 - 23.11.21 - 12:36
хотя для (7) достаточно просто через ВЫБОР КОГДА перебрать всех Родитель.Родитель.Родитель
понятно что сработает только когда уровень иерархии не бесконечный
   acht
 
26 - 23.11.21 - 12:38
(22) > к сожалению не знаю этих программистов, которые так сделали
Гасконец, как ваше имя?
   mistеr
 
27 - 23.11.21 - 13:07
(21) Ты напиши и покажи конкретные запросы. И, если есть интерес, выполни в профайлере. Сможешь перебить по эффективности вариант "2-3 раза залезть в кластерный индекс по ссылке"?

Если бы язык запросов поддерживал рекурсивные CTE, это можно было бы сделать и одним запросом.
   Vlaloplo
 
28 - 23.11.21 - 13:22
Ну все, накинулись)
(23), не говорю, что мой код лучше, далек от идеала, но продумать более адекватную архитектуру я в состоянии)
А может и нет, все зависит от взгляда конкретного спеца
   Vlaloplo
 
29 - 23.11.21 - 13:23
Суть мисты - сначала избить палками, помочь, а потом добить палками))
   АнализДанных
 
30 - 23.11.21 - 15:03
(0) Используй "транзитивное замыкание": https://infostart.ru/1c/articles/158512/
 
 


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.