Почему не отображаются показатели в Построителе отчета при переносе запроса из СКД?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При переносе запросов из Системы компоновки данных (СКД) в отчеты, использующие объект платформы ПостроительОтчета или типовой каркас УниверсальныйОтчет (в обычных формах), разработчики часто сталкиваются с ситуацией: структура отчета формируется, группировки выводятся корректно, вызовы добавления показателей отрабатывают без ошибок, однако сами ячейки с числовыми показателями остаются абсолютно пустыми.

Разберем детально, почему возникает такое поведение, в чем заключается принципиальная архитектурная разница между механизмами агрегации СКД и Построителя отчета, а также рассмотрим по шагам, как исправить эту ошибку и избежать сопутствующих проблем.

В чем заключается архитектурная причина проблемы?

Проанализируем работу двух механизмов агрегации платформы 1С:Предприятие:

  1. Система компоновки данных (СКД): рассчитывает ресурсы собственным программным процессором. В запросе СКД достаточно просто выбрать поля в блоке ВЫБРАТЬ, а правила агрегации (сумма, максимум, среднее) настраиваются на отдельной вкладке «Ресурсы». В сам текст запроса секция ИТОГИ, как правило, не включается.
  2. Построитель отчета: опирается исключительно на встроенные возможности языка запросов 1С. Построитель не умеет автоматически вычислять агрегаты для группировок, если они не описаны в блоке ИТОГИ. Если поле присутствует только в секции ВЫБРАТЬ, механизм воспринимает его как обычный детальный реквизит. При формировании группировок без вывода детальных записей такое поле не имеет значений на верхних уровнях, из-за чего ячейки отчета остаются пустыми.

Таким образом, простого копирования запроса из СКД в ПостроительОтчета недостаточно: необходимо явно указать языку запросов, какие числовые поля являются ресурсами и как именно их следует агрегировать.

Пошаговое решение проблемы

Выясним последовательность действий для корректной настройки отчета.

  1. Добавление секции итогов в текст запроса. В тексте запроса, который передается в свойство ПостроительОтчета.Текст, необходимо явно дописать блок ИТОГИ с агрегатными функциями (например, СУММА(), МАКСИМУМ(), МИНИМУМ()). Достаточно указать расчет общих итогов по ключевым ресурсам:

ВЫБРАТЬ
    ПродажиОбороты.Номенклатура КАК Номенклатура,
    ПродажиОбороты.Контрагент КАК Контрагент,
    ПродажиОбороты.КоличествоОборот КАК Количество,
    ПродажиОбороты.СуммаОборот КАК Сумма
{ВЫБРАТЬ
    Номенклатура.*,
    Контрагент.*,
    Количество,
    Сумма}
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, Авто, ) КАК ПродажиОбороты
{ГДЕ
    ПродажиОбороты.Номенклатура.*,
    ПродажиОбороты.Контрагент.*}
{ИТОГИ ПО
    Номенклатура.*,
    Контрагент.*}
ИТОГИ
    СУММА(Количество),
    СУММА(Сумма)
ПО
    ОБЩИЕ

Обратим внимание на разницу: синтаксическая конструкция автонастройки {ИТОГИ ПО ...} указывает построителю, по каким измерениям пользователь сможет группировать данные, а блок ИТОГИ СУММА(...) ПО ОБЩИЕ указывает платформе, какие именно поля должны рассчитываться как ресурсы.

  1. Программное добавление показателей. Если отчет строится на базе объекта УниверсальныйОтчет, в процедуре УстановитьНачальныеНастройки связываем имена полей запроса с показателями отчета:

// Добавляем показатели с указанием имени поля запроса, представления и формата
УниверсальныйОтчет.ДобавитьПоказатель("Количество", "Количество", Истина, "ЧЦ=15; ЧДЦ=3");
УниверсальныйОтчет.ДобавитьПоказатель("Сумма", "Сумма выручки", Истина, "ЧЦ=15; ЧДЦ=2");

Дополнительные технические нюансы и ограничения

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

  1. Использование пакетных запросов. Если запрос содержит создание временных таблиц (пакетный запрос), важно помнить: конструкции расширения языка запросов для построителя ({ВЫБРАТЬ}, {ГДЕ}, {ИТОГИ}) корректно применяются платформой только к последнему запросу пакета. Нельзя размещать инструкции построителя во временных таблицах пакета.
  2. Кэширование сохраненных настроек пользователя. Механизм УниверсальныйОтчет автоматически восстанавливает последние сохраненные настройки пользователя при открытии. Если вы изменили текст запроса или состав показателей в конфигураторе, старые настройки пользователя могут переопределить программную инициализацию (например, флажки видимости показателей могут оказаться снятыми). В форме отчета необходимо нажать кнопку «Восстановить стандартные настройки».
  3. Обработка значений NULL. При использовании левых соединений (ЛЕВОЕ СОЕДИНЕНИЕ) отсутствующие значения в числовых полях принимают значение NULL. Рекомендуется оборачивать такие поля функцией ЕСТЬNULL(Поле, 0), чтобы предотвратить появление пустых ячеек при суммировании.
  4. Форматная строка показателей. Проверьте параметр формата в методе ДобавитьПоказатель. Если строка содержит параметр ЧЗ=0 (не отображать нулевые значения), то при нулевых итогах ячейка останется пустой, что визуально может восприниматься как ошибка расчета.
  5. Порядок вызова методов инициализации. Текст запроса должен присваиваться объекту ПостроительОтчета строго до того, как вызываются методы программной настройки группировок, порядка и колонок. Нарушение последовательности приводит к тому, что коллекция доступных полей построителя не успевает обновиться.
← На главную