При разработке отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда стандартное суммирование ресурсов в итогах выдает математически неверный результат. Типичный пример — расчет относительных показателей (доли, проценты, коэффициенты на количество населения или единицу продукции). Если просто просуммировать такие показатели по строкам, итоговое значение потеряет смысл. В этой статье мы разберем, как заставить СКД вычислять итоги на основе агрегатов группировок, а не путем простого сложения детальных записей.
Прежде всего, проанализируем, где именно должна описываться логика расчета. Основная ошибка начинающих разработчиков заключается в попытке прописать сложную формулу только на закладке Вычисляемые поля. Важно понимать: выражение в вычисляемом поле применяется к каждой детальной строке (записи) выборки. Когда же дело доходит до итогов по группировкам или общих итогов, СКД по умолчанию начинает просто суммировать результаты этих вычислений.
Для корректного расчета «итогов от итогов» нам необходимо переместить логику на закладку Ресурсы. Именно здесь определяется, как поле будет вести себя на разных уровнях иерархии отчета. Рассмотрим это на примере задачи автора: расчет поля СуммаНа1000Населения.
Выясним, почему стандартная сумма не работает. Допустим, у нас есть две строки: в одной сумма 100 и население 10, во второй — сумма 200 и население 40. Коэффициент первой строки 10, второй — 5. Простое суммирование даст 15, что неверно. Правильный расчет для итога: (100 + 200) * 1000 / (10 + 40) = 6000.
Для реализации такой логики в схеме компоновки данных на вкладке Ресурсы для поля СуммаНа1000Населения следует написать выражение, использующее агрегатные функции:
СУММА(Сумма) * 1000 / СУММА(Население)
В этом случае СКД сначала вычислит сумму всех значений в группировке для первого слагаемого, затем для второго, и только потом произведет деление. Это универсальный подход для большинства финансовых и статистических отчетов.
Проанализируем ситуацию, когда данные могут быть неполными. Если в выборку попадет запись с нулевым населением, отчет завершится с ошибкой или выведет пустое значение. В ресурсах СКД крайне желательно использовать проверку. Рассмотрим правильный вариант написания выражения с использованием оператора ВЫБОР:
ВЫБОР
КОГДА СУММА(Население) = 0 ТОГДА 0
ИНАЧЕ СУММА(Сумма) * 1000 / СУММА(Население)
КОНЕЦ
Также полезно использовать функцию ЕстьNull, чтобы исключить влияние пустых значений из базы данных на результат расчета:
СУММА(ЕстьNull(Сумма, 0)) * 1000 / ВЫБОР КОГДА СУММА(ЕстьNull(Население, 0)) = 0 ТОГДА 1 ИНAЧЕ СУММА(Население) КОНЕЦ
Иногда возникают более сложные задачи: например, нужно рассчитать среднее значение показателя, который сам по себе является результатом деления в группировках. В этом случае обычные суммы не помогут. На помощь приходит мощная функция ВычислитьВыражениеСГруппировкойМассив.
Эта функция собирает результаты вычислений по вложенным группировкам в массив, к которому затем можно применить функции Среднее, Сумма, Максимум и другие. Рассмотрим пример, когда нам нужно получить средний коэффициент по городам в рамках области:
Среднее(ВычислитьВыражениеСГруппировкойМассив("Сумма(Сумма) * 1000 / Сумма(Население)", "Город"))
Разберем по шагам, что происходит в этом выражении:
Город.Среднее вычисляет итоговое значение на основе этого массива для вышестоящей группировки (например, Области).Если задача стоит в расчете доли текущей группировки в общем итоге (например, какой процент населения города составляет от населения всей страны), нам потребуется функция ВычислитьВыражение. Она позволяет обратиться к данным, находящимся вне текущей строки.
Пример расчета доли:
Сумма(Население) * 100 / ВычислитьВыражение("Сумма(Население)", "ОбщийИтог")
В данном случае второй параметр "ОбщийИтог" указывает СКД, что знаменатель должен быть рассчитан по всей выборке отчета, игнорируя фильтры текущей группировки. Это позволяет строить сложные аналитические отчеты с вертикальным анализом структуры.
Важным инструментом в руках разработчика 1С является колонка Рассчитывать по... в таблице ресурсов. Посмотрим на практический сценарий:
Для реализации такой схемы мы можем добавить одно и то же поле в список ресурсов несколько раз. Для каждого вхождения мы пропишем свою формулу и в колонке Рассчитывать по... укажем конкретную группировку, для которой эта формула актуальна. Это позволяет создавать гибкие отчеты, где итоги на разных уровнях иерархии рассчитываются по разной бизнес-логике.
Когда вы работаете с функциями типа ВычислитьВыражение, всегда проверяйте правильность написания имен полей и группировок — они должны в точности совпадать с именами, заданными на вкладке Наборы данных или Настройки. Помните, что СКД чувствительна к контексту: если вы обращаетесь к группировке, которой нет в текущем варианте отчета, выражение может вернуть пустой результат.
Подводя итог, можно сказать, что механизм ресурсов в СКД — это не просто место для выбора функции СУММА(). Это полноценный интерпретатор выражений, позволяющий реализовать практически любую математическую модель расчета итогов, если правильно использовать агрегатные функции и контекстные вычисления.