|
Как в запросе получить головного родителя элемента справочника? | ☑ | ||
---|---|---|---|---|
0
Zombi
30.08.12
✎
08:48
|
Как в запросе получить головного родителя элемента справочника?
|
|||
1
andrewks
30.08.12
✎
08:53
|
головной родитель - это кто?
|
|||
2
Zombi
30.08.12
✎
09:00
|
(1) Есть элемент справочника "Подразделения" "Оборудование", Элемент "Оборудование" является родителем для элемента "Керхер", который в свою очередь является родителем для элемента "КерхерЦентр". Выбираю я в запросе "КерхерЦентр", хочу видеть что он принадлежит элементу "Оборудование".
|
|||
3
rinatru
30.08.12
✎
09:01
|
классная задачка на отработку рекурсии :) на собеседовании часто задают
|
|||
4
МишКа
30.08.12
✎
09:02
|
Родитель.Родитель.Родитель .....
и ОБЪЕДИНИТЬ тебе помогут |
|||
5
Фрэнки
30.08.12
✎
09:02
|
да и тут уже многажды перетиралось подобное
|
|||
6
Rie
30.08.12
✎
09:03
|
(0) Если глубина иерархии - конечная, можешь N раз соединить таблицу саму с собой.
Иначе - циклом. |
|||
7
Фрэнки
30.08.12
✎
09:03
|
а разве возможно использование переменных, циклов и рекурсий внутри текста запроса на 1С?
|
|||
8
mikecool
30.08.12
✎
09:03
|
выбор когда родитель.родитель.родитель...родитель(н) = пустая ссылка
тогда родитель...родитель(н-1) |
|||
9
Rie
30.08.12
✎
09:05
|
(7) Возможно снаружи текста запроса. А ещё возможны временные таблицы.
|
|||
10
vde69
30.08.12
✎
09:10
|
для начала получи список корневых обьектов (ГДЕ Ссылка.Родитель = &Пустая) ну и дальше у справочника есть функция ПринадлежитЭлементу()
|
|||
11
Zombi
30.08.12
✎
09:13
|
Я так понимаю, что проще вне запроса все сделать?
|
|||
12
Rie
30.08.12
✎
09:21
|
(11) Проще скомбинировать. Совсем вне запроса - это, фактически, по мини-запросу на каждый элемент. Запросами можно уровни "оптом" получать.
|
|||
13
andrewks
30.08.12
✎
09:23
|
(7) переменные - можно, циклы - в какой-то степени тоже, а вот с рекурсией бедя
|
|||
14
badboychik
30.08.12
✎
09:27
|
>> Родитель.Родитель.Родитель
>> можешь N раз соединить таблицу саму с собой >> (10) Слёт извращенцев какой то а не топик |
|||
15
John83
30.08.12
✎
09:28
|
как насчет завести соответствующий реквизит или использовать для этих целей свойства?
|
|||
16
Daenerys
30.08.12
✎
09:47
|
Функция ПолучитьРодителя(Ссылка)
Если ЗначениеЗаполнено(Ссылка.Родитель) Тогда Возврат Ссылка.Родитель; КонецЕсли; ПолучитьРодителя(Ссылка.Родитель); КонецФункции |
|||
17
Фрэнки
30.08.12
✎
09:49
|
Смотря по важности поставленной задачи, следуя совету (15), завести реквизит "Прародитель" и подставлять в событии ПередЗаписью значение, которое рекрусивным способом получать по коду из (16)
А в запросе пользовать значение поля Прародитель |
|||
18
Rie
30.08.12
✎
09:49
|
(16) Какой интересный язык запросов... :-)
Да и функция - неработающая. |
|||
19
mikecool
30.08.12
✎
09:51
|
(16) бурерожденная? )
|
|||
20
Фрэнки
30.08.12
✎
09:52
|
(16) кстати, да - код даже синстакс-контроль не пройдет
|
|||
21
mikecool
30.08.12
✎
09:53
|
(20) почему?
|
|||
22
mikecool
30.08.12
✎
09:53
|
правильнее было бы
Если Не ЗначениеЗаполнено(Ссылка.Родитель) Тогда |
|||
23
Daenerys
30.08.12
✎
09:54
|
(19) именно. отличный сериал!
(20) у меня работает =) |
|||
24
Rie
30.08.12
✎
09:54
|
(22) ...и функция всегда вернёт либо пустую ссылку, либо Неопределено.
|
|||
25
mikecool
30.08.12
✎
09:54
|
(24) ну да, не досмотрел ))
|
|||
26
Rie
30.08.12
✎
09:55
|
(23) У тебя, наверно, ровно 2 уровня иерархии. Угадал?
|
|||
27
mikecool
30.08.12
✎
09:55
|
(23) не правильно у тебя работает )
и где драконы? |
|||
28
Daenerys
30.08.12
✎
09:56
|
(26) да
|
|||
29
Rie
30.08.12
✎
09:57
|
(28) И на первом уровне иерархии нет ни одного элемента, только группы? Угадал?
|
|||
30
DEVIce
30.08.12
✎
09:58
|
А в запрос добавить итоги с иерархией, а потом обойти результат запроса с группировкой не проще будет?
|
|||
31
Daenerys
30.08.12
✎
09:59
|
(27) а драконы, как в старом анекдоте, вымерли, потому что питались юными, невинными девами
(29) да |
|||
33
Rie
30.08.12
✎
10:00
|
(31) Создай элемент на первом уровне (или сунь этой функции группу) - и посмотри, как красиво вылетает 1С.
|
|||
34
Zombi
30.08.12
✎
10:00
|
Такой вот костыль получился(обработка таблицы-результата запроса):
Запрос.Текст = "ВЫБРАТЬ | ПодразделенияОрганизаций.Ссылка |ИЗ | Справочник.ПодразделенияОрганизаций КАК ПодразделенияОрганизаций |ГДЕ | ПодразделенияОрганизаций.Родитель = &ПустаяСсылка"; Запрос.УстановитьПараметр("ПустаяСсылка", Справочники.ПодразделенияОрганизаций.ПустаяСсылка()); ТаблицаГоловныхПодразделений = Запрос.Выполнить().Выгрузить(); Для Каждого СтрокаДвижений Из ТаблицаДвижений Цикл Для Каждого СтрокаГоловныхПодразделений Из ТаблицаГоловныхПодразделений Цикл Если СтрокаДвижений.Подразделение <> Справочники.ПодразделенияОрганизаций.ПустаяСсылка() Тогда Если СтрокаДвижений.Подразделение.ПринадлежитЭлементу(СтрокаГоловныхПодразделений.Ссылка) Тогда СтрокаДвижений.Подразделение = СтрокаГоловныхПодразделений.Ссылка; Прервать; КонецЕсли; КонецЕсли; КонецЦикла; //Для КонецЦикла; //Для Одно "Если" можно убрать из цикла и в одно объединить. |
|||
35
Rie
модератор
30.08.12
✎
10:01
|
Сейчас кто-то за флуд в тематической ветке отправится куда-то...
|
|||
36
DimVad
30.08.12
✎
10:07
|
Мне кажется, можно и в запросе, без кода... Типа так:
1. Получаем во временную таблицу элементы справочника, для которого нужны "головные родители". 2. Получаем в другую временную таблицу элементы справочника, являющимися каталогами и не имеющие родителя (т.е. - папки первого уровня). 3. Делаем полное объединение 1 с 2 по условию, что элемент из 2 находится в иерархии элемента из 1. Думаю - работать будет, а вот насколько быстро... ;-) |
|||
38
Lama12
30.08.12
✎
10:09
|
(36) Все бы было так просто если б связь по "В иерархии" работала.
|
|||
39
mikecool
30.08.12
✎
10:10
|
(38) гм... а разве не работает?
|
|||
40
Reset
30.08.12
✎
10:10
|
А вот так сработает?
Запрос=Новый Запрос("Выбрать Ссылка Из Справочник.Контрагенты как Контрагенты Где Контрагенты.Ссылка=&Ссылка |Итоги По Ссылка только иерархия"); Запрос.УстановитьПараметр("Ссылка",КонтрагентСсылка); Верхняя=Запрос.Выполнить().Выгрузить()[0].Ссылка; |
|||
41
ssh2006
30.08.12
✎
10:11
|
(39) не а
|
|||
42
vmv
30.08.12
✎
10:18
|
(0) тема обсасывалась 100500 раз и великолепно гуглитться тут.
Вывод1: ничего нового тут не напишут Вывод2: если порядок иерархии не фиксирован, то только дрочево с Родитель.Родитель...Родитель Вывод3: если логика твоего проложения требует частого обращения к корневому родителю таблицы(отборы, соединения, вложенные запросы), то забей на дрочево и введи реквизит в таблицу справочника "КорневойРодитель" и на подписке "ПередЗаписью" его прошивай. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |