Имя: Пароль:
1C
 
Из справочника вернуть Родителя Самого Верхнего уровня.
,
0 alex2808
 
18.06.10
11:57
Всем привет.
Утро пасмурное, тормоз ужасный... :)

Есть Иерархический справочник Подразделений.
Выбрано подразделение фиг знает какой вложенности.

Мне нужно вернуть Родителя выбранного подразделения самого верхнего
уровня у которого реквизит Родитель пустой.

Дайте идею, как это сделать?
1 FIXXXL
 
18.06.10
11:58
есть кусок кода некошерного с запросом в цикле :)
2 vde69
 
18.06.10
11:59
получить 0 уровень (у котороко родитель пустой) и соеденить со списком выбраных по условию в иерархие
3 Asmody
 
18.06.10
12:00
Функция ВернутьРодителя(Элемент)
   Если Элемент.Родитель.Пустая() Тогда
       Возврат Элемент;
   Иначе
       Возврат ВернутьРодителя(Элемент.Родитель);
   КонецЕсли;
КонецФункции
4 Kashemir
 
18.06.10
12:01
ВерхнийУровеньРодитель = Ссылка;
Пока ЗначениеЗаполнено(ВерхнийУровеньРодитель .Родитель) Цикл
ВерхнийУровеньРодитель = ВерхнийУровеньРодитель .Родитель;
КонецЦикла;
5 FIXXXL
 
18.06.10
12:02
Функция ПолучитьДепартамент(Подразделение) Экспорт
   
   Запрос = Новый Запрос;
   Запрос.Текст = "ВЫБРАТЬ
   |    ПодразделенияОрганизаций.Ссылка
   |ИЗ
   |    Справочник.ПодразделенияОрганизаций КАК ПодразделенияОрганизаций
   |ГДЕ
   |    ПодразделенияОрганизаций.Родитель = &ПустойРодитель";
   
   Запрос.УстановитьПараметр("ПустойРодитель", Справочники.ПодразделенияОрганизаций.ПустаяСсылка());
   
   Результат = Запрос.Выполнить();
   Выборка = Результат.Выбрать();
   
   Пока Выборка.Следующий() Цикл
       
       Запрос = Новый Запрос;
       Запрос.Текст = "ВЫБРАТЬ
       |    ПодразделенияОрганизаций.Ссылка
       |ИЗ
       |    Справочник.ПодразделенияОрганизаций КАК ПодразделенияОрганизаций
       |ГДЕ
       |    ПодразделенияОрганизаций.Ссылка В ИЕРАРХИИ(&Родитель)
       |    И ПодразделенияОрганизаций.Ссылка = &Подразделение";
       
       Запрос.УстановитьПараметр("Подразделение", Подразделение);
       Запрос.УстановитьПараметр("Родитель", Выборка.Ссылка);
       
       Результат = Запрос.Выполнить();
       Выборка1 = Результат.Выбрать();
       
       Если Выборка1.Следующий() Тогда
           возврат Выборка.Ссылка;
       КонецЕсли;    
       
   КонецЦикла;
   
   Возврат Справочники.ПодразделенияОрганизаций.ПустаяСсылка();
   
   
КонецФункции
6 alex2808
 
18.06.10
12:03
А если одним запросом?
(3)(4)
Или этот код базу дергать не будет,
как запрос (5).
7 vde69
 
18.06.10
12:04
(5) поубивал-бы за такое, одним запросом делается за 2 минуты
8 alex2808
 
18.06.10
12:04
(7) как?
9 FIXXXL
 
18.06.10
12:08
(7) согласен, делается
10 alex2808
 
18.06.10
12:13
(7)(9) Как будет выглядеть запрос?
11 Sasha_H
 
18.06.10
12:14
вот я так делал:


Тег_CodeGroup1C = РаботаСШинамиИДисками.ПолучитьВерхнийУровеньГруппы(Выборка.Номенклатура).Код;


//Получить верхний уровень группы переданной ссылки справочника
//
Функция ПолучитьВерхнийУровеньГруппы (ГруппаИерархии, ВерхняяГруппа=Неопределено) Экспорт

   Если ГруппаИерархии.Уровень() <> 0 Тогда
       
       ВерхняяГруппа = ПолучитьВерхнийУровеньГруппы(ГруппаИерархии.Родитель);
       
       Если ВерхняяГруппа.Уровень() = 0 Тогда
       
           Возврат ВерхняяГруппа;
       
       КонецЕсли;
       
   Иначе
       
       Возврат ГруппаИерархии;
       
   КонецЕсли;    
   
КонецФункции
12 Asmody
 
18.06.10
12:19
(10) например, так:

ВЫБРАТЬ
   Контрагенты.Ссылка КАК Ссылка,
   Контрагенты.Представление
ИЗ
   Справочник.Контрагенты КАК Контрагенты
ГДЕ
   Контрагенты.Ссылка = &Ссылка
ИТОГИ ПО
   Ссылка ТОЛЬКО ИЕРАРХИЯ

из результата берем только 1 строку
13 Asmody
 
18.06.10
12:19
(12)+ Представление не нужно, это конструктор добавил
14 Kashemir
 
18.06.10
12:23
Негламурное решение с фиксированной максимальной глубиной иерархии

ВЫБРАТЬ
   Номенклатура.Ссылка,
   ВЫБОР
       КОГДА Номенклатура.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
           ТОГДА Номенклатура.Ссылка
       КОГДА Номенклатура.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
           ТОГДА Номенклатура.Родитель
       КОГДА Номенклатура.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
           ТОГДА Номенклатура.Родитель.Родитель
       ИНАЧЕ Номенклатура.Родитель.Родитель.Родитель
   КОНЕЦ КАК РодительВерхнегоУровня
ИЗ
   Справочник.Номенклатура КАК Номенклатура
ГДЕ
   Номенклатура.Ссылка В (&СписокНоменклатуры)
15 Sasha_H
 
18.06.10
12:24
(10) +1 можно и так )))
16 Sasha_H
 
18.06.10
12:25
(14) - это ООооочень тупо
17 Kashemir
 
18.06.10
12:26
(16) Ты не поверишь - но именно так в результает и сделаешь ;-)
18 Sasha_H
 
18.06.10
12:28
(17) да нет же, есть более гламурные решения:
(11)
(12) + 1))) ЗЫ. я не там поставил я за 10 взял в (15) посте
19 FIXXXL
 
18.06.10
12:29
ВЫБРАТЬ
   Подразделения.Ссылка
ИЗ
   Справочник.Подразделения КАК Подразделения
ГДЕ
   Подразделения.Ссылка = &Ссылка
   И Подразделения.Ссылка В ИЕРАРХИИ
           (ВЫБРАТЬ
               Подразделения.Ссылка КАК СсылкаНаВерхнего
           ИЗ
               Справочник.Подразделения КАК Подразделения
           ГДЕ
               Подразделения.Ссылка В
                   (ВЫБРАТЬ
                       Подразделения.Ссылка КАК Ссылка
                   ИЗ
                       Справочник.Подразделения КАК Подразделения
                   ГДЕ
                       Подразделения.Родитель = ЗНАЧЕНИЕ(справочник.подразделения.пустаяссылка)))
20 pavlika
 
18.06.10
12:29
Функция РодительВерхнегоУровня(Ссылка) Экспорт
   
   ВыбПодразделение = Ссылка.ТекущееПодразделениеОрганизации;
   Если ВыбПодразделение.Уровень() = 0 Тогда
       Департамент = ВыбПодразделение;
   Иначе
       Департамент = Справочники.ПодразделенияОрганизаций.НайтиПоКоду(Лев(ВыбПодразделение.ПолныйКод(), Найти(ВыбПодразделение.ПолныйКод(),"/")-1)).Ссылка;
   КонецЕсли;
   
   Возврат Департамент;
   
КонецФункции
21 Sasha_H
 
18.06.10
12:31
по мне то самое изящное решение указано в (12)
22 Kashemir
 
18.06.10
12:33
(21) Это изящное решение имеет существенный минус - итоги не получится использовать во вложенных запросах.
Имхо решение в (19) гораздо интереснее
23 alex2808
 
18.06.10
12:37
(12) Класс !!!

Спасибо всем.
24 Asmody
 
18.06.10
12:48
(22) решение (19) конечно интереснее, только оно неправильное
25 simol
 
18.06.10
12:52
Родитель самого верхнего уровня = пустой ссылке
26 lxs
 
18.06.10
12:54
(0) у меня нумерация подразделений построена по принципу многоуровневого списка.
0100
-0101
--0101-01

Получить верхний уровень - никакого труда не составляет.
27 Kashemir
 
18.06.10
12:57
(24) Жаль, так перспективно выглядело :(
28 FIXXXL
 
18.06.10
13:01
(24) да, лоханулся не туда :)
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.