Запретить СКД изменять запрос. СКД меняет запрос. СКД оптимизирует итоговый запрос.
Сегодня неожиданно столкнулся с такой проблемой. Был очень удивлен.
Сделал сложный запрос в консоли запросов. Этот запрос планировал использовать для отчета СКД.
Радостный добавил запрос в СКД и тут получаю другой результат!!!
До этого ни разу с такой проблемой не сталкивался и поэтому долго искал причину. СКД изменил запрос! Это... как бы помягче сказать очень неприятно!
В итоге обрезал место, где скд меняет запрос и через консоль СКД начал мучать отчет.
Вот простейший запрос. 2 временные таблицы и выборка.
Что делает запрос:
Нужно по менеджеру выбрать клиентов, которым он продал на сумму параметра &порогВыручкиПоТорговойТочке. Просуммировать сколько у каждого менеджера таких клиентов.
Как делает:
1 Из регистра накопления "ПродажиОбороты" выбирает записи за определенный период во временную таблицу "ПродажиЗаПериод".
2 Делает выборку Менеджер, Контрагент, Выручка, выч.поле "Торговая точка подходит под категорию"(если сумма выручки больше &порог то 1 иначе 0). Пишет выборку во временную таблицу "Торговые точки".
3 Делает выборку из "торговые точки". Группирует по менеджерам, суммирует поле "ТорговаяТочкаПодходитПодДиректорию".
ВЫБРАТЬ
ПродажиОбороты.Контрагент КАК Контрагент,
ПродажиОбороты.Контрагент.ОсновнойМенеджерПокупателя КАК Менеджер,
ЕСТЬNULL(ПродажиОбороты.СтоимостьОборот, 0) КАК Выручка
ПОМЕСТИТЬ ПродажиЗаПериод
ИЗ
РегистрНакопления.Продажи.Обороты(НАЧАЛОПЕРИОДА(&датаНачала, ДЕНЬ), КОНЕЦПЕРИОДА(&датаКонца, ДЕНЬ), Регистратор, ) КАК ПродажиОбороты
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ПродажиЗаПериод.Менеджер КАК Менеджер,
ВЫБОР
КОГДА СУММА(ПродажиЗаПериод.Выручка) > &порогВыручкиПоТорговойТочкеДляУчетаТоргТочки
ТОГДА 1
ИНАЧЕ 0
КОНЕЦ КАК ТорговаяТочкаПодходитПодКатегорию,
ПродажиЗаПериод.Контрагент,
СУММА(ПродажиЗаПериод.Выручка) КАК Выручка
ПОМЕСТИТЬ торговыеТочки
ИЗ
ПродажиЗаПериод КАК ПродажиЗаПериод
СГРУППИРОВАТЬ ПО
ПродажиЗаПериод.Менеджер,
ПродажиЗаПериод.Контрагент
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
торговыеТочки.Менеджер КАК Менеджер,
СУММА(торговыеТочки.ТорговаяТочкаПодходитПодКатегорию) КАК ТорговыеТочки
ИЗ
торговыеТочки КАК торговыеТочки
СГРУППИРОВАТЬ ПО
торговыеТочки.Менеджер
Красным я выделил что удалит СКД. Можете сами проверить. Соответственно запрос становится совершенно неправильным.
Теперь выручка считается не по контрагентам, а просто по каждому менеджеру.
Вот сравнение через блокнот.
Причина найдена.
Удаляет он "ПродажиЗаПериод.Контрагент" потому что я не использую это поле далее. Логично. Мне нужно чтобы он не удалял группировку по "ПродажиЗаПериод.Контрагент".
Искал ответ в интернете.
Предложили такие способы. НЕ ПЫТАЙТЕСЬ ВСЕ ИХ СРАЗУ ПРОВЕРИТЬ, В КОНЦЕ ПРЕДЛОЖУ ПРОСТЕЙШЕЕ РЕШЕНИЕ.
1 В выборку добавлять не просто поле, а через выразить. Типо "Выразить(ПродажиЗаПериод.Контрагент как справочник.пользователи). НЕ СРАБОТАЛО
2 Вытащить это поле в конечную выборку и для поля в роли выбрать "обязательное". У меня 10 временных таблиц до конечной выборки, через все буду тащить? НЕ СТАЛ ПРОВЕРЯТЬ
3 Грузить в скд уже готовый набор данных. Вот это верный подход. Посмотреть его можно тут. Работать он точно будет. Возьму на вооружение.
Итак простейшее решение.
1 НЕ ДОБАВЛЯТЬ В ВЫБОРКУ ПОЛЯ, КОТОРЫЕ НЕ БУДЕТЕ ИСПОЛЬЗОВАТЬ ДАЛЬШЕ.
2 А КАК ЖЕ ДЕЛАТЬ ГРУППИРОВКУ? ЛЕГКО! ДЛЯ ЭТОГО НЕ НУЖНО ДОБАВЛЯТЬ ПОЛЕ В ВЫБОРКУ. НУЖНО ПРОСТО ПЕРЕЙТИ НА ВКЛАДКУ "ГРУППИРОВКА", ОТКРЫТЬ СПИСОК "ВСЕ ПОЛЯ" И ВЫБРАТЬ НУЖНОЕ ПОЛЕ. ВОТ ТОГДА СКД НЕ БУДЕТ УДАЛЯТЬ ВАШУ ГРУППИРОВКУ!
Очевидно, но т.к. я нигде не нашел такого решения, решил сделать эту статью.
Покажу на этом же примере.
Вот как было:
И т.к. далее я не использовал "Контрагент" СКД удалила поле и из выборки и из группировки.
Вот как нужно делать:
Этот запрос СКД не будет оптимизировать, т.к. теперь он сделан корректно.