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