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