Работая с конфигурацией "Консолидация", вплотную столкнулся с одним механизмом работы построителя отчетов (т.к. в этой конфигурации все завязано на построителе).
Смысл в том, что если в конечном запросе построителя не используются какие-то поля, то они вырезаются и из верхней подчиненной таблицы, что в некоторых случаях может привести к некорректным результатам. Приведем пример двух запросов, которые вроде бы должны давать идентичные данные, но на практике данные разнятся.
Для примера возьмем справочник подразделений, у которого есть реквизит «Головное подразделение». Тестовая таблица выглядит так:
Запрос будет выглядеть следующим образом:
ВЫБРАТЬ
Подразделения.ГоловноеПодразделение,
Подразделения.Ссылка КАК Подразделение,
1 КАК Количество
ПОМЕСТИТЬ Подр
ИЗ
Справочник.Подразделения КАК Подразделения
ГДЕ
НЕ Подразделения.ГоловноеПодразделение=ЗНАЧЕНИЕ(Справочник.Подразделения.ПустаяСсылка)
СГРУППИРОВАТЬ ПО
Подразделения.ГоловноеПодразделение,
Подразделения.Ссылка
;
ВЫБРАТЬ
Подр.ГоловноеПодразделение КАК ГоловноеПодразделение,
СУММА(Подр.Количество) КАК КоличествоГоловного
ИЗ
Подр КАК Подр
СГРУППИРОВАТЬ ПО
Подр.ГоловноеПодразделение
По логике, данный запрос должен нам показать, сколько подразделений содержится в каждом из головных подразделений. Но на практике, выполнив данный запрос построителем, мы получим следующие данные:
Возникает резонный вопрос: «Что за … ?». Давайте проанализируем итоговый текст запроса, который формирует сам построитель. Мы увидим, что текст запроса будет следующим:
ВЫБРАТЬ
Подразделения.ГоловноеПодразделение КАК ГоловноеПодразделение,
1 КАК Количество
ПОМЕСТИТЬ Подр
ИЗ
Справочник.Подразделения КАК Подразделения
ГДЕ
НЕ Подразделения.ГоловноеПодразделение=ЗНАЧЕНИЕ(Справочник.Подразделения.ПустаяСсылка)
СГРУППИРОВАТЬ ПО
Подразделения.ГоловноеПодразделение
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Подр.ГоловноеПодразделение КАК ГоловноеПодразделение,
СУММА(Подр.Количество) КАК КоличествоГоловного
ИЗ
Подр КАК Подр
СГРУППИРОВАТЬ ПО
Подр.ГоловноеПодразделение
Т.е. построитель, неиспользуемое поле «Подразделение» дополнительно убрал и из временной таблицы (видимо в целях оптимизации). Осталось выяснить, для всех ли временных таблиц такое происходит. Добавим в запрос промежуточную временную таблицу, в которой просто выберем результат предыдущей:
ВЫБРАТЬ
Подразделения.ГоловноеПодразделение,
Подразделения.Ссылка КАК Подразделение,
1 КАК Количество
ПОМЕСТИТЬ Подр1
ИЗ
Справочник.Подразделения КАК Подразделения
ГДЕ
НЕ Подразделения.ГоловноеПодразделение=ЗНАЧЕНИЕ(Справочник.Подразделения.ПустаяСсылка)
СГРУППИРОВАТЬ ПО
Подразделения.ГоловноеПодразделение,
Подразделения.Ссылка
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Подр1.ГоловноеПодразделение,
Подр1.Подразделение,
Подр1.Количество
ПОМЕСТИТЬ Подр
ИЗ
Подр1 КАК Подр1
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Подр.ГоловноеПодразделение КАК ГоловноеПодразделение,
СУММА(Подр.Количество) КАК КоличествоГоловного
ИЗ
Подр КАК Подр
СГРУППИРОВАТЬ ПО
Подр.ГоловноеПодразделение
Выполнив запрос, мы получим результат:
Т.е. мы получили верные логические результаты. Давайте посмотрим на запрос, который формирует построитель:
ВЫБРАТЬ
Подразделения.ГоловноеПодразделение КАК ГоловноеПодразделение,
Подразделения.Ссылка КАК Подразделение,
1 КАК Количество
ПОМЕСТИТЬ Подр1
ИЗ
Справочник.Подразделения КАК Подразделения
ГДЕ
НЕ Подразделения.ГоловноеПодразделение=ЗНАЧЕНИЕ(Справочник.Подразделения.ПустаяСсылка)
СГРУППИРОВАТЬ ПО
Подразделения.ГоловноеПодразделение,
Подразделения.Ссылка
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Подр1.ГоловноеПодразделение КАК ГоловноеПодразделение,
Подр1.Количество КАК Количество
ПОМЕСТИТЬ Подр
ИЗ
Подр1 КАК Подр1
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Подр.ГоловноеПодразделение КАК ГоловноеПодразделение,
СУММА(Подр.Количество) КАК КоличествоГоловного
ИЗ
Подр КАК Подр
СГРУППИРОВАТЬ ПО
Подр.ГоловноеПодразделение
Получается, что построитель убирает неиспользуемые поля только из временных таблиц первого уровня, поэтому мы и получили другой результат.
Проделав эти же манипуляции со схемой компоновки данных, можно убедится, что и она работает абсолютно так же.
Вывод: Оптимизация это конечно хорошо, но иногда надо быть осторожным.