Как в СКД настроить вычисляемое поле без итогов, использовать пользовательский параметр и рассчитать итог по условию?

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

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

1. Вывод вычисляемого поля без расчета общего итога

Когда нам необходимо вывести значение выражения только в строках отчета, не рассчитывая по нему итоговые суммы, важно понимать разницу между вкладками Вычисляемые поля и Ресурсы:

  1. Если поле создано на вкладке Вычисляемые поля и не добавлено в список ресурсов на вкладке Ресурсы, СКД считает его обычной детальной колонкой. Такое поле будет выводиться только на уровне группировки Детальные записи (или в строках группировок без автоматического суммирования).
  2. Если поле все же является ресурсом для промежуточных группировок, но его расчет не имеет смысла в общем итоге отчета, перейдем на вкладку Ресурсы. В колонке Рассчитывать по... укажем только необходимые группировки (например, Номенклатура или Подразделение), исключив значение Общий итог. В этом случае итоговая ячейка внизу отчета останется пустой.

2. Правильный расчет коэффициентов и защита от деления на ноль

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

Корректная формула отношения итогов должна выглядеть как Сумма(КоличествоПлан) / Сумма(КоличествоФакт). Кроме того, необходимо обязательно предусмотреть защиту от деления на ноль и проверку значений на NULL.

Посмотрим на пример безопасного выражения для вкладки Ресурсы:


ВЫБОР
    КОГДА ЕСТЬNULL(Сумма(КоличествоФакт), 0) = 0 ТОГДА 0
    ИНАЧЕ Сумма(КоличествоПлан) / Сумма(КоличествоФакт)
КОНЕЦ

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


ВЫБОР
    КОГДА ЕСТЬNULL(КоличествоФакт, 0) = 0 ТОГДА 0
    ИНАЧЕ КоличествоПлан / КоличествоФакт
КОНЕЦ

3. Организация пользовательского ввода числового коэффициента через параметры

Если требуется дать пользователю возможность ввести произвольное число (коэффициент) прямо в шапке отчета и пересчитать данные, создадим параметр схемы компоновки данных:

  1. Перейдем на вкладку Параметры схемы компоновки данных и добавим новый параметр (например, ПоправочныйКоэффициент).
  2. Укажем тип данных Число, при необходимости зададим длину, точность и заполним Значение по умолчанию (например, 1), чтобы отчет формировался корректно даже без ручного ввода.
  3. В колонке Пользовательские настройки установим флажок Включать в пользовательские настройки и укажем режим редактирования Быстрый доступ. Это выведет поле ввода коэффициента прямо на форму отчета.
  4. Используем параметр в выражениях ресурсов или вычисляемых полей, обращаясь к нему через символ амперсанда &:

ВЫБОР
    КОГДА &ПоправочныйКоэффициент = 0 ТОГДА 0
    ИНАЧЕ Сумма(КоличествоПлан) / &ПоправочныйКоэффициент
КОНЕЦ

4. Получение итога по определенной группировке или условию

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

Подход 1. Условная агрегация в выражении ресурса

С помощью конструкции ВЫБОР КОГДА внутри функции суммирования мы можем вычислить сумму только тех строк, которые соответствуют заданному условию:


Сумма(ВЫБОР
    КОГДА ТипНоменклатуры = &ТипГотоваяПродукция ТОГДА КоличествоПродаж
    ИНАЧЕ 0
КОНЕЦ) * &ПоправочныйКоэффициент

Подход 2. Использование функции СКД Вычислить()

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


Вычислить("Сумма(КоличествоПродаж)", "ГруппировкаГотоваяПродукция") * &ПоправочныйКоэффициент

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

← На главную