|
Перебор результата запроса в иерархии | ☑ | ||
---|---|---|---|---|
0
artprog
24.04.12
✎
14:18
|
Добрый день.
Получаю результат запроса методом Выгрузить(). Подскажите, как получить этот резултат в виде: Родитель 0 -Родитель 1 -- Элемент 1 -- Элемент 2 -Родитель 2 -- Элемент 1 -- Элемент 2 -- Элемент 3 и т.д. Т.е. чтобы перебирая строки я по порядку получал родительский элемент, затем его дочерние элементы |
|||
1
Ненавижу 1С
гуру
24.04.12
✎
14:19
|
выгрузи в дерево
|
|||
2
salvator
24.04.12
✎
14:23
|
ОбходРезультатаЗапроса
|
|||
3
fisher
24.04.12
✎
14:46
|
Обходы результата запросов по группировкам и иерархиям кажись разжевывались в учебнике Митичкина по 8.1
Он даже в электронной версии есть и его можно в 5 мин у 1С смс-кой купить (вышлют на почту). Ну или бесплатно украсть :) |
|||
4
fisher
24.04.12
✎
14:55
|
(3) Не, вру. Новая его редакция под 8.1 уже под СКД заточена.
|
|||
5
artprog
24.04.12
✎
15:10
|
Уважаемые, напомню - я не 1сник.Пишу под .NET поэтому прошу проявите снисхождение.
Вот набросал такой код в 1с: Процедура КнопкаВыполнитьНажатие(Кнопка) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Номенклатура.Артикул, | Номенклатура.Наименование |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | Номенклатура.Родитель = &Родитель"; Запрос.УстановитьПараметр("Родитель",Справочники.Номенклатура.НайтиПоКоду("00000015793")); Результат = Запрос.Выполнить().Выгрузить(); Для каждого стр из Результат Цикл строка=ТабличноеПоле1.Добавить(); строка.Артикул=стр.Артикул; строка.Наименование=стр.Наименование; КонецЦикла; КонецПроцедуры В результате мне вернулось только содержимое родительской группы, а как получить более вложенные элементы? |
|||
6
butterbean
24.04.12
✎
15:12
|
ГДЕ Номенклатура.Ссылка В ИЕРАРХИИ(&Родитель)
|
|||
7
salvator
24.04.12
✎
15:14
|
(5) ТабличноеПоле1 = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
ЭлементыФормы.ТабличноеПоле1.СоздатьКолонки(); Только у ТабличноеПоле1 установи тип "Дерево значений" |
|||
8
salvator
24.04.12
✎
15:21
|
+(7) Сорри, не в кассу. В (6) верный ответ.
|
|||
9
artprog
24.04.12
✎
15:28
|
6,7 исправил на ГДЕ Номенклатура.Ссылка В ИЕРАРХИИ(&Родитель)
Выбрал все подчиненные элементы, но беспорядочно элементы в перемешку с группами. Пробовал и "Таблица значений" и "Дерево значений" у ТабличноеПоле1 |
|||
10
hhhh
24.04.12
✎
15:33
|
(9) ИТОГИ в запросе забыл.
|
|||
11
artprog
24.04.12
✎
15:46
|
(10) Дописал:
|ИТОГИ ПО | Номенклатура.Родитель"; Теперь у меня как то так получилось: - --Элемент1 --Элемент2 --Элемент3 - --Элемент1 --Элемент2 - --Родитель1 --Родитель2 --Родитель3 И есть еще вариант - мне не столько важно, как это отображается на форме, сколько важно, как это выгружается запросом - потому что я буду через ком перебирать поочереди все строки запроса, и именно поэтому пытаюсь добиться, чтобы они шли в иерархически-правильном порядке. |
|||
12
salvator
24.04.12
✎
15:47
|
(11)
... ГДЕ Номенклатура.Родитель В ИЕРАРХИИ(&Родитель) И НЕ Номенклатура.ЭтоГруппа ИТОГИ ПО Ссылка ТОЛЬКО ИЕРАРХИЯ |
|||
13
butterbean
24.04.12
✎
15:48
|
(11) вместо ИТОГИ... напиши УПОРЯДОЧИТЬ ПО Ссылка ИЕРАРХИЯ
|
|||
14
Alex S D
24.04.12
✎
16:02
|
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ | Номенклатура.Артикул, | Номенклатура.Ссылка КАК Ссылка |ИЗ | Справочник.Номенклатура КАК Номенклатура |ИТОГИ ПО | Ссылка ИЕРАРХИЯ"; Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока Выборка.Следующий() Цикл Стр=ТабличноеПоле1.Добавить(); Стр.Артикул=Выборка.Артикул; Стр.Наименование=Выборка.Ссылка.Наименование; КонецЦикла; и не надо там никуда выгружать |
|||
15
fisher
24.04.12
✎
16:20
|
(11) Не надо ИТОГИ. И УПОРЯДОЧИТЬ ПО Ссылка ИЕРАРХИЯ тоже не надо (не по алфавиту будет).
Просто добавь в конце АВТОУПОРЯДОЧИВАНИЕ и все. |
|||
16
artprog
24.04.12
✎
18:14
|
(15) так?:
Процедура КнопкаВыполнитьНажатие(Кнопка) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Номенклатура.Ссылка как Ссылка, | Номенклатура.Артикул, | Номенклатура.Наименование |ИЗ | Справочник.Номенклатура КАК Номенклатура |АВТОУПОРЯДОЧИВАНИЕ"; Запрос.УстановитьПараметр("Родитель",Справочники.Номенклатура.НайтиПоКоду("00000015793")); ТП = Запрос.Выполнить().Выгрузить(); ЭлементыФормы.ТП.СоздатьКолонки(); КонецПроцедуры Работает так: Процедура КнопкаВыполнитьНажатие(Кнопка) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Номенклатура.Ссылка как Ссылка, | Номенклатура.Артикул, | Номенклатура.Наименование |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | Номенклатура.Родитель В ИЕРАРХИИ(&Родитель) | И НЕ Номенклатура.ЭтоГруппа |ИТОГИ ПО | Ссылка ТОЛЬКО ИЕРАРХИЯ"; Запрос.УстановитьПараметр("Родитель",Справочники.Номенклатура.НайтиПоКоду("00000015793")); ТП = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией); ЭлементыФормы.ТП.СоздатьКолонки(); КонецПроцедуры но не по алфавиту. |
|||
17
fisher
24.04.12
✎
18:17
|
(16) Да, так. А выполнить и проверить рука не поднимается? :)
|
|||
18
fisher
24.04.12
✎
18:18
|
Только условие на родительскую группу тоже ж надо.
|
|||
19
fisher
24.04.12
✎
18:26
|
Можно и в запрос с итогами добавить автоупорядочивание и будет работать. Но для этой задачи итоги лишние.
|
|||
20
artprog
24.04.12
✎
18:35
|
(17-19) Спасибо! Теперь как надо. Только остался самый наверное главный вопрос.
Как мне теперь результат этого запроса обойти по строкам? Таким мокаром не проходит: foreach (dynamic product in result) { MessageBox.Show(product.Наименование); } |
|||
21
artprog
24.04.12
✎
18:41
|
Невозможно привести COM-объект типа "System.__ComObject" к интерфейсному типу "System.Collections.IEnumerable". Операция завершилась со сбоем, поскольку вызов QueryInterface COM-компонента для интерфейса с IID "{496B0ABE-CDEE-11D3-88E8-00902754C43A}" возвратил ошибку "Интерфейс не поддерживается (Исключение из HRESULT: 0x80004002 (E_NOINTERFACE))" и COM-компонент не поддерживают вызовы IDispatch::Invoke для DISPID_NEWENUM.
|
|||
22
le_
24.04.12
✎
18:45
|
(20) По индексам можно...
|
|||
23
artprog
24.04.12
✎
18:56
|
(22) Код можешь подкинуть?
|
|||
24
le_
24.04.12
✎
19:46
|
//как-то так
LastInd = result.Choose().Count(); for(i=0; i<=LastInd; i++) MessageBox.Show(result[i].Наименование); |
|||
25
le_
24.04.12
✎
19:55
|
//или так (в result должно быть Запрос.Выполнить().Выгрузить())
LastInd = result.Count(); for(i=0; i<=LastInd; i++) MessageBox.Show(result[i].Наименование); |
|||
26
artprog
24.04.12
✎
20:00
|
(23-25) у меня в result Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Поэтому не получается. Твой вариант работает если результат выгрузки список, я так понимаю. а у меня результат выгрузки - дерево значений. или я не прав? |
|||
27
le_
24.04.12
✎
20:08
|
(26) Дерево рекурсией обходить нужно.
void showrows(rows){ int LI = rows.Count(); for(i=0; i<=LI; i++) { MessageBox.Show(result[i].Наименование); showrows(result[i].rows) } } showrows(result.rows); |
|||
28
artprog
24.04.12
✎
20:13
|
(27)
сделал вот так: static void getpodstroka(dynamic result) { foreach (dynamic podstroka in result.Строки) { MessageBox.Show(podstroka.Наименование); getpodstroka(podstroka); } } |
|||
29
artprog
24.04.12
✎
20:22
|
ВСЕМ УЧАСТВОВАВШИМ - БОЛЬШОЕ СПАСИБО!
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |