Как правильно рассчитать процент в итогах запроса 1С без использования СКД?

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

При построении отчетов в 1С с помощью прямых запросов к базе данных мы часто сталкиваемся с необходимостью вывода расчетных показателей — например, процента списания товара относительно его прихода. Многие разработчики, столкнувшись с задачей, интуитивно используют агрегатную функцию СРЕДНЕЕ для расчета процента в итоговых записях. Однако в большинстве случаев это приводит к математической ошибке.

Давайте разберем, почему возникает эта проблема и как ее исправить, чтобы итоги по группировкам считались корректно.

Суть проблемы: почему СРЕДНЕЕ дает неверный результат?

Представим, что у нас есть две строки с данными по складу:

Если мы будем использовать функцию СРЕДНЕЕ(Процент), система сложит 80% и 10% и разделит их на два, получив 45%. Однако, если мы посмотрим на общие показатели, то списано 180 единиц из 1100 прихода, что составляет всего около 16,3%. Разница очевидна: функция СРЕДНЕЕ усредняет проценты строк, а не вычисляет процент от суммарных значений.

Решение проблемы через изменение формулы в ИТОГАХ

Чтобы получить верный результат в отчете без использования СКД, нам необходимо отказаться от усреднения готовых процентов. Вместо этого мы должны вычислить отношение итоговых сумм прямо в секции ИТОГИ. Рассмотрим, как это сделать по шагам.

Разберем реализацию на примере кода

Допустим, ваш запрос уже содержит расчеты списания и прихода. В исходном варианте вы, вероятно, использовали конструкцию, похожую на эту:


ИТОГИ
    СУММА(КоличествоПриход),
    СУММА(СуммаСписание),
    СРЕДНЕЕ(Процент)
ПО
    Склад

Чтобы исправить ошибку, необходимо заменить СРЕДНЕЕ(Процент) на арифметическое выражение, которое делит общую сумму списания на общую сумму прихода. Поскольку мы работаем в контексте секции ИТОГИ, нам нужно убедиться, что деление на ноль обработано корректно.

Изменим наш код следующим образом:


ИТОГИ
    СУММА(КоличествоПриход),
    СУММА(СуммаСписание),
    СУММА(СуммаСписание) / ВЫБОР 
        КОГДА СУММА(СуммаПродажнаяПриход) = 0 ТОГДА 1 
        ИНАЧЕ СУММА(СуммаПродажнаяПриход) 
    КОНЕЦ * 100 КАК Процент
ПО
    Склад

Почему этот метод эффективен?

  1. Математическая точность: Мы всегда оперируем общими суммами для конкретной группировки. Если отчет свернут до уровня склада, вы получите процент списания по всему складу. Если отчет развернут до номенклатуры, формула пересчитается для каждой строки.
  2. Отсутствие лишних данных: Нам не нужно создавать дополнительные столбцы в выборке или менять структуру самого запроса.
  3. Универсальность: Данный подход работает в любом запросе 1С, где определена секция ИТОГИ, независимо от используемой конфигурации.

Рекомендация по использованию СКД

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

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


ВЫБОР
    КОГДА СуммаПрихода = 0 ТОГДА 0
    ИНАЧЕ СуммаСписания / СуммаПрихода * 100
КОНЕЦ

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

Теперь ваш отчет будет показывать верные цифры, а пользователи получат корректную аналитику по списаниям товаров!

← На главную