|
Как вывести всех родителей одного элемента в иерархическом справочнике? | ☑ | ||
---|---|---|---|---|
0
Конфигуратор1с
24.08.12
✎
19:28
|
В общем есть иерархический справочник подразделение (иерархия элементов) . Выбираю я элемент на определенном уровне и хочу получить все вышестоящие элементы. Нужно в запросе. СКД не предлагать
|
|||
1
ЧашкаЧая
24.08.12
✎
19:31
|
Функция ВывестиВсехРодителей(Элемент)
Если НЕ Элемент.Родитель.Пустой() Тогда Сообщить(Элемент); ВывестиВсехРодителей(Элемент.Родитель); КонецЕсли; КонецФункции |
|||
2
PR
24.08.12
✎
19:31
|
(0) Никак
|
|||
3
ЧашкаЧая
24.08.12
✎
19:31
|
(0) Ой, в запросе. Никак.
|
|||
4
Конфигуратор1с
24.08.12
✎
19:36
|
печалька(((
|
|||
5
PR
24.08.12
✎
19:37
|
(4) А зачем?
|
|||
6
Конфигуратор1с
24.08.12
✎
19:51
|
(5)Да вот есть документ договор. Вот, например менеджер есть, у него есть начальник отдела, у начальника отдела есть коммерческий директорк, у того директор генеральный. Вот что бы заключить договор вся эта лесенка должна его согласовать. Вот мне и нужно согласователей получить.
|
|||
7
PR
24.08.12
✎
19:53
|
1. А запросом зачем?
2. А почему бы не выбрать с иерархией, а в запросе не поставить отбор по менеджеру, |
|||
8
smaharbA
24.08.12
✎
19:58
|
ПолноеНаименование
|
|||
9
Конфигуратор1с
24.08.12
✎
20:01
|
(7) ну мне все равно получать в запросе по ним доп информацию типа фиофизлиц и так далее.
так выбираю иерархию и ставлю отбор - выводит одного менеджера. (8)? |
|||
10
МишКа
24.08.12
✎
20:05
|
Используй
ИТОГИ ПО <имя_поля> ИЕРАРХИЯ |
|||
11
andrewks
24.08.12
✎
20:07
|
(10) и шо с этим делать?
|
|||
12
Конфигуратор1с
24.08.12
✎
20:09
|
(10)пробовал - нифига
|
|||
13
mistеr
24.08.12
✎
20:11
|
(0) Если принять ограничение на глубину иерархии, то можно, соединением n раз.
|
|||
14
andrewks
24.08.12
✎
20:11
|
(13) в том-то и фишка - "Если принять ограничение на глубину иерархии"
|
|||
15
mistеr
24.08.12
✎
20:14
|
(14) В конкретном случае ТС это вполне допустимо. Хотя пройтись по ссылкам в цикле всяко лучше.
|
|||
16
andrewks
24.08.12
✎
20:17
|
решается в общем случае, но с динамическим текстом запроса
|
|||
17
mistеr
24.08.12
✎
20:19
|
(16) Как?
|
|||
18
andrewks
24.08.12
✎
20:21
|
(17) это писать надо. а писать мне лень. вот если бы меня материально простимулировали... ;-)
|
|||
19
МишКа
24.08.12
✎
20:21
|
Запрос типа:
ВЫБРАТЬ ссылка из справочник.контрагенты где ссылка=&МояСсылка ИТОГИ ПО Ссылка ИЕРАРХИЯ выдает всех родителей + саму ссылку (2 раза) можешь попробовать в консоли |
|||
20
andrewks
24.08.12
✎
20:22
|
(19) бу-га-га
|
|||
21
PR
24.08.12
✎
20:28
|
(10) Пля. При _выборе_ нужно выбирать иерархически.
|
|||
22
Конфигуратор1с
24.08.12
✎
20:31
|
(19) пробовал - не выдает
|
|||
23
Конфигуратор1с
24.08.12
✎
20:32
|
у меня иерархия элементов
|
|||
24
PR
24.08.12
✎
20:33
|
(23) И чо?
|
|||
25
Конфигуратор1с
24.08.12
✎
20:34
|
(24)ничо - не пашет (19)
|
|||
26
mistеr
24.08.12
✎
20:36
|
(18) Ну идею хотя бы. Я вот не вижу общего решения.
|
|||
27
PR
24.08.12
✎
20:36
|
(25) Потому что (21), а в (19)... хм... не работает, мягко говоря.
|
|||
28
catena
24.08.12
✎
20:39
|
Только с ограниченным уровнем иерархии. Ну или максимальную вложенность отдельно вычислять и основной запрос формировать динамически, исходя из полученной цифры.
|
|||
29
dangerouscoder
24.08.12
✎
20:43
|
а что мешает вычислить через ПолноеНаименование() длину вложенности и сделать динамический запрос.
|
|||
30
Конфигуратор1с
24.08.12
✎
20:51
|
(28)+(29) та некрасиво это. Я думал штатно как то можно, без динамических запросов (((
|
|||
31
andrewks
24.08.12
✎
20:53
|
(26) получаем уровень исходного эл-та, и, исходя из этого уровня, собираем динамический текст запроса
|
|||
32
andrewks
24.08.12
✎
20:53
|
(30) а это штатно
|
|||
33
andrewks
24.08.12
✎
20:54
|
безудержно жаль, что коррелированные подзапросы так слабо реализованы в 1с-ке. а то можно было статику написать, причём коротенькую
|
|||
34
Конфигуратор1с
24.08.12
✎
20:58
|
(32)штатно это когда "выбрать усехродителей из спарвочник где ссылка = мояссылка"
|
|||
35
andrewks
24.08.12
✎
21:00
|
(34) прямые запросы ждут тебя, солдат!
|
|||
36
catena
24.08.12
✎
21:01
|
Как вариант, без динамического формирования текста: вытащить запросом всё необходимое по всем работникам, а в коде уже к каждому родителю подтянуть его данные из выборки :)
|
|||
37
МишКа
24.08.12
✎
21:01
|
(22) Поменял иерархию на "иерархия элементов".
Все работает также. |
|||
38
andrewks
24.08.12
✎
21:01
|
(36) это неспортивно
|
|||
39
andrewks
24.08.12
✎
21:03
|
(36) уж лучше сразу передать в зарос ТЗ с предками, закинуть в ВТ и сделать соединение
|
|||
40
andrewks
24.08.12
✎
21:05
|
(37) блаженны верующие
|
|||
41
Конфигуратор1с
24.08.12
✎
21:08
|
(37)покажи видео
|
|||
42
МишКа
24.08.12
✎
21:08
|
(40) Причем здесь вера? Я в консоли запросов запустил - получил результат: все предки + 2 ссылки
|
|||
43
МишКа
24.08.12
✎
21:10
|
Зачем тебе видео? Запусти запрос в консоли запросов.
|
|||
44
andrewks
24.08.12
✎
21:10
|
(42) я верю тебе. плохо то, что ты веришь в это. это означает только одно - ты совершенно не понимаешь принципов выполнения запросов и получения их результатов
|
|||
45
Конфигуратор1с
24.08.12
✎
21:11
|
(43)Запустил и нифига у меня не выдало
|
|||
46
МишКа
24.08.12
✎
21:13
|
(45) текст запроса из (19)?
|
|||
47
МишКа
24.08.12
✎
21:15
|
(44) Да куда уж нам! ))))
|
|||
48
catena
24.08.12
✎
21:16
|
(47)Ты к этой своей иерархии как будешь прикручивать должности и оклады?
|
|||
49
МишКа
24.08.12
✎
21:19
|
(48) Зачем? Читай (6)
|
|||
50
catena
24.08.12
✎
21:20
|
(49) читай (9)
|
|||
51
МишКа
24.08.12
✎
21:21
|
(50) "фиофизлиц" можно через точку
|
|||
52
andrewks
24.08.12
✎
21:22
|
пятнично...
|
|||
53
catena
24.08.12
✎
21:22
|
(51)Хм... У меня в УПП это регистр...
|
|||
54
nbIx
24.08.12
✎
21:24
|
сделай в запросе через Родитель.Родитель.Родитель раз 10 с запасом.
|
|||
55
catena
24.08.12
✎
21:26
|
(54)В должнстях? 10 раз - "с запасом"? Оптимистично, однако.
|
|||
56
МишКа
24.08.12
✎
21:32
|
(54)
Да, можно и так: Выбрать ссылка.родитель из справочник.справочник1 где ссылка=&ссылка ОБЪЕДИНИТЬ ВСЕ Выбрать ссылка.родитель.Родитель из справочник.справочник1 где ссылка=&ссылка ОБЪЕДИНИТЬ ВСЕ Выбрать ссылка.родитель.Родитель.Родитель из справочник.справочник1 где ссылка=&ссылка |
|||
57
nbIx
24.08.12
✎
21:34
|
(55) Причем тут должности, сабж о подразделениях.
|
|||
58
МишКа
24.08.12
✎
21:37
|
(0) Пробуй (56). Только из полученного списка надо удалить пустые ссылки и NULL.
|
|||
59
mistеr
24.08.12
✎
21:53
|
(29) Тогда уж лучше ПолныйКод(), надежнее.
(37) И правда работает. От дубля можно избавиться с помощью ТОЛЬКО ИЕРАРХИЯ. |
|||
60
mistеr
24.08.12
✎
22:01
|
Вот, на основе (19).
ВЫБРАТЬ Контрагенты.Ссылка КАК Ссылка ИЗ Справочник.Контрагенты КАК Контрагенты ГДЕ Контрагенты.Ссылка = &МояСсылка ИТОГИ ПО Ссылка ТОЛЬКО ИЕРАРХИЯ Результат выгружаем в ТЗ. Затем эту ТЗ пихаем во второй запрос, где присоединяем все необходимое: ВЫБРАТЬ Контрагенты.Ссылка ПОМЕСТИТЬ ВТКонтрагенты ИЗ &Таблица КАК Контрагенты ; ВЫБРАТЬ Контрагенты.Ссылка КАК Контрагент, БанковскиеСчета.Ссылка КАК Счет ИЗ ВТКонтрагенты КАК Контрагенты ЛЕВОЕ СОЕДИНЕНИЕ Справочник.БанковскиеСчета КАК БанковскиеСчета ПО Контрагенты.Ссылка = БанковскиеСчета.Владелец |
|||
61
andrewks
24.08.12
✎
22:05
|
(60) и нафига этот изврат, если можно _сразу_ передать ТЗ предков, и присоединять? это не решает задачи выборки всех предков в рамках одного запроса. единственное решение, которое предложил я и многие другие - это динамический текст запроса
|
|||
62
Мебиус
24.08.12
✎
22:10
|
РЕКУРСИЯ!
|
|||
63
Мебиус
24.08.12
✎
22:10
|
)))
пятница однако |
|||
64
mistеr
24.08.12
✎
22:33
|
(61) Сразу это как? Как получить ТЗ предков?
Строго говоря, задача "выборки всех предков в рамках одного запроса" решена. |
|||
65
ВалераОшкин
24.08.12
✎
22:36
|
(60) можно использовать пакет запросов. В первом пакете выгрузить во временную таблицу, а во втором пакете её подхватить. Тогда ничего выгружать в ТЗ не надо.
|
|||
66
andrewks
24.08.12
✎
22:38
|
(64) "Как получить ТЗ предков? " элементарно - циклом Пока .Родитель<>ПустаяСсылка
(65) ещё один наивный |
|||
67
andrewks
24.08.12
✎
22:40
|
(64) "Строго говоря, задача "выборки всех предков в рамках одного запроса" решена"
в контексте сабжа - да, в контексте (9) - нет |
|||
68
mistеr
24.08.12
✎
22:43
|
(66) Так этот цикл (15) уже решает задачу. Все остальное это извращения на тему "хочу только запросом".
|
|||
69
andrewks
24.08.12
✎
22:44
|
(68) вот именно.
|
|||
70
ВалераОшкин
24.08.12
✎
22:46
|
(67) Если заведомо известен уровень иерарархии элемента, то такой запрос написать возможно.
По образцу примера из базы знаний о выводе в запросе курса на каждую дату указанного списка периодов. |
|||
71
andrewks
24.08.12
✎
22:48
|
(70) это всё уже перетёрли в ветке, и не раз. и про статику с ограничением уровня, и про динамику
|
|||
72
Мебиус
24.08.12
✎
22:51
|
Задача решается только с помощью рекурсии.
То есть в запросе НЕВОЗМОЖНО это сделать. А генерация текста и прочее не что иное как единственно возможная программная реализация задачи |
|||
73
Мебиус
24.08.12
✎
22:52
|
книжки по математике видимо сейчас в дефиците)
|
|||
74
andrewks
24.08.12
✎
22:54
|
(72) если бы 1С не сэкономила на поддержке коррелированных подзапросов, то взлетел бы такой запрос без закомменченного кусочка. а так - только с закомменченным
|
|||
75
Мебиус
24.08.12
✎
22:58
|
Суть рекурсии в том, что мы не знаем куда пойдем на следующем этапе (утрировано).
То есть мы физически не можем знать весь путь (текст запроса) и решаем задачу перебором. |
|||
76
mistеr
24.08.12
✎
23:08
|
(75) Суть (74) в том, что в запросе тоже может быть рекурсия. Многие SQL базы давно поддерживают, и желтая частично (в итогах), а могла бы и пошире.
|
|||
77
Eugeneer
24.08.12
✎
23:11
|
полный код емае.
|
|||
78
PR
26.08.12
✎
11:48
|
Если не нужно получить всех родителей непосредственно в самом запросе, а можно получить их при выборке данных, то можно выбрать один элемент с иерархией, он выдаст элемент и всех его родителей.
Если нужно получить всех родителей в самом запросе (как несколько записей), то два пути. Либо сначала рекурсивно получить список всех родителей и выбрать все эти элементы запросом. Либо динамически сконструировать текст запроса, отталкиваясь от уровня элемента. О чем еще говорить, не понимаю. |
|||
79
France
26.08.12
✎
12:20
|
В Скд посмотри
|
|||
80
mikecool
26.08.12
✎
12:29
|
в мсскл с 2005 версии года есть оператор with, который может строить иерархию по типу conect by .. prior в pl/sql
так что думаю прямым запросом думаю можно ) вот только преобразование в элементы потом как делать - хз, в семерке я пользовал для этого 1с++ |
|||
81
olegves
27.08.12
✎
09:24
|
(0) В запросе можно, но будет не уникально (не для всех случаев). До 10-уровневого справочника нормуль.
ВЫБРАТЬ
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |