Имя: Пароль:
1C
1С v8
Подсчет итогов в запросах при различном порядке измерений
0 Анатолий Nemo
 
02.09.19
14:32
Всем привет.
Изучаю язык запросов. Есть простой справочник:

Наименование Реквизит1 Реквизит2 Реквизит3
Элемент1     1         1         1
Элемент2     1         2         10
Элемент3     2         1         100

Есть запрос:

ВЫБРАТЬ
    Реквизит1, Реквизит2, Реквизит3
ИЗ
    Справочник.Справочник1
ИТОГИ
    СУММА(Реквизит3)
ПО
    Реквизит1, Реквизит2


Запрос обрабатывается:

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

Получается такая выборка:

ТипЗаписи -- Итог по группировке; Группировка -- Реквизит1; Реквизит1 -- 1; Реквизит2 -- NULL; Реквизит3 -- 11;
    ТипЗаписи -- Итог по группировке; Группировка -- Реквизит2; Реквизит1 -- 1; Реквизит2 -- 2; Реквизит3 -- 10;
        ТипЗаписи -- Детальная запись; Группировка -- ; Реквизит1 -- 1; Реквизит2 -- 2; Реквизит3 -- 10;
    ТипЗаписи -- Итог по группировке; Группировка -- Реквизит2; Реквизит1 -- 1; Реквизит2 -- 1; Реквизит3 -- 1;
        ТипЗаписи -- Детальная запись; Группировка -- ; Реквизит1 -- 1; Реквизит2 -- 1; Реквизит3 -- 1;
ТипЗаписи -- Итог по группировке; Группировка -- Реквизит1; Реквизит1 -- 2; Реквизит2 -- NULL; Реквизит3 -- 100;
    ТипЗаписи -- Итог по группировке; Группировка -- Реквизит2; Реквизит1 -- 2; Реквизит2 -- 1; Реквизит3 -- 100;
        ТипЗаписи -- Детальная запись; Группировка -- ; Реквизит1 -- 2; Реквизит2 -- 1; Реквизит3 -- 100;

Теперь внимательно.
Меняем порядок измерений в методе Выбрать:
Выбрать(ОбходРезультатаЗапроса.Прямой,"Реквизит2,Реквизит1",",Реквизит2");

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

ТипЗаписи -- Итог по группировке; Группировка -- Реквизит2; Реквизит1 -- NULL; Реквизит2 -- 2; Реквизит3 -- 10;
    ТипЗаписи -- Итог по группировке; Группировка -- Реквизит1; Реквизит1 -- 1; Реквизит2 -- 2; Реквизит3 -- 10;
        ТипЗаписи -- Детальная запись; Группировка -- ; Реквизит1 -- 1; Реквизит2 -- 2; Реквизит3 -- 10;
ТипЗаписи -- Итог по группировке; Группировка -- Реквизит2; Реквизит1 -- NULL; Реквизит2 -- 1; Реквизит3 -- 101;
    ТипЗаписи -- Итог по группировке; Группировка -- Реквизит1; Реквизит1 -- 1; Реквизит2 -- 1; Реквизит3 -- 1;
        ТипЗаписи -- Детальная запись; Группировка -- ; Реквизит1 -- 1; Реквизит2 -- 1; Реквизит3 -- 1;
    ТипЗаписи -- Итог по группировке; Группировка -- Реквизит1; Реквизит1 -- 2; Реквизит2 -- 1; Реквизит3 -- 100;
        ТипЗаписи -- Детальная запись; Группировка -- ; Реквизит1 -- 2; Реквизит2 -- 1; Реквизит3 -- 100;

Вопрос:
Когда происходит подсчет агрегатных значений при получении выборки?

При вызове метода Запрос.Выполнить() производится подсчет для всех всех вариантов порядка группировок в предложении ИТОГИ ПО <...>?

Либо итоги подсчитываются при вызове метода Выбрать(<....>)?
В таком случае на этом этапе должен производится анализ выражений языка запросов, потому что такой вариант, как

ИТОГИ СУММА(Реквизит3+Реквизит2*3)-10 КАК Реквизит3

также дает корректный результат.

С уважением, Анатолий
1 aleks_default
 
02.09.19
14:43
Естественно в запросе. Метод выбрать ничего не агрегирует, только организует порядок обхода результата запроса
Закон Брукера: Даже маленькая практика стоит большой теории.