При построении отчетов в 1С с использованием Системы Компоновки Данных (СКД) часто возникает задача расчета относительных показателей, например, процента возврата или рентабельности. Для предварительного анализа данных и проверки корректности формул удобно использовать консоль запросов и СКД, которая позволяет быстро отладить результат. Проблема проявляется, когда мы смотрим на итоговые строки по группировкам (например, по контрагентам или номенклатурным группам). Вместо того чтобы пересчитать процент на основе итоговых данных, СКД по умолчанию просто суммирует уже вычисленные проценты из детальных записей, что приводит к некорректным результатам. Давайте разберемся, как настроить отчет так, чтобы итоги считались правильно.
Проанализируем типичную ситуацию. Допустим, у нас есть отчет, который выводит данные по отгрузкам и возвратам товаров в разрезе подразделений и контрагентов. Мы хотим видеть процент возврата по каждой строке, который рассчитывается по формуле:
(Количество возвращено / Количество отгружено) * 100
В детальных записях (например, по каждому подразделению) этот процент рассчитывается верно. Но когда СКД формирует итоговую строку по группировке "Контрагент", она берет уже готовые значения из колонки "Процент возврата" и просто складывает их. Это в корне неверно. Процент от суммы не равен сумме процентов.
Например, если по одному подразделению было отгружено 10 шт. и возвращено 1 шт. (10%), а по другому — отгружено 20 шт. и возвращено 3 шт. (15%), то в итоге по контрагенту СКД может показать 10% + 15% = 25%. Правильный же расчет должен быть таким:
(Сумма всех возвратов / Сумма всех отгрузок) * 100 = ((1 + 3) / (10 + 20)) * 100 = (4 / 30) * 100 ≈ 13.3%
Причина такого поведения в том, что для итогов по умолчанию используется агрегатная функция СУММА(), примененная к уже рассчитанному полю. Наша задача — указать СКД, как именно нужно вычислять итог для этого поля.
Самый правильный и надежный способ решить эту задачу — задать специальную формулу для расчета ресурса в итогах. Это делается на вкладке "Ресурсы" в настройках схемы компоновки данных. Разберем по шагам настройку в конструкторе:
ПроцентВозврата.Сумма(ПроцентВозврата) или просто ПроцентВозврата. Это и есть источник проблемы.Формула должна выглядеть так:
Сумма(ПолеСВозвратами) / Сумма(ПолеСОтгрузками) * 100
Здесь СУММА() — это агрегатная функция СКД. Когда система будет считать итог для любой группировки, она сначала просуммирует значения в поле ПолеСВозвратами для всех записей этой группы, затем просуммирует значения в поле ПолеСОтгрузками и только потом разделит одно на другое и умножит на 100. Это гарантирует корректный расчет на любом уровне вложенности группировок.
В рассматриваемой на форуме теме поля назывались КоличествоОборотКт (возвраты) и КоличествоОборотДт (отгрузки). Расчет процента в запросе для детальных записей выглядел так:
ВЫБОР
КОГДА ХозрасчетныйОстаткиИОбороты.КоличествоОборотКт = 0
ТОГДА 0
ИНАЧЕ ВЫБОР
КОГДА
ХозрасчетныйОстаткиИОбороты.КоличествоОборотДт = 0
ТОГДА 0
ИНАЧЕ ОКР(ХозрасчетныйОстаткиИОбороты.КоличествоОборотКт / ХозрасчетныйОстаткиИОбороты.КоличествоОборотДт * 100, 0)
КОНЕЦ
КОНЕЦ КАК ПроцентВозврата
Этот код отлично работает для каждой отдельной строки, но для итогов нам нужна другая логика. В настройках ресурса ПроцентВозврата необходимо прописать выражение, которое также учитывает возможное деление на ноль.
Корректное выражение для ресурса в СКД:
ВЫБОР
КОГДА Сумма(КоличествоОборотДт) = 0
ТОГДА 0
ИНАЧЕ Сумма(КоличествоОборотКт) * 100 / Сумма(КоличествоОборотДт)
КОНЕЦ
Эта конструкция надежно защитит ваш отчет от ошибок. Сначала она проверит, не равна ли нулю сумма по полю КоличествоОборотДт для текущей группировки. Если равна, то итоговый процент будет 0. В противном случае будет выполнен корректный расчет.
Помимо прямого редактирования выражения ресурса, существуют и другие способы, которые могут пригодиться в более сложных случаях.
ВычислитьВыражение(). Это мощный инструмент СКД, который позволяет вычислять выражение в контексте другой группировки. Например, для расчета доли от общего итога.Если же стандартное оформление итогов вас не устраивает, всегда доступно программное изменение заголовка группировки отчета СКД, что позволит сделать отчет более информативным.
Таким образом, ключевое правило при расчете неаддитивных показателей (процентов, средних значений, коэффициентов) в итогах СКД — всегда определять для ресурса собственное выражение для расчета, основанное на агрегатных функциях (СУММА, КОЛИЧЕСТВО, СРЕДНЕЕ) от исходных, "сырых" данных. Это позволит вашим отчетам всегда показывать корректные и осмысленные итоговые цифры.