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