При разработке отчетов в Системе компоновки данных (СКД) разработчики часто сталкиваются с ситуацией, когда колонка с расчетом процента (например, «Процент выполнения» или «Процент оплаты») остается абсолютно пустой или не рассчитывается в группировках. Проанализируем основные причины возникновения этой проблемы и разберем по шагам, как правильно организовать расчет показателей.
Распространенная ошибка при попытке защититься от деления на ноль — прямое сравнение поля со значением NULL через оператор равенства. В языке запросов 1С результат любого сравнения с NULL (включая Поле = NULL) всегда возвращает значение Ложь.
Рассмотрим неверный вариант написания конструкции ВЫБОР:
// Неверно: выражение Заказано = NULL всегда возвращает Ложь
ВЫБОР
КОГДА ВТ_СводныеДанные.Заказано = 0 ИЛИ ВТ_СводныеДанные.Заказано = NULL
ТОГДА 0
ИНАЧЕ ВТ_СводныеДанные.Оплачено * 100 / ВТ_СводныеДанные.Заказано
КОНЕЦ КАК ПроцентОплаты
Для корректной проверки отсутствующих значений используйте функцию ЕСТЬNULL() или оператор ЕСТЬ NULL:
// Верно: заменяем NULL на 0 перед проверкой
ВЫБОР
КОГДА ЕСТЬNULL(ВТ_СводныеДанные.Заказано, 0) = 0
ТОГДА 0
ИНАЧЕ ВТ_СводныеДанные.Оплачено * 100 / ВТ_СводныеДанные.Заказано
КОНЕЦ КАК ПроцентОплаты
Если данные по заказам и оплатам собираются из разных источников с помощью секции ОБЪЕДИНИТЬ ВСЕ без последующей группировки, показатели Заказано и Оплачено попадают в разные строки итогового набора данных.
В такой ситуации в одной строке заполнено значение Заказано (а Оплачено равно 0 или NULL), а в другой — наоборот. При вычислении процента на уровне детальных записей программа пытается разделить ноль или на ноль, из-за чего итоговый процент не рассчитывается.
Выясним, как это исправить:
ЛЕВОЕ СОЕДИНЕНИЕ) по ключевым полям (контрагент, договор, заказ).СГРУППИРОВАТЬ ПО) по измерениям перед расчетом вычислимых полей.При проверке типов документов в запросе не рекомендуется использовать функцию ТИПЗНАЧЕНИЯ() с конструктором ТИП(). Это может приводить к ошибкам вычисления выражений.
// Неверно
КОГДА ТИПЗНАЧЕНИЯ(ВТ_СводныеДанные.Регистратор) = ТИП(Документ.ПлатежноеПоручениеВходящее)
// Верно
КОГДА ВТ_СводныеДанные.Регистратор ССЫЛКА Документ.ПлатежноеПоручениеВходящее
Если результат деления равен нулю, платформа 1С по умолчанию может не отображать цифру 0 в ячейках отчета, вследствие чего колонка выглядит незаполненной. При этом простые арифметические операции (например, сложение или вычитание) выводят числа, создавая ощущение, что формула с процентом «не работает».
Для решения проблемы перейдем в настройки поля СКД и зададим явный формат отображения чисел:
ЧДЦ=2; ЧН=0.00 (параметр ЧН определяет представление нулевых значений).Даже если формула расчета процента корректно написана в запросе, в группировках и общих итогах СКД не сможет просто просуммировать проценты строк — это приведет к математически неверному результату. Если поле не добавлено в ресурсы с правильной формулой, ячейки итогов останутся пустыми.
Правильный подход — вычислять процент итогов через агрегатные функции на вкладке Ресурсы:
ПроцентВыполнения в список ресурсов.
ВЫБОР
КОГДА СУММА(Заказано) = 0 ТОГДА 0
ИНАЧЕ СУММА(Оплачено) * 100 / СУММА(Заказано)
КОНЕЦ
Такой способ гарантирует корректный расчет показателей как для детальных записей, так и для любых уровней группировок и общего итога отчета.