Получить консультацию

Как сделать нарастающий итог в запросе и на СКД?

В общем случае нам нужно таблицу со значениями, по которым мы хотим получить нарастающий итог (накопительный итог), соединить левым соединением саму с собой. При этом таблица должна быть отсортирована тем или иным образом, и соединение должно быть не по строгому равенству, ключевого поля сортировки, а по условию “больше или равно”. Рассмотрим на примерах:

Предположим, у нас есть таблица, по которой мы хотим получить тот или иной накопительный итог. В нашем случае это будет таблица регистра оборотов “Закупки”.

В простом случае мы можем получить нарастающий итог по всем строкам. В этом случае мы соединим таблицу саму с собой по условию “ВТ_Закупки.Период >= ВТ_Закупки1.Период”, и упорядочим по полю Период.
Более сложный вариант – мы хотим получить нарастающий итог в разрезе одного или нескольких полей – например, в разрезе номенклатуры. В этом случае  мы соединяем по условию “ВТ_Закупки.Период >= ВТ_Закупки1.Период И ВТ_Закупки.Номенклатура = ВТ_Закупки1.Номенклатура”, и сортировку также делаем по Период и Номенклатура. Обратите внимание  – если сортировку по Номенклатуре не сделать – накопительный итог все равно будет корректно считаться, а вот строки с номенклатурой будут уже “вперемешку”.
Ниже приведен листинг пакетного запроса для обоих вариантов:

ВЫБРАТЬ
	Закупки.Период КАК Период,
	Закупки.Контрагент КАК Контрагент,
	Закупки.Номенклатура КАК Номенклатура,
	Закупки.Количество КАК Количество,
	Закупки.Сумма КАК Сумма
ПОМЕСТИТЬ ВТ_Закупки
ИЗ
	РегистрНакопления.Закупки КАК Закупки
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ВТ_Закупки.Период КАК Период,
	ВТ_Закупки.Контрагент КАК Контрагент,
	ВТ_Закупки.Номенклатура КАК Номенклатура,
	ВТ_Закупки.Количество КАК Количество,
	ВТ_Закупки.Сумма КАК Сумма,
	СУММА(ВТ_Закупки1.Сумма) КАК СуммаНарастающийИтог
ИЗ
	ВТ_Закупки КАК ВТ_Закупки
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Закупки КАК ВТ_Закупки1
		ПО ВТ_Закупки.Период >= ВТ_Закупки1.Период

СГРУППИРОВАТЬ ПО
	ВТ_Закупки.Период,
	ВТ_Закупки.Контрагент,
	ВТ_Закупки.Номенклатура,
	ВТ_Закупки.Количество,
	ВТ_Закупки.Сумма

УПОРЯДОЧИТЬ ПО
	Период
	;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ВТ_Закупки.Период КАК Период,
	ВТ_Закупки.Контрагент КАК Контрагент,
	ВТ_Закупки.Номенклатура КАК Номенклатура,
	ВТ_Закупки.Количество КАК Количество,
	ВТ_Закупки.Сумма КАК Сумма,
	СУММА(ВТ_Закупки1.Сумма) КАК СуммаНарастающийИтог
ИЗ
	ВТ_Закупки КАК ВТ_Закупки
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Закупки КАК ВТ_Закупки1
		ПО ВТ_Закупки.Период >= ВТ_Закупки1.Период
		И ВТ_Закупки.Номенклатура = ВТ_Закупки1.Номенклатура

СГРУППИРОВАТЬ ПО
	ВТ_Закупки.Период,
	ВТ_Закупки.Контрагент,
	ВТ_Закупки.Номенклатура,
	ВТ_Закупки.Количество,
	ВТ_Закупки.Сумма

УПОРЯДОЧИТЬ ПО
	Номенклатура,
	Период,
	Контрагент
;
Нарастающий итог в запросе

Бонус: нарастающий итог в отчете на СКД

В отчетах на СКД нарастающий итог сделать можно проще и быстрее, при этом сам запрос может быть максимально простым, без левых соединений таблицы самой с собой. Делается это так:
1. Создаем вычисляемые поля для нарастающих итогов, и не прописываем в них выражение.
2. Создаем нужные ресурсы и уже в ресурсах прописываем выражение с использованием метода ВычислитьВыражение. Хитрость заключается в том, что мы будем для каждой записи ресурса вычислять сумму начиная с первой строки по текущую.
3. Настраиваем нужные группировки. Важно! Нарастающий итог будет работать только для группировок – в детальных записях это не работает.

В качестве примера рассмотрим получение нарастающих итогов по закупкам. Обратите внимание, в целях демонстрации роль поля Период изменена с “Период” на “Измерение”, чтобы использовать его совместно с другими полями.

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

Добавим вычисляемые поля для количества и суммы нарастающим итогом.

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

Пропишем выражения для ресурсов, вида ВычислитьВыражение(“Нужное выражение“,,,”Первая”, “Текущая”)

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

Настроим группировки нашего отчета. Для аналога детальных записей просто перечислим все измерения в одной группировке.

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

Готово. Обратите внимание, что для детальных записей нарастающий итог будет отсутствовать.

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

Нюанс. Если все-таки указать выражение (то же что и для ресурса) в самом вычисляемом выражении, то накопительный итог будет выглядеть не совсем достоверно – т.к. для детальных записей он будет рассчитан в пределах группировки.

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

На этом данный небольшой рецепт подошел к концу. Мы рассмотрели как сделать нарастающий итог в запросе, а также как это сделать средствами СКД.

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

7 + 7 =

К НАЧАЛУ