При построении отчетов в 1С с помощью прямых запросов к базе данных мы часто сталкиваемся с необходимостью вывода расчетных показателей — например, процента списания товара относительно его прихода. Многие разработчики, столкнувшись с задачей, интуитивно используют агрегатную функцию СРЕДНЕЕ для расчета процента в итоговых записях. Однако в большинстве случаев это приводит к математической ошибке.
Давайте разберем, почему возникает эта проблема и как ее исправить, чтобы итоги по группировкам считались корректно.
СРЕДНЕЕ дает неверный результат?Представим, что у нас есть две строки с данными по складу:
Если мы будем использовать функцию СРЕДНЕЕ(Процент), система сложит 80% и 10% и разделит их на два, получив 45%. Однако, если мы посмотрим на общие показатели, то списано 180 единиц из 1100 прихода, что составляет всего около 16,3%. Разница очевидна: функция СРЕДНЕЕ усредняет проценты строк, а не вычисляет процент от суммарных значений.
Чтобы получить верный результат в отчете без использования СКД, нам необходимо отказаться от усреднения готовых процентов. Вместо этого мы должны вычислить отношение итоговых сумм прямо в секции ИТОГИ. Рассмотрим, как это сделать по шагам.
Допустим, ваш запрос уже содержит расчеты списания и прихода. В исходном варианте вы, вероятно, использовали конструкцию, похожую на эту:
ИТОГИ
СУММА(КоличествоПриход),
СУММА(СуммаСписание),
СРЕДНЕЕ(Процент)
ПО
Склад
Чтобы исправить ошибку, необходимо заменить СРЕДНЕЕ(Процент) на арифметическое выражение, которое делит общую сумму списания на общую сумму прихода. Поскольку мы работаем в контексте секции ИТОГИ, нам нужно убедиться, что деление на ноль обработано корректно.
Изменим наш код следующим образом:
ИТОГИ
СУММА(КоличествоПриход),
СУММА(СуммаСписание),
СУММА(СуммаСписание) / ВЫБОР
КОГДА СУММА(СуммаПродажнаяПриход) = 0 ТОГДА 1
ИНАЧЕ СУММА(СуммаПродажнаяПриход)
КОНЕЦ * 100 КАК Процент
ПО
Склад
ИТОГИ, независимо от используемой конфигурации.СКДХотя предложенный выше метод отлично работает в «чистых» запросах, мы всегда рекомендуем рассмотреть переход на использование СКД (Системы компоновки данных), если ваш отчет становится сложным.
Использование СКД избавляет от написания сложных формул в тексте запроса. В СКД вы просто выводите ресурсы СуммаСписания и СуммаПрихода, а затем создаете вычисляемое поле с формулой:
ВЫБОР
КОГДА СуммаПрихода = 0 ТОГДА 0
ИНАЧЕ СуммаСписания / СуммаПрихода * 100
КОНЕЦ
В настройках СКД достаточно указать, что для этого поля нужно рассчитывать итоги автоматически. Система сама поймет, что для группировки нужно сначала суммировать числитель и знаменатель, и только потом производить деление. Это самый надежный способ избежать ошибок в расчетах при построении отчетов в 1С.
Теперь ваш отчет будет показывать верные цифры, а пользователи получат корректную аналитику по списаниям товаров!