Имя: Пароль:
1C
1С v8
Итоги по нескольким полям в запросе
0 iceman2112
 
29.01.13
13:16
Можно в запросе сделать итоги по нескольким полям
Т.е. чтобы результат запроса было дерево вида:

T1 N1 -
+     G1
+     G2
T1 N2 -
+     G2
+     G3
+     G4
T2 N2 -
+     G3

Я знаю как сделать
T1
 N1
    G1
    G2
 N2
    G2
..................
1 Alexaha
 
29.01.13
13:19
ну и сделай группировку не по одному полю,  а по двум
что мешает?
2 iceman2112
 
29.01.13
13:29
Группировка, я потом не смогу выборку открыть - а это как раз и нужно.
Т.е в первом случае было бы:

ВыборкаПоТиN = Результат.Выбрать(ОбходПоГруппировкам);
Пока ВыборкаПоТиN.Следующий() Цикл
  ВыборкаПОG = ВыборкаПоТиN.Выбрать(ОбходПоГруппировкам);
  Пока ВыборкаПОG.Следующий() Цикл
    ....
  КонецЦикла;
КонецЦикла;

а во втором примере 3 цикла
3 Fragster
 
гуру
29.01.13
13:31
1 цикл:

   // FIFO по сделкам и складам
   Выборка = Построитель.Результат.Выбрать(ОбходРезультатаЗапроса.Прямой);
   Пока Выборка.Следующий() Цикл
       
       Если
           Выборка.ТипЗаписи() = ТипЗаписиЗапроса.ИтогПоГруппировке
           И Выборка.Группировка() = "Количество" // это последнее поле в итогах
       Тогда
           ОстатокКоличества = Выборка.Количество; // остатокколичества - это поле в детальных записях. в итогах выражение "сумма" для него
           Если ОстатокКоличества > Выборка.КоличествоОстаток Тогда
               Отказ = Истина;
           КонецЕсли;
       КонецЕсли;
       
       Если Не Отказ И Выборка.ТипЗаписи() = ТипЗаписиЗапроса.ДетальнаяЗапись Тогда
           КоличествоЗаписи = Мин(Выборка.КоличествоОстаток, ОстатокКоличества);
           Если КоличествоЗаписи = 0 Тогда Продолжить; КонецЕсли;
                       ,,,,,,,,,,,,,,,
           
           ОстатокКоличества = ОстатокКоличества - КоличествоЗаписи;
       КонецЕсли;
       
   КонецЦикла;
4 Fragster
 
гуру
29.01.13
13:31
// КоличествоОстаток - это поле в детальных записях. в итогах выражение "сумма" для него
5 Fragster
 
гуру
29.01.13
13:32
как выбрать сразу по 2-м полям - так и не понял
6 Alexaha
 
29.01.13
13:33
(2) ааа...я думал ты про СКД...
7 le_
 
29.01.13
13:33
Если использовать СКД, можно настроить группировку по двум полям. Результат можно выгрузить в дерево, если это не отчет.
8 iceman2112
 
29.01.13
13:34
(3) ща гляну.
Но суммировать вообще ничего не надо. Важен сам обход по дереву.
Т.е.
У меня Подразделение, Сотрудник и Надбавки.
Вот нужно отрыть выборку по подздразделению и сотруднику, а потом обойти их надбавки
9 Fragster
 
гуру
29.01.13
13:35
(8) так даже проще
10 Fragster
 
гуру
29.01.13
13:37
Выборка = Построитель.Результат.Выбрать(ОбходРезультатаЗапроса.Прямой);
   Пока Выборка.Следующий() Цикл
       
       Если
           Выборка.ТипЗаписи() = ТипЗаписиЗапроса.ИтогПоГруппировке
           И Выборка.Группировка() = "Сотрудник" // это последнее поле в итогах

       Тогда
         //тут действия для группировки
       Если;
       
       Если Не Отказ И Выборка.ТипЗаписи() = ТипЗаписиЗапроса.ДетальнаяЗапись Тогда
         //тут действия для детальных записей
       КонецЕсли;
       
   КонецЦикла;
11 iceman2112
 
29.01.13
13:42
))) Похоже это ответ.
12 iceman2112
 
30.01.13
11:55
ВыборкаЗапроса1 = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Поле1,Поле2,Поле3");
Пока ВыборкаЗапроса1.Следующий() Цикл
  Если ВыборкаЗапроса1.Группировка() <> "Поле3" Тогда
       Продолжить;
  КонецЕсли;

  // тут у тебя уже Поле1, Поле2, Поле3 заполнены

КонецЦикла;
13 Fragster
 
гуру
30.01.13
11:58
(12) а за третий параметр разобрался?
Закон Брукера: Даже маленькая практика стоит большой теории.