← Назад к вопросам

Нарастающий итог в СКД

2.2 Middle🔥 181 комментариев
#СКД и отчёты

Условие

Создайте отчёт на СКД с нарастающим итогом.

Требования:

  • Отчёт по продажам по дням
  • Колонки: Дата, Сумма за день, Нарастающий итог с начала периода

Пример результата

ДатаСумма за деньНарастающий итог
01.01.202410 00010 000
02.01.202415 00025 000
03.01.20248 00033 000

Подсказка

Используйте вычисляемое поле с выражением "НарастающийИтог" в настройках компоновки данных.

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Нарастающий итог в СКД

Нарастающий итог — встроенная функция СКД, которая автоматически рассчитывает кумулятивную сумму. Это мощный инструмент для создания отчётов аналитического типа.

Основные концепции

Функция НарастающийИтог() в системе компоновки данных:

  • Автоматически рассчитывает текущее значение плюс сумму всех предыдущих значений
  • Работает в контексте сортировки и группировки
  • Сбрасывается при изменении группы

Решение 1: Вычисляемое поле в СКД (РЕКОМЕНДУЕТСЯ)

Процедура СоздатьКомпоновкуДанных()
    
    КомпоновщикНастроек = Новый КомпоновщикНастроек;
    КомпоновщикНастроек.ИсточникДанных = Новый ИсточникДанныхОбъект(СхемаДанных);
    
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();
    
    Настройки.СтруктураПолей.Очистить();
    
    // Строки: Дата
    ЭлементСтруктуры = Настройки.СтруктураПолей.Строки.Добавить();
    ЭлементСтруктуры.Поле = "Дата";
    
    // Данные: Сумма за день
    ЭлементДанных = Настройки.СтруктураПолей.Данные.Добавить();
    ЭлементДанных.Поле = "СуммаДня";
    
    // Создаём вычисляемое поле для нарастающего итога
    ВычисляемоеПоле = Настройки.ВычисляемыеПоля.Добавить();
    ВычисляемоеПоле.Имя = "НарастающийИтог";
    ВычисляемоеПоле.Выражение = "НарастающийИтог(СуммаДня)";
    ВычисляемоеПоле.ТипДанных = Новый ОписаниеТипов("Число",, ОписаниеТипов(18, 2));
    
    // Добавляем в данные
    ЭлементДанных = Настройки.СтруктураПолей.Данные.Добавить();
    ЭлементДанных.Поле = "НарастающийИтог";
    
    // Сортируем по дате
    ПорядокСортировки = Настройки.ПорядокСортировки.Добавить();
    ПорядокСортировки.Поле = "Дата";
    ПорядокСортировки.Направление = НаправлениеСортировки.Возрастание;
    
КонецПроцедуры

Решение 2: С группировкой (сброс по группам)

Процедура СоздатьОтчётПоМесяцам()
    
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();
    
    // Группировка по месяцам
    Группировка = Настройки.СтруктураПолей.Строки.Добавить();
    Группировка.Поле = "Месяц";
    Группировка.ТипВывода = ТипВыводаПоля.ОбычноеПоле;
    
    // Подробные строки — дни
    ПолеДни = Группировка.Строки.Добавить();
    ПолеДни.Поле = "Дата";
    
    // Вычисляемое поле — нарастающий итог по месяцам
    ВычисляемоеПоле = Настройки.ВычисляемыеПоля.Добавить();
    ВычисляемоеПоле.Имя = "НарастающийИтогПоМесяцу";
    ВычисляемоеПоле.Выражение = "НарастающийИтог(СуммаДня, Месяц)";
    ВычисляемоеПоле.ТипДанных = Новый ОписаниеТипов("Число",, ОписаниеТипов(18, 2));
    
КонецПроцедуры

Ключевые моменты

  • НарастающийИтог() — встроенная функция, работает только в контексте СКД
  • Сброс по группам — можно указать, по какому полю сбрасывать итог
  • Порядок сортировки — критичен! Итог считается в порядке сортировки
  • Производительность — вычисляемые поля работают быстро на больших объёмах

Рекомендуемое решение

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