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