Как в СКД рассчитать маржинальность по группировкам при сохранении детальных записей

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

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

Анализируем причину некорректных расчетов

Разберем ситуацию: у нас есть поля ВаловаяПрибыль и Выручка. Нам нужно получить поле Маржинальность, рассчитанное по формуле: 100 * ВаловаяПрибыль / Выручка. Если мы просто пропишем эту формулу в вычисляемых полях или в ресурсах без использования агрегатных функций, СКД может попытаться просто просуммировать проценты, рассчитанные в каждой строке. Это методологическая ошибка.

Проанализируем пример: в одной сделке выручка 100 рублей и прибыль 10 рублей (маржа 10%), во второй — выручка 1000 рублей и прибыль 500 рублей (маржа 50%). Если СКД просто сложит проценты, мы получим 60%, что неверно. Правильный расчет для итога должен выглядеть так: 100 * (10 + 500) / (100 + 1000), что составит примерно 46,3%.

Решение 1. Использование агрегатных функций в ресурсах

Первое и самое важное правило: в СКД формулы для ресурсов всегда должны содержать агрегатные функции, такие как Сумма(), Среднее() или Максимум(). Для расчета маржинальности на вкладке Ресурсы необходимо прописать следующее выражение:

100 * Сумма(ВаловаяПрибыль) / Сумма(Выручка)

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

Решение 2. Обработка деления на ноль

Рассмотрим ситуацию, когда в отчете за определенный период не было продаж или были только возвраты, из-за чего Выручка стала равной нулю. В этом случае отчет может выдать ошибку или пустое значение. Чтобы избежать этого, используем проверку условия непосредственно в выражении ресурса:


ВЫБОР 
    КОГДА Сумма(Выручка) = 0 
    ТОГДА 0 
    ИНАЧЕ 100 * Сумма(ВаловаяПрибыль) / Сумма(Выручка) 
КОНЕЦ

Это выражение обеспечит стабильность работы отчета при любых входных данных.

Решение 3. Разделение логики для детальных записей и группировок

Бывают случаи, когда пользователь хочет видеть одну логику расчета в строках документа (детальных записях) и совершенно другую — в итогах по месяцам. В СКД для этого предусмотрена колонка Рассчитывать по... во вкладке Ресурсы.

Выясним, как это настроить по шагам:

  1. Добавьте поле Маржинальность в список ресурсов дважды.
  2. Для первой строки оставьте выражение Маржинальность (без суммы) и в колонке "Рассчитывать по..." выберите только Детальные записи.
  3. Для второй строки пропишите формулу 100 * Сумма(ВаловаяПрибыль) / Сумма(Выручка) и в колонке "Рассчитывать по..." укажите все необходимые группировки (например, Месяц, Контрагент) и Общий итог.

Это позволит жестко разграничить контексты вычисления и избежать путаницы в данных.

Решение 4. Использование системного поля Уровень()

Если вы не хотите плодить строки в ресурсах, можно использовать функцию Уровень() для определения текущего контекста расчета прямо в формуле. Рассмотрим пример:


ВЫБОР 
    КОГДА Уровень() = 0 ТОГДА 
        "Это общий итог: " + Формат(100 * Сумма(ВаловаяПрибыль) / Сумма(Выручка), "ЧДЦ=2")
    ИНАЧЕ 
        100 * Сумма(ВаловаяПрибыль) / Сумма(Выручка)
КОНЕЦ

Хотя этот метод чаще применяется для оформления, он дает понимание того, на каком уровне иерархии СКД сейчас производит вычисление.

Решение 5. Настройка ролей полей и периодов

Иногда функции ВычислитьВыражение или стандартные агрегаты работают странно, если СКД не понимает иерархию времени. Проанализируем настройки набора данных. Если вы группируете по месяцу, убедитесь, что у поля Месяц в колонке Роль указано, что это Период.

Посмотрим на важные параметры роли:

Правильная расстановка ролей помогает СКД корректно выстраивать контексты группировок, что критично для правильной работы функции Сумма() в пределах периода.

Решение 6. Использование функции ВычислитьВыражениеСГруппировкойМассив

Это продвинутый метод, который полезен, если вам нужно посчитать, например, «Среднюю маржинальность среди всех менеджеров внутри месяца». Простая формула Сумма/Сумма даст средневзвешенное значение, а если нужно именно среднее арифметическое от процентов, поможет массив:


Среднее(ВычислитьВыражениеСГруппировкойМассив("100 * Сумма(ВаловаяПрибыль) / Сумма(Выручка)", "Менеджер"))

Здесь система сначала рассчитает маржу для каждого менеджера отдельно, соберет эти результаты в массив, а затем вычислит среднее значение из этого массива для итога по месяцу. Это мощный инструмент для решения сложных аналитических задач.

Заключение

Мы рассмотрели основные способы настройки расчета маржинальности в СКД. Подведем итог: всегда используйте Сумма() / Сумма() для процентов в ресурсах, не забывайте про проверку на ноль и используйте настройку Рассчитывать по..., если логика детальных записей должна отличаться от итогов. Эти правила позволят вам создавать точные и профессиональные отчеты в 1С.

← На главную