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