|
Запрос для получение всех родителей иерархического справочника | ☑ | ||
---|---|---|---|---|
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/
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |