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

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием Управленческий учет Промышленность, строительство и АПК
← На главную

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

Разбор причины проблемы

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

Метод 1: Оптимизация запроса без жесткой группировки

Рассмотрим, как можно перестроить запрос, чтобы он стал более гибким. Вместо того чтобы принудительно группировать данные по дате внутри запроса, попробуем перенести всю логику агрегации на уровень СКД. Рассмотрим пример правильного подхода к написанию запроса:


ВЫБРАТЬ РАЗЛИЧНЫЕ
    ДанныеПроизводственногоКалендаря.Дата КАК Дата
ПОМЕСТИТЬ КВАН_Дни
ИЗ
    РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеПроизводственногоКалендаря
ГДЕ
    ДанныеПроизводственногоКалендаря.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)
    И ДанныеПроизводственногоКалендаря.Дата МЕЖДУ &НачалоПериода И &КонецПериода;

ВЫБРАТЬ
    Движения.Номенклатура КАК Номенклатура,
    Движения.Склад КАК Склад,
    Движения.Период КАК Дата,
    ВЫБОР
        КОГДА Движения.Период = &НачалоПериода ТОГДА Движения.ВНаличииКонечныйОстаток
        ИНАЧЕ ВЫБОР КОГДА Движения.Период > 0 ТОГДА 0 ИНАЧЕ 1 КОНЕЦ
    КОНЕЦ КАК КоличествоДней
ПОМЕСТИТЬ КВАН_НеСгруппированные_Количество
ИЗ
    КВАН_ОстаткиПоДням КАК Движения;

В этом варианте мы убираем СГРУППИРОВАТЬ ПО из последнего пакета запроса. Теперь СКД получит детальные данные и сама корректно выполнит группировку, основываясь на настройках пользователя. Это позволяет избежать конфликтов при «сворачивании» отчета по полям Номенклатура и Склад.

Метод 2: Использование вспомогательной временной таблицы

Если логика запроса слишком сложна и требует предварительной обработки, мы можем использовать дополнительную временную таблицу для финальной выборки. Это помогает «зафиксировать» состояние данных перед тем, как они попадут в механизм компоновки.

  1. Создайте временную таблицу, в которую поместите все рассчитанные данные без группировки.
  2. В последнем блоке запроса выберите данные из этой таблицы через ВЫБРАТЬ *.
  3. В настройках СКД назначьте поле Количество как Ресурс, установив выражение СУММА(Количество).

Рекомендации по настройке ресурсов

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

Используя эти приемы, вы сможете добиться стабильной работы ваших отчетов, избавившись от «магических» нулей при изменении группировок. Главное правило — старайтесь отдавать управление агрегацией СКД, а не жестко прописывать её в тексте запроса с помощью СГРУППИРОВАТЬ ПО.

← На главную