Имя: Пароль:
1C
1С v8
Как вывести всех родителей одного элемента в иерархическом справочнике?
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С не сэкономила на поддержке коррелированных подзапросов, то взлетел бы такой запрос без закомменченного кусочка. а так - только с закомменченным



select
Номенклатура.Ссылка
from
Справочник.Номенклатура as Номенклатура
where
&ВыбНоменклатура in //hierarchy
 (
  select
   Номенклатура2.Ссылка
  from
   Справочник.Номенклатура as Номенклатура2
  where
   Номенклатура.Ссылка=Номенклатура2.Ссылка
  )


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-уровневого справочника нормуль.
ВЫБРАТЬ
   Номен.Ссылка,
   Номен1.Ссылка,
...
   Номен10.Ссылка
ИЗ
   Справочник.Номенклатура КАК Номен
   ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номен1
   ПО Номен1.Родитель = Номен.Ссылка
       ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номен2
       ПО Номен2.Родитель = Номен1.Ссылка
   ...
          ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номен10
          ПО Номен10.Родитель = Номен9.Ссылка
ГДЕ
   Номен.Родитель = Значение(Справочник.Номенклатура.ПустаяСсылка)
   И &ТвойЭлемент В(Номен10.Ссылка,Номен9.Ссылка,...Номен.Ссылка)