Имя: Пароль:
1C
1С v8
Перебор результата запроса в иерархии
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
ВСЕМ УЧАСТВОВАВШИМ - БОЛЬШОЕ СПАСИБО!
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.