![]() |
![]() |
![]() |
|
Как получить список всех родителей элемента справочника? | ☑ | ||
---|---|---|---|---|
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) Ыыы :( скобки не хватает в конце строки "Сообщить..."
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |