[ Вопрос дня ] Какое назначение у флага СКД “Использовать группировки запроса если возможно”?

Доброго дня, коллеги!

Часто слушатели обращаются к нашим тренерам с просьбой объяснить смысл текста из официальной документации. Вопрос обычно сопровождается фразой “Никак не могу понять, что написано в справке” или “Как-то в справке не очень понятно”. Следующий пример как раз из этой серии.

Вопрос

Подскажите, пожалуйста, какое назначение у флага схемы компоновки данных “Использовать группировки запроса если возможно”?

Какое назначение у флага СКД “Использовать группировки запроса если возможно”?

Ответ

При установленной галочке расчет агрегатных функций будет выполняться не процессором компоновки (то есть не на уровне сервера “1С:Предприятие”), а на уровне СУБД. Это должно ускорить расчёт.

Например, текст запроса набора данных выглядит следующим образом:

ВЫБРАТЬ
    РасходТовараТовары.Товар КАК Товар,
    РасходТовараТовары.Количество КАК Количество,
    РасходТовараТовары.Сумма КАК Сумма
ИЗ
    Документ.РасходТовара.Товары КАК РасходТовараТовары

Есть 2 ресурса – Количество и Сумма, для которых используются выражения Сумма(Количество) и Сумма(Сумма).

Снимем галочку “Использовать группировки запроса если возможно” в наборе данных. Текст запроса в макете компоновки будет выглядеть следующим образом:

ВЫБРАТЬ
    РасходТовараТовары.Товар КАК Товар,
    РасходТовараТовары.Количество КАК Количество,
    РасходТовараТовары.Сумма КАК Сумма,
    ПРЕДСТАВЛЕНИЕССЫЛКИ(РасходТовараТовары.Товар) КАК ТоварПредставление,
    РасходТовараТовары.Товар.Наименование КАК ТоварНаименование
ИЗ
    Документ.РасходТовара.Товары КАК РасходТовараТовары

Теперь установим галочку “Использовать группировки запроса если возможно” в наборе данных. Текст запроса в макете компоновки будет выглядеть по-другому:

ВЫБРАТЬ
    РасходТовараТовары.Товар КАК Товар,
    СУММА(РасходТовараТовары.Количество) КАК КоличествоСумма,
    СУММА(РасходТовараТовары.Сумма) КАК СуммаСумма,
    ПРЕДСТАВЛЕНИЕССЫЛКИ(РасходТовараТовары.Товар) КАК ТоварПредставление,
    РасходТовараТовары.Товар.Наименование КАК ТоварНаименование,
    ВЫБОР
        КОГДА РасходТовараТовары.Товар.Ссылка ЕСТЬ NULL
            ТОГДА 0
        ИНАЧЕ 1
    КОНЕЦ КАК ТоварПолеУпорядочивания1
ИЗ
    Документ.РасходТовара.Товары КАК РасходТовараТовары
 СГРУППИРОВАТЬ ПО
    РасходТовараТовары.Товар,
    РасходТовараТовары.Товар.Наименование,
    ВЫБОР
        КОГДА РасходТовараТовары.Товар.Ссылка ЕСТЬ NULL
            ТОГДА 0
        ИНАЧЕ 1
    КОНЕЦ
УПОРЯДОЧИТЬ ПО
    ТоварПолеУпорядочивания1,
    ТоварНаименование,
    Товар

В этом случае в тексте запроса набора данных используются агрегатные функции (вместо расчета итогов на сервере “1С:Предприятие”).

Комментарии / обсуждение (8):

    • Василий Ханевич

      Добрый день!
      Эта галочка позволяет в некоторых случаях ускорить получение данных при помощи СКД. Ускорение происходит за счет того, что в запросе, выбирающем данные из базы, используются агрегатные функции. Поэтому группировка данных происходит на уровне сервера СУБД, а не на уровне сервера “1С:Предприятие” при обработке уже полученных из базы данных.
      По умолчанию эта галочка в наборе данных включена, значит, СКД попробует таким образом оптимизировать получение данных из базы.

      • Pavlo

        Из примера, что здесь описан, не понятно для чего она, что мешает мне написать сразу в запросе СУММА() и всё?

        • Василий Ханевич

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

            • Василий Ханевич

              Потому что в настройках компоновки пользователь может задать различные варианты группировок, вложенных друг в друга. Все возможные варианты группировок в одном тексте запроса не получится предусмотреть.

                • Василий Ханевич

                  Вот описание этой галочки в документации:
                  Генератор макета компоновки данных, при создании запроса, используемого для получения набора, пытается использовать язык запросов СУБД для агрегации данных. Для агрегации данных используются функции СУММА(), МАКСИМУМ() и МИНИМУМ() языка запросов, применяемые к одному полю.
                  Источник: https://dl03.1c.ru/content/Platform/8_3_14_1630/1cv8upd_8_3_14_1630.htm#2f7dd713-a9ec-11e8-a3f7-0050569f678a

                  Когда Вам не нужна эта возможность, галочку надо снять. Тогда расчет итогов будет выполняться на сервере “1С:Предприятие”, а не на сервере СУБД.
                  На практике не встречал случаев, когда эта галочка действительно используется.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Вход на сайт

Зарегистрироваться

Подтверждение регистрации будет отправлено на указанный e-mail.

Я подтверждаю, что ознакомлен(а) с Пользовательским соглашением, принимаю его условия и даю свое согласие на обработку моих персональных данных.

Восстановить доступ

E-mail или логин

Ссылка на создание нового пароля будет отправлена на указанный e-mail.