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