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