Имя: Пароль:
1C
1С v8
Обход с итогами по иерархии
0 Z_Z
 
23.05.12
09:43
Обычный запрос по остаткам с ценами. Запрос в консоле запросов отлично работает.Но результаты запроса не получается вывести в отчет с иерархией.
Уровень1
   Уровень2
      уровень3 и тд.
Если пишу ВыборкаПервогоУровня = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
тогда выборки второго уровня нету(((
а если пишу ВыборкаПервогоУровня = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
То все группу становятся 1 уровня , а элементы 2 уровня((
вот код :
Запрос = новый Запрос;

   ТекстЗапроса ="
   |    ВЫБРАТЬ
   |    ХозрасчетныйОстатки.Субконто1 КАК Номенклатура,
   |    ХозрасчетныйОстатки.КоличествоОстаток КАК КоличествоОстаток,
   |    ХозрасчетныйОстатки.Организация КАК Организация,
   |    ВложенныйЗапрос.Цена
   |ИЗ
   |    РегистрБухгалтерии.Хозрасчетный.Остатки КАК ХозрасчетныйОстатки
   |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
   |            ЦеныНоменклатурыСрезПоследних.ТипЦен КАК ТипЦен,
   |            ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
   |            ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
   |        ИЗ
   |            РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
   |        ГДЕ
   |            ЦеныНоменклатурыСрезПоследних.ТипЦен = &ТипЦен) КАК ВложенныйЗапрос
   |        ПО ХозрасчетныйОстатки.Субконто1 = ВложенныйЗапрос.Номенклатура
   |ГДЕ
   |    ХозрасчетныйОстатки.Счет = &Счет
   |    И ХозрасчетныйОстатки.Организация = &Организация
   |    И ХозрасчетныйОстатки.КоличествоОстаток > 0
   |    И ХозрасчетныйОстатки.Субконто1 В ИЕРАРХИИ(&Ссылка)

   |УПОРЯДОЧИТЬ ПО
   |    ХозрасчетныйОстатки.Субконто1.Наименование
   |ИТОГИ
   |    СУММА(КоличествоОстаток)
   |ПО
   |    Субконто1  ИЕРАРХИЯ
   |";
   
   Запрос.Текст = ТекстЗапроса;
   ВыбТМЦ = Справочники.Номенклатура.НайтиПоКоду("00000000001");
   Запрос.Параметры.Вставить("ССылка", ВыбТМЦ);
   Запрос.Параметры.Вставить("Организация", Справочники.Организации.НайтиПоКоду("000000001"));
   Запрос.Параметры.Вставить("Счет", ПланыСчетов.Хозрасчетный.ТоварыНаСкладе);
   Запрос.Параметры.Вставить("ТипЦен", Справочники.ТипыЦенНоменклатуры.НайтиПоКоду("000000005"));
   Результат = Запрос.Выполнить();
   
   СпособВыборки = ОбходРезультатаЗапроса.ПоГруппировкамСИерархией;      
   ВыборкаПервогоУровня = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
   Пока ВыборкаПервогоУровня.Следующий() Цикл // внутри каждого уровня иерархии заказы упорядочены: "Создан", "В работу", "Ведутся работы", "Готов к отгрузке" (именно в таком порядке, порядок установлен в перечислении)
       Сообщить(""+ ВыборкаПервогоУровня.Номенклатура+"    "+ВыборкаПервогоУровня.Цена);
       ВыборкаВторогоУровня = ВыборкаПервогоУровня.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);    
       Пока ВыборкаВторогоУровня.Следующий() Цикл // внутри каждого уровня иерархии заказы упорядочены: "Создан", "В работу", "Ведутся работы", "Готов к отгрузке" (именно в таком порядке, порядок установлен в перечислении)
           ВыборкаТретьегоУровня = ВыборкаВторогоУровня.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); // параметр можно не передавать, по умолчанию способ выборки прямой
           Сообщить("   " + ВыборкаВторогоУровня.Номенклатура+"    "+ВыборкаВторогоУровня.Цена);
           Пока ВыборкаТретьегоУровня.Следующий() Цикл // внутри каждого уровня иерархии заказы упорядочены: "Создан", "В работу", "Ведутся работы", "Готов к отгрузке" (именно в таком порядке, порядок установлен в перечислении)
               Сообщить("        " + ВыборкаТретьегоУровня.Номенклатура+"    "+ВыборкаТретьегоУровня.Цена);
           КонецЦикла;
         КонецЦикла;
     КонецЦикла;
1 butterbean
 
23.05.12
09:45
признавайся, у тебя отчет сколько часов формируется??
2 Z_Z
 
23.05.12
09:47
отчет или запрос? Запрос немного думает, но терпимо.
3 Z_Z
 
23.05.12
09:54
как правильно обходить этот запрос? кто подскажет?
4 butterbean
 
23.05.12
09:55
чем тебя не устроил обход ПоГруппировкам??
5 Z_Z
 
23.05.12
09:58
результат получается такой: все группы при обходе находятся в одном уровне.
Уровень1
уровень2
уровень3
 элементы
а нужен такой
Уровень1
  уровень2
     уроыень3
6 0_Serg_0
 
23.05.12
10:01
(5)
я обычно пробелы добавляю слева по количеству уровней
7 Z_Z
 
23.05.12
10:02
это понятно. А как сделать группировку строк по уровню, если все уровни получаются на 1 уровне?
8 butterbean
 
23.05.12
10:04
(7) а если на всех уровнях вывода ставить обход ПоГруппировкамСИерархией, тогда тоже криво ваыводится??
9 0_Serg_0
 
23.05.12
10:05
СпЗнач(7) примерно так

Уровень=СпУровень.Получить(Выборка.Номенклатура.Уровень());
ОбластьМакета.Параметры.Номенклатура = Уровень.Значение+Выборка.Номенклатура;
10 Z_Z
 
23.05.12
10:10
кому интересно получилось по этому примеру.
http://help1c.com/faq8/view/209.html
а где я тупил так и не понял
11 butterbean
 
23.05.12
10:14
(10) там вроде нет "группировки строк по уровню", которая тебе была нужна...
на (8) можешь ответить??
12 Z_Z
 
23.05.12
10:29
там есть автогруппировкастрок и вывод с уровнем.
Вых.Вывести(ИсходнаяСтрока, Выборка.Уровень());
(8)Пробывал так. Но так вообще есть только 0 уровень - самый верхних. Ниже не опускается .  ВыборкаПервогоУровня.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам).Количество() = 0; аналогично и с ПоГруппировкамСеирархией.
Опускается только когда выборка первого уровня поГруппирвокам или Прямой.
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс