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