Имя: Пароль:
1C
1С v8
Не работает выборка из запроса
,
0 Invis91
 
02.05.12
01:51
Всем привет. Возникла следующая проблема, сломал голову уже себе, имеется результат запроса(с иерархией), вида:
-Вентиляция
 -Кондиционирование
    -Кондиционер1
    -Кондиционер2
-Холодильное оборудование
  -Холод
    -Кондиционер3

Ну собственно делаю выборку:

РезультатЗапроса = Запрос.Выполнить();
ВыборкаРаздела = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
Пока ВыборкаРаздела.Следующий() Цикл //выбирается первый уровень иерархии "Вентиляция"
  //тут какие-то действия
  ВыборкаПодраздела = ВыборкаРаздела.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
  Пока ВыборкаПодраздела.Следующий() Цикл
     //снова какие-то действия
  КонецЦикла;
КонецЦикла;

И вся проблема в том, что когда я выбираю первый уровень иерархии (ВыборкаРаздела), то все благополучно выбирается, но вот ВыборкаПодраздела.Следующий() сразу же возвращает Ложь и выкидывает из цикла, то есть "Кондиционирование" я выбрать никак не могу. В чем может быть проблема?
1 Злобный Фей
 
02.05.12
02:19
Запрос давай
2 Invis91
 
02.05.12
02:33
ВЫБРАТЬ
   НоменклатураРазделыНоменклатуры.РазделНоменклатуры КАК Раздел,
   НоменклатураРазделыНоменклатуры.Ссылка КАК Номенклатура
ИЗ
   Справочник.Номенклатура.РазделыНоменклатуры КАК НоменклатураРазделыНоменклатуры
ГДЕ
   НоменклатураРазделыНоменклатуры.Ссылка В (&Номенклатура)
ИТОГИ ПО
   Раздел ИЕРАРХИЯ


Тут конечно получается чуть не так, как я написал, а именно:


Раздел                   | Номенклатура
---------------------------------------
-Вентиляция              |
 -Кондиционирование     |
    -Кондиционирование  |Кондиционер1
    -Кондиционирование  |Кондиционер2
-Холодильное оборудование|
  -Холод                |
    -Холод              |Кондиционер3

Но смысл вопроса из-за этого, я думаю, не меняется.
3 Invis91
 
02.05.12
02:35
Блин, криво отобразилось, вобщем так:

-Вентиляция
 -Кондиционирование
    -Кондиционирование    Кондиционер1
    -Кондиционирование    Кондиционер2
-Холодильное оборудование
  -Холод
    -Холод                Кондиционер3
4 golden-pack
 
02.05.12
05:16
Отчет ?
5 catena
 
02.05.12
06:47
А так?
  ВыборкаПодраздела = ВыборкаРаздела.Выбрать();
6 Crongwild
 
02.05.12
09:48
Обход нужен по иерархии, а иерархия в разных группах справочника может иметь разные уровни.
Например, в Вентиляции может быть два уровня вложенности - нужны два вложенных цикла, а если в ХО, например, один уровень - нужен один вложенный цикл.
Соответственно, выход в рекурсивном обходе.
7 ptrtss
 
02.05.12
09:49
Надо указывать имя группировки, чтобы на уровень ниже автоматом не спускалось

Если вид группировки по иерархии, то еще выборка по номенклатуре (кажется там номенклатура у вас), если не по иерархии - то по следующей группировке
8 ptrtss
 
02.05.12
09:51
А можно еще проще. Обход поставить по группировкам, тогда все итоги по иерархии будут выводиться на одно уровне, в одном цикле. Уровень для сдвигов в печатной форме все равно будет доступен
9 Invis91
 
02.05.12
14:09
Просто смысл в том, чтобы в табличном поле(дерево) вывести результат запроса в иерархии, а так как в самом запросе иерархия имеется только между разделами и подразделами(прим. Вентиляция - Кондиционирование), а между подразделом и номенклатурой(прим. Кондиционирование - Кондиционер1) иерархии нет, а надо чтобы она была, поэтому и приходится Дерево Значений заполнять в цикле, то есть сначала заполняю Вентиляцию, потом перехожу на уровень ниже - Кондиционирование(вот тут как раз и не могу перейти), затем перехожу еще на уровень ниже и уже вручную добавляю номенклатуру как потомка "Кондиционирования".
Вот примерный код:


РезультатЗапроса = Запрос.Выполнить();
ВыборкаРаздела = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
Пока ВыборкаРаздела.Следующий() Цикл //выбирается первый уровень иерархии "Вентиляция"

  СтрокаРаздела = Дерево.Строки.Добавить();
  СтрокаРаздела.Номенклатура = ВыборкаРаздела.Раздел;

  ВыборкаПодраздела = ВыборкаРаздела.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
  Пока ВыборкаПодраздела.Следующий() Цикл

 СтрокаПодраздела = СтрокаРаздела.Строки.Добавить();
 СтрокаПодраздела.Номенклатура = ВыьоркаПодраздела.Раздел;
     
//ну и аналогично для кондиционеров СтрокаНоменклатуры = СтрокаПодраздела.Строки.Добавить() и т.д.
  КонецЦикла;
КонецЦикла;
10 Invis91
 
02.05.12
14:17
(6) Нет, везде одинаковый уровень вложенности, Раздел(прим. Вентилляция) и Подраздел (прим.Кондиционирование) - я беру из справочника РазделыНоменклатуры(справочник соответсвенно иерархический, иерархия элементов)

Вот сам справочник, пока особо не заполненный, в нем всегда только 2 уровня иерархии:

-Вентилляция
  -Кондиционирование
-Холодильное оборудование
  -Холод
  -Электрика
11 Invis91
 
02.05.12
14:26
И причем самое странное, что Вентиляция и Кондиционирование, находятся в простой иерархии, никакой лишней вложенности, и я вообще без понятия, почему не работает обход, бред какой-то.
12 hhhh
 
02.05.12
15:06
(11) ну у вас же одна группировка. Наверно, и разделы и подразделы находятся в одной выборке: Выборка. Другой группировки в итогах нет.
13 Invis91
 
02.05.12
15:30
(12) Нет, в Выборке(ВыборкаРазделов) находятся только Разделы.

(6) - Спасибо, помогло. Надо было лишь указать имя группировки во второй выборке.

Вот работающее решение:

РезультатЗапроса = Запрос.Выполнить();
ВыборкаРаздела = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
Пока ВыборкаРаздела.Следующий() Цикл //выбирается первый уровень иерархии "Вентиляция"

  //тут какие-то действия

  ВыборкаПодраздела = ВыборкаРаздела.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией,"Раздел");
  Пока ВыборкаПодраздела.Следующий() Цикл
     //снова какие-то действия

  КонецЦикла;
КонецЦикла;