Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
12 дек 2024, 16:45

Подсчет итогов в ЯЗ при различном порядке измерений

Автор Анатолий Nemo, 28 авг 2019, 15:39

0 Пользователей и 1 гость просматривают эту тему.

Анатолий Nemo

Всем привет.
Изучаю язык запросов. Есть простой справочник:

НаименованиеРеквизит1Реквизит2Реквизит3
Элемент1111
Элемент21210
Элемент321100
Есть запрос:

ВЫБРАТЬ
    Реквизит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;
Уровень -- 0; ТипЗаписи -- Детальная запись; Группировка -- ; Реквизит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
также дает корректный результат.
С уважением, Анатолий

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск