Почему в отчете СКД не заполняются итоги по группировкам и как правильно настроить нарастающий итог?

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

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

Рассмотрим подробнее причины возникновения таких ошибок и разберем по шагам, как правильно проектировать подобные отчеты, чтобы избежать «ручного» написания громоздких запросов.

Причина 1: Поле не является ресурсом

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

Если в схеме компоновки данных на закладке Наборы данных поле определено, но на закладке Ресурсы оно не добавлено, СКД будет выводить его значение только в детальных записях. Группировки верхнего уровня (Организация, Итого) не «знают», как именно нужно агрегировать это поле (складывать, брать среднее или максимум), поэтому оставляют ячейки пустыми.

Разберем, как это исправить:

  1. Перейдем на закладку Ресурсы в схеме СКД.
  2. Добавим все расчетные поля (ЯнварьДоход, ФевральДоход, ИтогоВзносы и т.д.) в список ресурсов.
  3. В колонке Выражение укажем функцию агрегации, например: Сумма(ЯнварьДоход).
  4. Проверим колонку Рассчитывать по.... Если там пусто, ресурс будет рассчитываться для всех группировок и общих итогов. Если же вы хотите видеть цифры только по конкретной группировке, укажите её явно.

Причина 2: «Жесткая» структура запроса (Антипаттерн)

В Сообщении 3 представлен запрос, где каждый месяц года выделен в отдельное поле через конструкцию ВЫБОР КОГДА. Это типичная ошибка, которая ограничивает возможности СКД. Рассмотрим, почему так делать не стоит:

Выясним причину, почему это влияет на итоги: когда вы создаете поля типа ЯнварьДоход, ФевральДоход, для СКД это абсолютно разные сущности. Правильнее передавать данные в «вертикальном» виде.

Рассмотрим пример правильного запроса:


ВЫБРАТЬ
    спРасчет.Организация,
    спРасчет.Сотрудник,
    спРасчет.Период,
    спРасчет.Доход,
    спРасчет.Взносы
ИЗ
    РегистрСведений.спРасчетСтраховыхВзносовРезультат КАК спРасчет

После этого в настройках отчета (закладка Настройки) мы используем элемент Таблица. В строках указываем Организация и Сотрудник, а в колонках — поле Период. В свойствах поля Период выберем дополнение периодов по месяцам. СКД сама «развернет» данные по горизонтали, и итоги по группировкам будут считаться автоматически и корректно.

Реализация нарастающего итога в СКД

В Сообщении 13 автор упоминает, что реализует нарастающий итог внутри запроса. Это делает отчет зависимым от того, какие фильтры наложит пользователь. Если пользователь выберет период с марта по май, а нарастающий итог посчитан в запросе с начала года, результат в отчете может оказаться непредсказуемым.

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

ВычислитьВыражение("Сумма(Доход)", "Период", "Группировка", "Первая", "Текущая")

Разберем параметры этой функции:

  1. "Сумма(Доход)" — что мы суммируем.
  2. "Период" — поле, по которому идет упорядочивание (вдоль какой «оси» считаем итог).
  3. "Группировка" — область расчета (в пределах текущей группировки).
  4. "Первая" и "Текущая" — указывают, что нужно брать данные от самой первой записи до текущей включительно.

Обработка значений NULL

Часто итоги не отображаются из-за наличия значений NULL в результатах запроса. Если в выражении ресурса происходит сложение, и одно из слагаемых — NULL, то итоговый результат тоже станет NULL (пустота).

Посмотрим на пример того, как обезопасить расчет ресурсов:

Вместо простого Сумма(Доход) на закладке ресурсов лучше использовать конструкцию:

ЕстьNull(Сумма(Доход), 0)

Или обрабатывать NULL прямо в запросе через функцию ЕСТЬNULL(Поле, 0). Это гарантирует, что агрегатные функции СКД всегда будут работать с числами.

Настройка ролей полей

Иногда СКД не понимает, как группировать данные, если у полей не настроены Роли. Это особенно актуально для регистров сведений и остатков. Если вы выводите данные за период, убедитесь, что:

Итоги

Если ваш отчет СКД выводит пустые итоги, выполните проверку по следующему чек-листу:

  1. Все ли поля, которые должны суммироваться в итогах, добавлены на вкладку «Ресурсы»?
  2. Не заполнена ли колонка «Рассчитывать по...» лишними ограничениями, мешающими расчету общих итогов?
  3. Используется ли вертикальная структура данных с последующим разворотом в «Таблицу» СКД вместо жестких колонок в запросе?
  4. Обработаны ли значения NULL в ресурсах?

Следуя этим правилам, вы получите гибкий, производительный и корректно работающий отчет, который будет легко поддерживать и изменять под требования пользователей.

← На главную