При разработке отчетов в Системе компоновки данных (СКД) одной из самых частых задач является создание расчетных показателей, таких как «Экономия или перерасход топлива». Начинающие разработчики часто сталкиваются с ситуацией, когда формула, которая кажется логичной, выдает правильный результат только в детальных записях, но совершенно ломается при попытке получить итоги по группировкам (например, по марке автомобиля или по организации в целом). Рассмотрим подробно, почему это происходит и как правильно настроить отчет, чтобы данные суммировались корректно на всех уровнях.
Первым делом проанализируем, где именно должна располагаться формула. В СКД есть две вкладки, которые часто путают: Вычисляемые поля и Ресурсы. Разберем по шагам их назначение:
Сумма(), Среднее(), Количество().Рассмотрим ситуацию автора: формула ЛинейнаяНорма * Пробег за период / 100 - КоличествоРасход, прописанная в вычисляемом поле, корректно отработает для одной поездки одного автомобиля. Однако для организации, где работают десятки машин с разными нормами, простое суммирование этого поля может привести к ошибке.
Выясним причину, по которой итоги могут считаться неверно. В обсуждении был поднят критически важный вопрос математики. Рассмотрим пример: есть два автомобиля.
Авто 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(ЛинейнаяНорма, 0) * ЕстьNull(ПробегЗаПериод, 0)) / 100
- Сумма(ЕстьNull(КоличествоРасход, 0))
Также не забываем про округление. ГСМ — это сфера, где точность важна до граммов. Используем функцию Окр() в выражении ресурса:
Окр(Сумма(ЛинейнаяНорма * ПробегЗаПериод) / 100 - Сумма(КоличествоРасход), 3)
Проанализируем ситуацию с точки зрения скорости работы отчета. Если данных очень много (сотни тысяч путевых листов), расчет сложных произведений на уровне компоновки может замедлить вывод. Посмотрим на альтернативный подход:
НормативныйРасход, где сразу вычислим ЛинейнаяНорма * Пробег / 100.Сумма(НормативныйРасход) - Сумма(КоличествоРасход).Такой подход считается «золотым стандартом» разработки, так как база данных (SQL) справляется с простыми арифметическими операциями быстрее, чем движок СКД в процессе формирования итогов.
Подведем итог наших действий для настройки корректного отчета по топливу:
ЛинейнаяНорма, Пробег и Расход доступны в наборе данных.ЭкономияПерерасход).Сумма(ЛинейнаяНорма * Пробег) / 100 - Сумма(КоличествоРасход).Следуя этой логике, вы получите гибкий и точный инструмент, который будет одинаково хорошо работать как для анализа эффективности одного конкретного водителя, так и для оценки работы всего автопарка предприятия.