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

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

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

Причина 1. Некорректное сравнение с NULL в языке запросов

Распространенная ошибка при попытке защититься от деления на ноль — прямое сравнение поля со значением NULL через оператор равенства. В языке запросов 1С результат любого сравнения с NULL (включая Поле = NULL) всегда возвращает значение Ложь.

Рассмотрим неверный вариант написания конструкции ВЫБОР:


// Неверно: выражение Заказано = NULL всегда возвращает Ложь
ВЫБОР 
    КОГДА ВТ_СводныеДанные.Заказано = 0 ИЛИ ВТ_СводныеДанные.Заказано = NULL 
        ТОГДА 0 
    ИНАЧЕ ВТ_СводныеДанные.Оплачено * 100 / ВТ_СводныеДанные.Заказано 
КОНЕЦ КАК ПроцентОплаты

Для корректной проверки отсутствующих значений используйте функцию ЕСТЬNULL() или оператор ЕСТЬ NULL:


// Верно: заменяем NULL на 0 перед проверкой
ВЫБОР 
    КОГДА ЕСТЬNULL(ВТ_СводныеДанные.Заказано, 0) = 0 
        ТОГДА 0 
    ИНАЧЕ ВТ_СводныеДанные.Оплачено * 100 / ВТ_СводныеДанные.Заказано 
КОНЕЦ КАК ПроцентОплаты

Причина 2. Использование ОБЪЕДИНИТЬ вместо СОЕДИНЕНИЯ во временных таблицах

Если данные по заказам и оплатам собираются из разных источников с помощью секции ОБЪЕДИНИТЬ ВСЕ без последующей группировки, показатели Заказано и Оплачено попадают в разные строки итогового набора данных.

В такой ситуации в одной строке заполнено значение Заказано (а Оплачено равно 0 или NULL), а в другой — наоборот. При вычислении процента на уровне детальных записей программа пытается разделить ноль или на ноль, из-за чего итоговый процент не рассчитывается.

Выясним, как это исправить:

  1. Замените операцию объединения на левое или полное соединение (ЛЕВОЕ СОЕДИНЕНИЕ) по ключевым полям (контрагент, договор, заказ).
  2. Если используется объединение, обязательно выполните группировку данных (СГРУППИРОВАТЬ ПО) по измерениям перед расчетом вычислимых полей.

Причина 3. Некорректная проверка типа документа

При проверке типов документов в запросе не рекомендуется использовать функцию ТИПЗНАЧЕНИЯ() с конструктором ТИП(). Это может приводить к ошибкам вычисления выражений.


// Неверно
КОГДА ТИПЗНАЧЕНИЯ(ВТ_СводныеДанные.Регистратор) = ТИП(Документ.ПлатежноеПоручениеВходящее)

// Верно
КОГДА ВТ_СводныеДанные.Регистратор ССЫЛКА Документ.ПлатежноеПоручениеВходящее

Причина 4. Скрытие нулевых значений настройками формата

Если результат деления равен нулю, платформа 1С по умолчанию может не отображать цифру 0 в ячейках отчета, вследствие чего колонка выглядит незаполненной. При этом простые арифметические операции (например, сложение или вычитание) выводят числа, создавая ощущение, что формула с процентом «не работает».

Для решения проблемы перейдем в настройки поля СКД и зададим явный формат отображения чисел:

  1. В схеме компоновки данных найдем нужное поле на вкладке Наборы данных или Вычисляемые поля.
  2. В свойстве Формат пропишем строку формата: ЧДЦ=2; ЧН=0.00 (параметр ЧН определяет представление нулевых значений).

Причина 5. Отсутствие расчета процента на вкладке «Ресурсы»

Даже если формула расчета процента корректно написана в запросе, в группировках и общих итогах СКД не сможет просто просуммировать проценты строк — это приведет к математически неверному результату. Если поле не добавлено в ресурсы с правильной формулой, ячейки итогов останутся пустыми.

Правильный подход — вычислять процент итогов через агрегатные функции на вкладке Ресурсы:

  1. Перейдем на вкладку Ресурсы в схеме компоновки данных.
  2. Добавим поле ПроцентВыполнения в список ресурсов.
  3. В колонке Выражение пропишем формулу перерасчета через сумму исходных показателей:

ВЫБОР 
    КОГДА СУММА(Заказано) = 0 ТОГДА 0 
    ИНАЧЕ СУММА(Оплачено) * 100 / СУММА(Заказано) 
КОНЕЦ

Такой способ гарантирует корректный расчет показателей как для детальных записей, так и для любых уровней группировок и общего итога отчета.

← На главную