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