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