При разработке отчетов на системе компоновки данных (СКД) одной из самых распространенных задач является расчет производных показателей, таких как процент выполнения, доля брака или рентабельность. Начинающие разработчики часто сталкиваются с ситуацией, когда в детальных записях расчет выглядит верным, но в итогах группировок выводятся бессмысленные цифры (например, 900% или 1000%). В этой статье мы подробно разберем, почему это происходит и как правильно настроить формулы для получения корректных результатов на всех уровнях отчета.
Рассмотрим стандартную ситуацию: в отчете есть два показателя — НеВСрок и ВсегоЗадач. Нам нужно получить поле Процент. Типичная ошибка заключается в том, что формула НеВСрок / ВсегоЗадач * 100 прописывается только на закладке Вычисляемые поля.
В этом случае СКД работает следующим образом: она вычисляет процент для каждой конкретной строки данных. Когда дело доходит до формирования итогов по группировке (например, по подразделению или сотруднику), система по умолчанию просто суммирует эти уже вычисленные проценты. Если в подразделении 10 сотрудников и у каждого 90% выполнения, система выдаст итог в 900%, что является логической ошибкой. Нам же нужно, чтобы система сначала просуммировала все задачи, а потом выполнила деление сумм.
Для того чтобы расчет выполнялся корректно на уровне итогов, основную логику вычислений необходимо перенести на закладку Ресурсы. Давайте разберем по шагам, как это сделать.
Проанализируем правильный подход к написанию формулы ресурса. Вместо простого деления полей мы должны использовать агрегатные функции, такие как Сумма(). Это заставит систему сначала вычислить общие итоги по слагаемым, а затем применить к ним арифметические действия.
Перейдем на вкладку Ресурсы и для нашего поля Процент укажем следующее выражение:
Сумма(НеВСрок) / Сумма(ВсегоЗадач) * 100
При такой настройке СКД для каждой строки группировки сначала сложит все значения НеВСрок, затем все значения ВсегоЗадач, и только после этого разделит одно на другое. Это обеспечит математически верный результат независимо от уровня вложенности группировок.
В реальных данных поле ВсегоЗадач может принимать нулевое значение (например, если за выбранный период задач не было). Если не предусмотреть проверку, отчет может вывести ошибку или пустое значение. Проанализируем, как добавить условие в формулу ресурса:
ВЫБОР
КОГДА Сумма(ВсегоЗадач) <> 0
ТОГДА Сумма(НеВСрок) / Сумма(ВсегоЗадач) * 100
ИНАЧЕ 0
КОНЕЦ
Именно такой подход гарантирует стабильную работу отчета даже при неполных или «грязных» данных. Мы используем конструкцию ВЫБОР КОГДА... ТОГДА... ИНАЧЕ... КОНЕЦ, которая является универсальным инструментом в языке выражений СКД.
Часто при объединении нескольких наборов данных или использовании левых соединений в запросе возникают значения NULL. Эти значения могут исказить математические расчеты. Выясним причину: NULL — это не число, и любая операция с ним (сложение или деление) может привести к неопределенному результату.
Рекомендуется оборачивать поля в функцию ЕстьNULL() еще на этапе запроса или непосредственно в формуле ресурса. Рассмотрим более сложный, но надежный пример формулы:
ВЫБОР
КОГДА Сумма(ЕстьNULL(ВсегоЗадач, 0)) = 0
ТОГДА 0
ИНАЧЕ Сумма(ЕстьNULL(НеВСрок, 0)) / Сумма(ЕстьNULL(ВсегоЗадач, 0)) * 100
КОНЕЦ
Здесь мы гарантируем, что даже если данных нет, система будет оперировать нулем, а не NULL, что предотвратит возможные сбои в расчетах.
По умолчанию результат деления может содержать большое количество знаков после запятой. Чтобы отчет выглядел профессионально, необходимо настроить округление. Сделаем это с помощью функции Окр().
Добавим округление до двух знаков после запятой в нашу формулу ресурса:
Окр(ВЫБОР КОГДА Сумма(ВсегоЗадач) <> 0 ТОГДА Сумма(НеВСрок) / Сумма(ВсегоЗадач) * 100 ИНАЧЕ 0 КОНЕЦ, 2)
Однако существует и альтернативный, более гибкий способ оформления — через Условное оформление или настройки поля. Разберем его подробнее:
Процент.Преимущество этого метода в том, что в самом поле данных сохраняется точное число, а округление происходит только в момент визуализации пользователю. Также в формате можно добавить суффикс %, чтобы число выглядело как 12,50 %.
Иногда логика расчета процента на уровне детальных записей и на уровне общих итогов должна различаться. В СКД на вкладке Ресурсы есть колонка Рассчитывать по. Если оставить её пустой, формула будет применяться ко всем группировкам. Если же выбрать конкретную группировку, формула будет работать только для неё.
Это полезно, когда, например, на уровне строк вы хотите видеть просто флаг (0 или 100), а на уровне итогов — средневзвешенный процент. Рассмотрим пошагово:
Процент в ресурсы дважды.Сумма() и выберем расчет по всем остальным группировкам и Общему итогу.Бывают задачи, когда нужно понять, какой вклад вносит текущая группировка в общий результат всего отчета. Для этого в СКД предусмотрена мощная функция ВычислитьВыражение. Проанализируем пример расчета доли:
Сумма(ВсегоЗадач) / ВычислитьВыражение("Сумма(ВсегоЗадач)", "ОбщийИтог") * 100
В данном случае второй параметр "ОбщийИтог" говорит системе, что знаменатель нужно вычислить по всему набору данных, игнорируя фильтры текущей группировки. Это позволяет строить отчеты со структурой «Доля продаж подразделения в общих продажах компании».
Если алгоритм расчета крайне сложен (например, требует учета производственного календаря, часовых поясов или обращения к кэшированным данным), стандартных средств выражений СКД может не хватить. В этом случае мы можем вызвать экспортную функцию из общего модуля 1С.
Настроим вызов функции в поле выражения:
МойОбщийМодуль.РассчитатьСложныйПроцент(Сумма(НеВСрок), Сумма(ВсегоЗадач))
Важно: Общий модуль должен иметь установленные флаги Сервер, Внешнее соединение и содержать экспортные процедуры. Помните, что злоупотребление вызовами общих модулей в ресурсах СКД может существенно замедлить формирование отчета, так как функция будет вызываться для каждой строки итогов.
Для корректного вывода процентных полей в СКД необходимо придерживаться следующих правил:
Сумма, Количество) в формулах на вкладке Ресурсы.ВЫБОР.ЕстьNULL для защиты от пустых значений в наборах данных.Соблюдение этих принципов позволит вам создавать точные и надежные отчеты, которые корректно отражают ключевые показатели эффективности бизнеса на любом уровне детализации.