1С: Запросы. Итоги в запросах

Запросы. Итоги в запросах

Оглавление (нажмите, чтобы раскрыть)

Итоги без агрегации

Пример вывода итогов без агрегации
//добаляем группировочные строки по
//иерархии материалов
//без подсчета итоговых остатков

Запрос = Новый Запрос;
Запрос.Текст =
    "ВЫБРАТЬ
    |   Материал,
    |   КоличествоОстаток КАК Количество
    |ИЗ
    |   РегистрНакопления.ОстаткиМатериалов.Остатки
    |ИТОГИ 
    |ПО
    |   Материал ИЕРАРХИЯ";

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

Пока Выборка.Следующий() Цикл

    Отступ = "";
    Для Н = 0 По Выборка.Уровень() - 1 Цикл
        Отступ = Отступ + Символы.Таб;
    КонецЦикла;

    Если Выборка.ТипЗаписи() <> ТипЗаписиЗапроса.ИтогПоГруппировке Тогда
        //для обычной записи отображаем результат
        Сообщить(Отступ + Выборка.Материал);
    Иначе
        //для итоговой записи бежим по вложенным записям    
        ВыборкаМатериал = Выборка.Выбрать();

        Пока ВыборкаМатериал.Следующий() Цикл

            Сообщить(Отступ + ВыборкаМатериал.Материал +
                ": " + ВыборкаМатериал.Количество);
        КонецЦикла;
    КонецЕсли;
КонецЦикла;

//Пример результата:
//Материалы
//  Радиодетали
//    Трансформатор: 3
//    Транзистор: 5
//  Прочие
//    Шланг: 12

Итоги по иерархии

Пример вывода итогов по иерархии
//добаляем группировочные строки по
//иерархии материалов
//с подсчетом итоговых остатков 

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|   Материал,
|   КоличествоОстаток КАК Количество
|ИЗ
|   РегистрНакопления.ОстаткиМатериалов.Остатки
|ИТОГИ 
|   СУММА(КоличествоОстаток)
|ПО
|   Материал ИЕРАРХИЯ";

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

Пока Выборка.Следующий() Цикл
    Отступ = "";
    Для Н = 0 По Выборка.Уровень()-1 Цикл
        Отступ = Отступ + Символы.Таб;
    КонецЦикла;

    Сообщить(Отступ + Выборка.Материал +
        ": " + Выборка.Количество);
КонецЦикла;

//Пример результата:
//Материалы: 20
//  Радиодетали: 8
//    Трансформатор: 3
//    Транзистор: 5
//  Прочие: 12
//    Шланг: 12

Итоги по полю

Пример вывода итогов по полю
//Оператор ИТОГИ добавляет к результатам
//запроса группирующие строки

//Выбираем суммы начислений по 
//сотруднику и виду расчета.
//Затем добавляем строки с итоговыми
//суммами по виду рачета.

Запрос = Новый Запрос;
Запрос.Текст =
    "ВЫБРАТЬ
    |   ВидРасчета,
    |   Сотрудник,
    |   Результат
    |ИЗ
    |   РегистрРасчета.Начисления
    |ИТОГИ
    |   СУММА(Результат)
    |ПО
    |   ВидРасчета";

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

//цикл по группирующим строкам
Пока Выборка.Следующий() Цикл
    Сообщить("" + Выборка.ВидРасчета +
        ": " + Выборка.Результат);

    ВыборкаСотр = Выборка.Выбрать();

    //цикл по подчиненным строкам
    Пока ВыборкаСотр.Следующий() Цикл
        Сообщить("    " + ВыборкаСотр.Сотрудник +
            ": " + ВыборкаСотр.Результат);
    КонецЦикла;
КонецЦикла;

//Пример результата:
//Оклад: 13500
//  Иванов: 7000
//  Петров: 6500
//Премия: 700
//  Иванов: 700

Итоги только по иерархии

Пример вывода итогов только по иерархии
//получаем только группировочные строки по
//иерархии материалов
//с подсчетом итоговых остатков

Запрос = Новый Запрос;
Запрос.Текст =
    "ВЫБРАТЬ
    |   Материал,
    |   КоличествоОстаток КАК Количество
    |ИЗ
    |   РегистрНакопления.ОстаткиМатериалов.Остатки
    |ИТОГИ 
    |   СУММА(КоличествоОстаток)
    |ПО
    |   Материал ТОЛЬКО ИЕРАРХИЯ";

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

Пока Выборка.Следующий() Цикл
    Отступ = "";
    Для Н = 0 По Выборка.Уровень()-1 Цикл
        Отступ = Отступ + Символы.Таб;
    КонецЦикла;

    Сообщить(Отступ + Выборка.Материал +
        ": " + Выборка.Количество);
КонецЦикла;

//Пример результата:
//Материалы: 20
//  Радиодетали: 8
//  Прочие: 12

Общие итоги

Пример вывода общих итогов
//получаем только группировочные строки по
//иерархии материалов
//с подсчетом итоговых остатков

Запрос = Новый Запрос;
Запрос.Текст =
    "ВЫБРАТЬ
    |   Материал,
    |   КоличествоОстаток КАК Количество
    |ИЗ
    |   РегистрНакопления.ОстаткиМатериалов.Остатки
    |ИТОГИ 
    |   СУММА(КоличествоОстаток)
    |ПО
    |   Материал ТОЛЬКО ИЕРАРХИЯ";

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

Пока Выборка.Следующий() Цикл
    Отступ = "";
    Для Н = 0 По Выборка.Уровень()-1 Цикл
        Отступ = Отступ + Символы.Таб;
    КонецЦикла;

    Сообщить(Отступ + Выборка.Материал +
        ": " + Выборка.Количество);
КонецЦикла;

//Пример результата:
//Материалы: 20
//  Радиодетали: 8
//  Прочие: 12

Общие итоги и итоги по полю

Пример вывода общих итогов и итогов по полю
//Выбираем суммы начислений по 
//сотруднику и виду расчета.
//Затем добавляем строку с общей
//суммой по всем начислениям и
//и строки с суммами по виду расчета.

Запрос = Новый Запрос;
Запрос.Текст =
    "ВЫБРАТЬ
    |   ВидРасчета,
    |   Сотрудник,
    |   Результат
    |ИЗ
    |   РегистрРасчета.Начисления
    |ИТОГИ
    |   СУММА(Результат)
    |ПО
    |   ОБЩИЕ,
    |   ВидРасчета";

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

//выводим итоговые данные
Если Выборка.Следующий() Тогда
    Сообщить("Итого: " + Выборка.Результат);

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

    //цикл по видам расчета
    Пока ВыборкаВидРачета.Следующий() Цикл
        Сообщить("  " + ВыборкаВидРачета.ВидРасчета +
            ": " + ВыборкаВидРачета.Результат);

        ВыборкаСотр = ВыборкаВидРачета.Выбрать();

        //цикл по подчиненным строкам
        Пока ВыборкаСотр.Следующий() Цикл
            Сообщить("    " + ВыборкаСотр.Сотрудник +
                ": " + ВыборкаСотр.Результат);
        КонецЦикла;
    КонецЦикла;
КонецЕсли;

//Пример результата:
//Итого: 14200
//  Оклад: 13500
//    Иванов: 7000
//    Петров: 6500
//  Премия: 700
//    Иванов: 700
Ключи: |