В общем случае нам нужно таблицу со значениями, по которым мы хотим получить нарастающий итог (накопительный итог), соединить левым соединением саму с собой. При этом таблица должна быть отсортирована тем или иным образом, и соединение должно быть не по строгому равенству, ключевого поля сортировки, а по условию “больше или равно”. Рассмотрим на примерах:
Предположим, у нас есть таблица, по которой мы хотим получить тот или иной накопительный итог. В нашем случае это будет таблица регистра оборотов “Закупки”.
В простом случае мы можем получить нарастающий итог по всем строкам. В этом случае мы соединим таблицу саму с собой по условию “ВТ_Закупки.Период >= ВТ_Закупки1.Период”, и упорядочим по полю Период.
Более сложный вариант – мы хотим получить нарастающий итог в разрезе одного или нескольких полей – например, в разрезе номенклатуры. В этом случае мы соединяем по условию “ВТ_Закупки.Период >= ВТ_Закупки1.Период И ВТ_Закупки.Номенклатура = ВТ_Закупки1.Номенклатура”, и сортировку также делаем по Период и Номенклатура. Обратите внимание – если сортировку по Номенклатуре не сделать – накопительный итог все равно будет корректно считаться, а вот строки с номенклатурой будут уже “вперемешку”.
Ниже приведен листинг пакетного запроса для обоих вариантов:
ВЫБРАТЬ Закупки.Период КАК Период, Закупки.Контрагент КАК Контрагент, Закупки.Номенклатура КАК Номенклатура, Закупки.Количество КАК Количество, Закупки.Сумма КАК Сумма ПОМЕСТИТЬ ВТ_Закупки ИЗ РегистрНакопления.Закупки КАК Закупки ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ_Закупки.Период КАК Период, ВТ_Закупки.Контрагент КАК Контрагент, ВТ_Закупки.Номенклатура КАК Номенклатура, ВТ_Закупки.Количество КАК Количество, ВТ_Закупки.Сумма КАК Сумма, СУММА(ВТ_Закупки1.Сумма) КАК СуммаНарастающийИтог ИЗ ВТ_Закупки КАК ВТ_Закупки ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Закупки КАК ВТ_Закупки1 ПО ВТ_Закупки.Период >= ВТ_Закупки1.Период СГРУППИРОВАТЬ ПО ВТ_Закупки.Период, ВТ_Закупки.Контрагент, ВТ_Закупки.Номенклатура, ВТ_Закупки.Количество, ВТ_Закупки.Сумма УПОРЯДОЧИТЬ ПО Период ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ_Закупки.Период КАК Период, ВТ_Закупки.Контрагент КАК Контрагент, ВТ_Закупки.Номенклатура КАК Номенклатура, ВТ_Закупки.Количество КАК Количество, ВТ_Закупки.Сумма КАК Сумма, СУММА(ВТ_Закупки1.Сумма) КАК СуммаНарастающийИтог ИЗ ВТ_Закупки КАК ВТ_Закупки ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Закупки КАК ВТ_Закупки1 ПО ВТ_Закупки.Период >= ВТ_Закупки1.Период И ВТ_Закупки.Номенклатура = ВТ_Закупки1.Номенклатура СГРУППИРОВАТЬ ПО ВТ_Закупки.Период, ВТ_Закупки.Контрагент, ВТ_Закупки.Номенклатура, ВТ_Закупки.Количество, ВТ_Закупки.Сумма УПОРЯДОЧИТЬ ПО Номенклатура, Период, Контрагент ;
Бонус: нарастающий итог в отчете на СКД
В отчетах на СКД нарастающий итог сделать можно проще и быстрее, при этом сам запрос может быть максимально простым, без левых соединений таблицы самой с собой. Делается это так:
1. Создаем вычисляемые поля для нарастающих итогов, и не прописываем в них выражение.
2. Создаем нужные ресурсы и уже в ресурсах прописываем выражение с использованием метода ВычислитьВыражение. Хитрость заключается в том, что мы будем для каждой записи ресурса вычислять сумму начиная с первой строки по текущую.
3. Настраиваем нужные группировки. Важно! Нарастающий итог будет работать только для группировок – в детальных записях это не работает.
В качестве примера рассмотрим получение нарастающих итогов по закупкам. Обратите внимание, в целях демонстрации роль поля Период изменена с “Период” на “Измерение”, чтобы использовать его совместно с другими полями.
Добавим вычисляемые поля для количества и суммы нарастающим итогом.
Пропишем выражения для ресурсов, вида ВычислитьВыражение(“Нужное выражение“,,,”Первая”, “Текущая”)
Настроим группировки нашего отчета. Для аналога детальных записей просто перечислим все измерения в одной группировке.
Готово. Обратите внимание, что для детальных записей нарастающий итог будет отсутствовать.
Нюанс. Если все-таки указать выражение (то же что и для ресурса) в самом вычисляемом выражении, то накопительный итог будет выглядеть не совсем достоверно – т.к. для детальных записей он будет рассчитан в пределах группировки.
На этом данный небольшой рецепт подошел к концу. Мы рассмотрели как сделать нарастающий итог в запросе, а также как это сделать средствами СКД.