Имя: Пароль:
1C
 
Как получить список всех родителей элемента справочника?
0 Barmolei
 
24.09.10
12:59
Как получить список всех родителей элемента справочника, начиная с самого верхнего?

Ниже рабочий код, но мне кажется, что есть более простой способ.

Номенклатура = Справочники.Номенклатура.НайтиПоКоду("0004324234");
Список = Новый СписокЗначений;
Пока 1 = 1 Цикл
       
   Если ЗначениеЗаполнено(Номенклатура.Родитель) Тогда
       Список.Добавить(Номенклатура.Родитель);
       Номенклатура = Номенклатура.Родитель;
   Иначе
       Прервать;
   КонецЕсли;
       
КонецЦикла;    
   
Индекс = Список.Количество() - 1;
Пока 1 = 1 Цикл
   Если Индекс >= 0 Тогда
       Сообщить(Список.Получить(Индекс));
       Индекс = Индекс - 1;
   Иначе
       Прервать;
   КонецЕсли;
КонецЦикла;
1 Jstunner
 
24.09.10
13:02
забавные циклы
2 Serg_1960
 
24.09.10
13:04
(0) запрос, только иерархия...
3 Guk
 
24.09.10
13:06
Простые примеры разработки. стр. 87...
4 Serg_1960
 
24.09.10
13:08
Номенклатура = Справочники.Номенклатура.НайтиПоКоду("0004324234");
Список = Новый СписокЗначений;
Родитель = Номенклатура.Родитель;
Пока ЗначениеЗаполнено(Родитель) Цикл
  Сообщить(Родитель);
  Список.Добавить(Родитель);
  Родитель = Родитель.Родитель;
КонецЦикла;
5 Barmolei
 
24.09.10
13:12
(3) Книги у меня такой нет, но есть HTML вариант, какой заголовок на стр. 87?
6 Barmolei
 
24.09.10
13:24
Вот вариант через запрос, что-то ещё можно упростить?

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
|    Номенклатура.Ссылка КАК Ссылка
|ИЗ
|    Справочник.Номенклатура КАК Номенклатура
|ГДЕ
|    Номенклатура.Код = &Код
|ИТОГИ ПО
|    Ссылка ТОЛЬКО ИЕРАРХИЯ";
   
Запрос.УстановитьПараметр("Код", "0004324234");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
   Если Выборка.Ссылка.ЭтоГруппа Тогда
       Сообщить(Выборка.Ссылка);
   КонецЕсли;
КонецЦикла;
7 Maxus43
 
24.09.10
13:25
Номенклатура.Код = &Код
это пять
8 Maxus43
 
24.09.10
13:28
Если Выборка.Ссылка.ЭтоГруппа Тогда

ну и это не надо. У тебя и так ТОЛЬКО ИЕРАРХИЯ
9 Barmolei
 
24.09.10
13:34
(8) Если убрать условие, то выводит и сам элемент...
10 Serg_1960
 
24.09.10
13:39
Строка кода "Если Выборка.Ссылка.ЭтоГруппа" - порождает обращение к базе для получения объекта (всех его реквизитов). Это ни есть хорошо.
11 Barmolei
 
24.09.10
13:40
(10) А как тогда в запросе исключить сам элемент?
12 Рэйв
 
24.09.10
13:40
//-------
Процедура СоставитьСписокРодителей(Ном,СпРод)
  Если ЗначениеЗаполнено(Ном.Родитель) Тогда
      СпРод.Добавить(Ном.Родитель);
      ВернутьСписокРодителей(Ном.Родитель,СпРод)
  КонецЕсли;
 
КонецПроцедуры


//-------

 спРод=Новый СписокЗначений;
 ВернутьСписокРодителей(Номенклатура,СпРод);
13 Рэйв
 
24.09.10
13:41
ВернутьСписокРодителей в Если = СоставитьСписокРодителей
14 Рэйв
 
24.09.10
13:41
+и после тоже:)
15 Рэйв
 
24.09.10
13:41
сначала хотел функцией:)
16 Barmolei
 
24.09.10
13:43
Рэйв, извини конечно, но что-то ты намудрил... полный код выложи.
17 Рэйв
 
24.09.10
13:43
(16)Чего мудрого? Обычная рекурсия.
18 Serg_1960
 
24.09.10
13:44
Вариант а):

ТекНоменклатура = Справочники.Номенклатура.НайтиПоКоду("0004324234");

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
|    Номенклатура.Ссылка КАК Ссылка
|ИЗ
|    Справочник.Номенклатура КАК Номенклатура
|ГДЕ
|    Номенклатура = &Элемент
|ИТОГИ ПО
|    Ссылка ТОЛЬКО ИЕРАРХИЯ";
   
Запрос.УстановитьПараметр("Элемент", ТекНоменклатура);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
   Если Выборка.Ссылка <> ТекНоменклатура Тогда
       Сообщить(Выборка.Ссылка);
   КонецЕсли;
КонецЦикла;
19 Barmolei
 
24.09.10
13:46
(17) не читаемо (12) + (13) + (14) + (15) = "полный код выложи" :)
20 Serg_1960
 
24.09.10
13:46
Вариант б):

ТекКод = "0004324234";

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
|    Номенклатура.Ссылка КАК Ссылка,
|    Номенклатура.Код КАК Код
|ИЗ
|    Справочник.Номенклатура КАК Номенклатура
|ГДЕ
|    Номенклатура.Код = &Код
|ИТОГИ ПО
|    Ссылка ТОЛЬКО ИЕРАРХИЯ";
   
Запрос.УстановитьПараметр("Код", ТекКод);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
   Если Выборка.Код <> ТекКод Тогда
       Сообщить(Выборка.Ссылка);
   КонецЕсли;
КонецЦикла;
21 Barmolei
 
24.09.10
13:47
(18) Спс, похоже это конечный вариант.
22 Domovoi
 
24.09.10
13:49
(0)А можно узнать практичческое применение? Для чего вам это надо?
23 Рэйв
 
24.09.10
13:49
(19)Ну вот так гдето :))

//-------
Процедура СоставитьСписокРодителей(Ном,СпРод)
  Если ЗначениеЗаполнено(Ном.Родитель) Тогда
      СпРод.Добавить(Ном.Родитель);
      СоставитьСписокРодителей(Ном.Родитель,СпРод)
  КонецЕсли;
 
КонецПроцедуры


//------- гдето в коде

 спРод=Новый СписокЗначений;
 СоставитьСписокРодителей(Номенклатура,спРод);
 Для каждого Эл из спРод Цикл
    Сообщить(Эл.Значение);
 КонецЦикла;
24 Barmolei
 
24.09.10
13:53
(23) Спасибо :)
25 Barmolei
 
24.09.10
13:54
(22) Делается выгрузка номенкалтуры, где необходимо указать всех родителей по порядку.
26 Barmolei
 
24.09.10
13:55
(22) Для веб-сайта.
27 Serg_1960
 
24.09.10
13:58
Не особо радуйся. Рекурсия в платформе реализована так, что скорость исполнения падает на порядок :(
28 НЕА123
 
24.09.10
13:59
что-то не вижу ПолучитьПолныйКод()? али не кошерно?
29 Barmolei
 
24.09.10
14:01
(27) Рекурсией пользоваться в этом случае не собираюсь. Конечный вариант использование (18)
30 Barmolei
 
24.09.10
14:01
(28) А это тут зачем?
31 Serg_1960
 
24.09.10
14:09
Получить полный код элемента и в цикле, перебирая все коды, получить всех родителей через НайтиПоКоду()... как бы это сказать... это уже извращение :)
32 Serg_1960
 
24.09.10
14:17
Для прикола ради :)

ВсеКоды = СтрЗаменить(Справочники.Номенклатура.НайтиПоКоду("0004324234").ПолныйКод(),"/",Символы.ПС);
Для Индекс = 1 По СтрЧислоСтрок(ВсеКоды) Цикл
  Сообщить(Справочники.Номенклатура.НайтиПоКоду(СтрПолучитьСтроку(ВсеКоды,Индекс));
КонецЦикла;
33 Serg_1960
 
24.09.10
14:20
(32) Ыыы :( скобки не хватает в конце строки "Сообщить..."