новое событие
Информационный поток
Задания вакансии материалы разработки сообщения форума

Неиспользуемые поля в конечных запросах построителя отчетов и СКД

  • Добавить свою публикацию
  • для этого требуется регистрация

Работая с конфигурацией "Консолидация", вплотную столкнулся с одним механизмом работы построителя отчетов (т.к. в этой конфигурации все завязано на построителе).

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

Для примера возьмем справочник подразделений, у которого есть реквизит «Головное подразделение». Тестовая таблица выглядит так:

Изображение

Запрос будет выглядеть следующим образом:

 

 

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

 

 

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

Изображение

Возникает резонный вопрос: «Что за … ?». Давайте проанализируем итоговый текст запроса, который формирует сам построитель. Мы увидим, что текст запроса будет следующим:

 

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

 

 

Т.е. построитель, неиспользуемое поле «Подразделение» дополнительно убрал и из временной таблицы (видимо в целях оптимизации). Осталось выяснить, для всех ли временных таблиц такое происходит. Добавим в запрос промежуточную временную таблицу, в которой просто выберем результат предыдущей:

 

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

 

 

Выполнив запрос, мы получим результат:

Изображение

Т.е. мы получили верные логические результаты. Давайте посмотрим на запрос, который формирует построитель:

 

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

 

 

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

Проделав эти же манипуляции со схемой компоновки данных, можно убедится, что и она работает абсолютно так же.

Вывод: Оптимизация это конечно хорошо, но иногда надо быть осторожным.

 
0
Читайте также
Разработки
Карточная игра:"Найди пару"
Игра карточная на время
Каталог с изображениями в Торговле
Как создать каталог с картинками в УТ 10.3
Еще от автора
≡ к списку статей