Найти ближайшую задолженность по регистру оборотов нарастающим итогом

1. insurgut 207 17.06.19 20:29 Сейчас в теме
Есть регистр оборотов, в который заносится долг и оплаты. Необходимо рассчитать срок задолженности (при наличии).

Нарастающим итогом задолженность считаем так:
ВЫБРАТЬ
	ПлатежныйКалендарьОбороты.Период КАК Период,
	ПлатежныйКалендарьОбороты.СчетНаОплату КАК СчетНаОплату,
	ПлатежныйКалендарьОбороты.СуммаОборот КАК СуммаОборот,
	ПлатежныйКалендарьОбороты.СуммаОплатыОборот КАК СуммаОплатыОборот
ПОМЕСТИТЬ Дано
ИЗ
	РегистрНакопления.ПлатежныйКалендарь.Обороты(, &ДатаОтчета, День, ) КАК ПлатежныйКалендарьОбороты
ГДЕ
	ПлатежныйКалендарьОбороты.СчетНаОплату = &СчетНаОплату
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Дано.СчетНаОплату КАК СчетНаОплату,
	Дано.Период КАК Период,
	СУММА(ДоДано.СуммаОборот - ДоДано.СуммаОплатыОборот) КАК СуммаОстаток
ИЗ
	Дано КАК Дано
		ЛЕВОЕ СОЕДИНЕНИЕ Дано КАК ДоДано
		ПО Дано.СчетНаОплату = ДоДано.СчетНаОплату
			И Дано.Период >= ДоДано.Период

СГРУППИРОВАТЬ ПО
	Дано.СчетНаОплату,
	Дано.Период
Показать


Отлично, таблица нарастающим итогом считается.

Пример 1

Сделка 135 от 26.08.2018 ||| 03.09.2018 ||| 20 000
Сделка 135 от 26.08.2018 ||| 04.09.2018 ||| <0>
Сделка 135 от 26.08.2018 ||| 14.09.2018 ||| 93 000
Сделка 135 от 26.08.2018 ||| 13.11.2018 ||| 39 974
Сделка 135 от 26.08.2018 ||| 29.11.2018 ||| 93 000


Пример 2 (минус - это переплата)

Сделка 195 от 27.01.2018 ||| 30.01.2018 ||| 20 000
Сделка 195 от 27.01.2018 ||| 07.02.2018 ||| <0>
Сделка 195 от 27.01.2018 ||| 17.04.2018 ||| -20 000
Сделка 195 от 27.01.2018 ||| 22.05.2018 ||| -40 000
Сделка 195 от 27.01.2018 ||| 02.07.2018 ||| -60 000
Сделка 195 от 27.01.2018 ||| 19.07.2018 ||| -1 353 334
Сделка 195 от 27.01.2018 ||| 05.09.2018 ||| <0>
Сделка 195 от 27.01.2018 ||| 25.09.2018 ||| 2 506 666
Сделка 195 от 27.01.2018 ||| 01.10.2018 ||| <0>


Пример 3

Сделка 554 от 12.01.2019 ||| 13.01.2019 ||| 20 000
Сделка 554 от 12.01.2019 ||| 13.02.2019 ||| 40 000
Сделка 554 от 12.01.2019 ||| 13.03.2019 ||| 60 000
Сделка 554 от 12.01.2019 ||| 13.04.2019 ||| 80 000
Сделка 554 от 12.01.2019 ||| 13.05.2019 ||| 100 000


Помогите продолжить запрос, чтобы для каждого документа получить минимальную (после 0 или минусовой задолженности) дату начала положительной суммы, либо при отсутствии таковой = пустую дату. Т.е.
для примера 1 = 14.09.2018
для примера 2 = 01.01.0001
для примера 3 = 13.01.2019
Вознаграждение за ответ
Показать полностью
Найденные решения
3. coollerinc 185 17.06.19 23:14 Сейчас в теме +1 $m
Получаете последний день без задолжности( ДоДано.СуммаОборот - ДоДано.СуммаОплатыОборот > 0, и группируете по максимум дате), помещаете во временную таблицу, потом соединяетесь еще раз с оборотами, но группируете по Минимум дате. Это и будет дата начала последней задолжности
Остальные ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
4. tusv 210 18.06.19 08:01 Сейчас в теме +1 $m
(1) Задолженность получили. Пихаем во временную таблицую
И самое простое разбить на две части и обеъединям
В первой части Где Сумма задолженности =0 Тогда ДатаВремя(1,1,1)
Во второй Части Где Сумма задолженности >0
Можно Выбором сразу
2. coollerinc 185 17.06.19 21:51 Сейчас в теме
В чем разница сумма и сумма оплаты? Все движения со знаком минус это вроде должны быть оплаты? Это остаточный или только оборотный регистр?
3. coollerinc 185 17.06.19 23:14 Сейчас в теме +1 $m
Получаете последний день без задолжности( ДоДано.СуммаОборот - ДоДано.СуммаОплатыОборот > 0, и группируете по максимум дате), помещаете во временную таблицу, потом соединяетесь еще раз с оборотами, но группируете по Минимум дате. Это и будет дата начала последней задолжности
5. insurgut 207 18.06.19 09:36 Сейчас в теме +1 $m
Спасибо! В итоге запрос принял вид:

ВЫБРАТЬ
	ПлатежныйКалендарьОбороты.Период КАК Период,
	ПлатежныйКалендарьОбороты.СчетНаОплату КАК СчетНаОплату,
	ПлатежныйКалендарьОбороты.СуммаОборот КАК СуммаОборот,
	ПлатежныйКалендарьОбороты.СуммаОплатыОборот КАК СуммаОплатыОборот
ПОМЕСТИТЬ Дано
ИЗ
	РегистрНакопления.ПлатежныйКалендарь.Обороты(, &ДатаОтчета, День, ) КАК ПлатежныйКалендарьОбороты
;

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

СГРУППИРОВАТЬ ПО
	Дано.СчетНаОплату,
	Дано.Период
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ПоследнийДеньБезЗадолженности.СчетНаОплату КАК СчетНаОплату,
	МАКСИМУМ(ПоследнийДеньБезЗадолженности.Период) КАК Период
ПОМЕСТИТЬ ПоследнийДеньБезЗадолженности
ИЗ
	НарастающиеИтоги КАК ПоследнийДеньБезЗадолженности
ГДЕ
	ПоследнийДеньБезЗадолженности.СуммаОстаток <= 0

СГРУППИРОВАТЬ ПО
	ПоследнийДеньБезЗадолженности.СчетНаОплату
;

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

СГРУППИРОВАТЬ ПО
	ПервыйДеньЗадолженности.СчетНаОплату
Показать
coollerinc; +1 Ответить
Оставьте свое сообщение
Вакансии
Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)

Программист 1С
Москва
зарплата от 250 000 руб.
Полный день

Программист 1C
Волгоград
зарплата от 200 000 руб.
Полный день

Аналитик
Санкт-Петербург
зарплата от 200 000 руб. до 250 000 руб.
Полный день