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