Как правильно настроить формулу в ресурсах СКД для расчета экономии топлива по группировкам?

Программист Управленческий учет
← На главную

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

Различие между вычисляемыми полями и ресурсами

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

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

Рассмотрим ситуацию автора: формула ЛинейнаяНорма * Пробег за период / 100 - КоличествоРасход, прописанная в вычисляемом поле, корректно отработает для одной поездки одного автомобиля. Однако для организации, где работают десятки машин с разными нормами, простое суммирование этого поля может привести к ошибке.

Математическая ловушка: Сумма произведений vs Произведение сумм

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

Авто 1: Норма 10 л, Пробег 100 км. Экономия = 10 * 100 / 100 = 10 л.

Авто 2: Норма 20 л, Пробег 200 км. Экономия = 20 * 200 / 100 = 40 л.

Итого экономия должна быть 50 л.

Если мы будем использовать формулу Сумма(ЛинейнаяНорма) * Сумма(Пробег) / 100, то получим:

(10 + 20) * (100 + 200) / 100 = 30 * 300 / 100 = 90 л.

Это в корне неверно! Произведение сумм не равно сумме произведений.

Правильное выражение для ресурса должно выглядеть так:

Сумма(ЛинейнаяНорма * ПробегЗаПериод) / 100 - Сумма(КоличествоРасход)

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

Настройка ресурса по конкретным группировкам

Бывают случаи, когда логика расчета должна меняться в зависимости от того, какой уровень отчета мы смотрим. Проанализируем колонку Рассчитывать по... в таблице ресурсов. Если оставить это поле пустым, формула будет применяться ко всем уровням. Но мы можем добавить одну и ту же колонку «Экономия» несколько раз:

Важный нюанс: как было отмечено в сообщении (12), вычисляемое выражение (ресурс) не может суммировать само себя напрямую через Сумма(ИмяРесурса). Вам всегда нужно оперировать исходными данными — теми полями, которые пришли из набора данных (запроса).

Обработка пустых значений (NULL) и точность

Чтобы отчет не «развалился» и не выдавал пустые ячейки, если пробег не был заполнен, рекомендуется использовать функцию ЕстьNull(). Рассмотрим более надежный вариант формулы:


Сумма(ЕстьNull(ЛинейнаяНорма, 0) * ЕстьNull(ПробегЗаПериод, 0)) / 100 
- Сумма(ЕстьNull(КоличествоРасход, 0))

Также не забываем про округление. ГСМ — это сфера, где точность важна до граммов. Используем функцию Окр() в выражении ресурса:

Окр(Сумма(ЛинейнаяНорма * ПробегЗаПериод) / 100 - Сумма(КоличествоРасход), 3)

Рекомендации по производительности

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

  1. В самом тексте Запроса создадим поле НормативныйРасход, где сразу вычислим ЛинейнаяНорма * Пробег / 100.
  2. В СКД на вкладке «Ресурсы» нам останется только прописать простую агрегацию: Сумма(НормативныйРасход) - Сумма(КоличествоРасход).

Такой подход считается «золотым стандартом» разработки, так как база данных (SQL) справляется с простыми арифметическими операциями быстрее, чем движок СКД в процессе формирования итогов.

Итоги настройки

Подведем итог наших действий для настройки корректного отчета по топливу:

  1. Убеждаемся, что поля ЛинейнаяНорма, Пробег и Расход доступны в наборе данных.
  2. Переходим на вкладку Ресурсы.
  3. Добавляем новое поле (например, ЭкономияПерерасход).
  4. В колонку «Выражение» вписываем формулу через агрегатные функции: Сумма(ЛинейнаяНорма * Пробег) / 100 - Сумма(КоличествоРасход).
  5. Проверяем, что в колонке «Рассчитывать по» не выбрано лишних ограничений, чтобы формула работала и в итогах по организации, и в общих итогах.

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

← На главную