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