Имя: Пароль:
1C
 
Запрос для получение всех родителей иерархического справочника
,
0 Vlaloplo
 
23.11.21
09:39
Доброго времени суток!

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

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

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

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

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

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

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

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

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

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

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