1. insurgut 196 18.04.19 08:55 Сейчас в теме

Помогите с запросом: Как посчитать число просроченных платежей по платежному календарю?

Если оборотный регистр накопления ПлатежныйКалендарь с измерением СчетНаОплату и двумя ресурсами Сумма и СуммаОплаты.

Как посчитать на любую дату число просроченных (неоплаченных) платежей? Размер платежа как по плану, так и по факту не фиксирован.

Пример #1, может быть так:

Период        Сумма     СуммаОплаты
01.01.2019   15000
01.02.2019   15000
01.03.2019   15000
10.03.2019                   20000
01.04.2019   15000


На 11.03 нужно получить цифру 2.

Пример #2, может быть так:
Период        Сумма     СуммаОплаты
01.01.2019    5000
01.02.2019   10000
01.03.2019   15000
10.03.2019                   20000
01.04.2019   20000

На 11.03 нужно получить цифру 1.

Пример #3, может быть так:
Период        Сумма     СуммаОплаты
01.01.2019    5000
01.02.2019   10000
01.03.2019   15000
10.03.2019                   40000
01.04.2019   20000

На 11.03 нужно получить цифру 0, а вот на 02.04 - цифру 1 :)

P.S. В идеале неплохо было бы получить ещё дату первого неоплаченного платежа, все считать разумеется по ФИФО.
Вознаграждение за ответ
Показать полностью
Найденные решения
20. Oldsad 18.04.19 11:36 Сейчас в теме +3 $m
есть шероховатости, но суть думаю ясна
ВЫБРАТЬ
	ПлатежныйКалендарьОбороты.CчетНаОплату КАК CчетНаОплату,
	ПлатежныйКалендарьОбороты.СуммаОплатыОборот КАК СуммаОплаты
ПОМЕСТИТЬ ТабОплачено
ИЗ
	РегистрНакопления.ПлатежныйКалендарь.Обороты(, &Период, , ) КАК ПлатежныйКалендарьОбороты
;

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

СГРУППИРОВАТЬ ПО
	ПлатежныйКалендарьОбороты.CчетНаОплату,
	ПлатежныйКалендарьОбороты.Регистратор
;

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

СГРУППИРОВАТЬ ПО
	ТабНарастающимИтогом.CчетНаОплату
Показать


Если одним регистратором формируется несколько записей в регистре на разные даты, не взлетит
нарастающий итог не посчитать
можно конечно нарастающий итог считать по периоду, но если две записи на одну секунду то никак
Остальные ответы
Избранное Подписка Сортировка: Древо
2. Dream_kz 89 18.04.19 09:06 Сейчас в теме
(1) А регистр оборотный я так понимаю?
Был бы остаточный, при оплате можно было бы погашать долги по фифо, как при партионном учете. Тогда в отчете получали бы только остатки
3. insurgut 196 18.04.19 09:07 Сейчас в теме
(2) да, совершенно верно, оборотный. Уточнил этот момент.
8. Dream_kz 89 18.04.19 09:16 Сейчас в теме
(3) Одним запросом обязательно? Самое простое получить все счета, все оплаты, циклом перебрать, оставить непогашенные, вывести в таблицу значений, и ее отдать скд
12. insurgut 196 18.04.19 09:24 Сейчас в теме
(8) да, задачу необходимо решить именно запросом, не обязательно одним, можно пакетом, но все в рамках СКД :)
20. Oldsad 18.04.19 11:36 Сейчас в теме +3 $m
есть шероховатости, но суть думаю ясна
ВЫБРАТЬ
	ПлатежныйКалендарьОбороты.CчетНаОплату КАК CчетНаОплату,
	ПлатежныйКалендарьОбороты.СуммаОплатыОборот КАК СуммаОплаты
ПОМЕСТИТЬ ТабОплачено
ИЗ
	РегистрНакопления.ПлатежныйКалендарь.Обороты(, &Период, , ) КАК ПлатежныйКалендарьОбороты
;

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

СГРУППИРОВАТЬ ПО
	ПлатежныйКалендарьОбороты.CчетНаОплату,
	ПлатежныйКалендарьОбороты.Регистратор
;

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

СГРУППИРОВАТЬ ПО
	ТабНарастающимИтогом.CчетНаОплату
Показать


Если одним регистратором формируется несколько записей в регистре на разные даты, не взлетит
нарастающий итог не посчитать
можно конечно нарастающий итог считать по периоду, но если две записи на одну секунду то никак
22. insurgut 196 18.04.19 12:08 Сейчас в теме
(20) план (ресурс Сумма) как раз одним документом формируется, а вот период в одну секунду нескольких платежей быть не может...
23. insurgut 196 18.04.19 12:20 Сейчас в теме
(20) резюмирую, что это то, что нужно! Чуть поправил по периоду:
ВЫБРАТЬ
	ПлатежныйКалендарьОбороты.СчетНаОплату КАК СчетНаОплату,
	ПлатежныйКалендарьОбороты.СуммаОплатыОборот КАК СуммаОплаты
ПОМЕСТИТЬ ТабОплачено
ИЗ
	РегистрНакопления.ПлатежныйКалендарь.Обороты(, &Период, , ) КАК ПлатежныйКалендарьОбороты
;

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

СГРУППИРОВАТЬ ПО
	ПлатежныйКалендарьОбороты.СчетНаОплату,
	ПлатежныйКалендарьОбороты.Период
;

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

СГРУППИРОВАТЬ ПО
	ТабНарастающимИтогом.СчетНаОплату
Показать
24. insurgut 196 29.04.19 10:36 Сейчас в теме
(20) подскажите, возможно вы сталкивались. В чем может быть причина - если в запросе формировать, то количества просроченных платежей формируются как положено. А если в СКД запрос положить, то в отчете выводится везде 1, и не важно что по факту 3-4 просроченных платежа. Выводится всегда 1. :-/
25. Oldsad 29.04.19 10:53 Сейчас в теме
(24)
первое что в голову приходит - это автозаполнение параметров в скд
попробуйте без него
26. insurgut 196 29.04.19 14:44 Сейчас в теме
(25) да, тоже подумал, наткнулся даже на статью https://infostart.ru/public/297514/ - но увы, не помогло.
27. Oldsad 30.04.19 04:10 Сейчас в теме
(26)
дейсвительно какая то ерунда с 1-ей
немного переделал:
ВЫБРАТЬ
	ПлатежныйКалендарьОбороты.СчетНаОплату КАК СчетНаОплату,
	ПлатежныйКалендарьОбороты.СуммаОплатыОборот КАК СуммаОплаты
ПОМЕСТИТЬ ТабОплачено
ИЗ
	РегистрНакопления.ПлатежныйКалендарь.Обороты(, &Период, , ) КАК ПлатежныйКалендарьОбороты
;

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

СГРУППИРОВАТЬ ПО
	ПлатежныйКалендарьОбороты.СчетНаОплату,
	ПлатежныйКалендарьОбороты.Период
;

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

СГРУППИРОВАТЬ ПО
	ТабНарастающимИтогом.СчетНаОплату
Показать


П.С. если кто то разъяснит почему компоновка не суммирует единицы, буду очень признателен
insurgut; +1 Ответить
28. insurgut 196 30.04.19 06:36 Сейчас в теме
(27) спасибо, выручили! Легко добавляем в конце
МИНИМУМ(ТабНарастающимИтогом.Период) КАК ДатаОбразованияПервойЗадолженности,

и получаем самую полную информацию по просрочке в любом отчете СКД или динамическом списке! :)
4. ben19791010 18.04.19 09:08 Сейчас в теме
ну а если разницу оборотов в отличие от 0 считать? на дату
5. insurgut 196 18.04.19 09:12 Сейчас в теме
(4) может не совсем понял, но что мне даст информация, для первого примена о сумме 45000 и сумме оплаты 20000 применительно к количеству платежей? Если бы размер их был фиксированным, то конечно достаточно было бы просто разделить разницу между суммой и суммой оплаты на минимум суммы (размер платежа), но он не фиксирован. Отсюда и возникла сложность.
6. ben19791010 18.04.19 09:14 Сейчас в теме
а что значит ресур сумма тогда?
10. insurgut 196 18.04.19 09:20 Сейчас в теме
(6) сумма плановой оплаты
7. ben19791010 18.04.19 09:15 Сейчас в теме
я думал если сумма оплаты-сумма >=0 тогда нет долга
9. ksen 18.04.19 09:18 Сейчас в теме
1)создать с помощью запроса упорядоченный массив с суммами
2)посчитать суммарную оплату
3)срезать с массива самые мелкие(ну или фифо) элементы пока не закончится оплата
4)выдать кол-во оставшихся элементов

5)аналитика будет так себе, может тз стоит улучшить?
11. insurgut 196 18.04.19 09:21 Сейчас в теме
(9) решить задачу обработкой проблем нет, но решить задачу нужно запросом.
16. ksen 18.04.19 11:03 Сейчас в теме
(11)1) посчитать сумму суммарного долга
2)взять последние n строк с суммой и упорядочить их по дате от самой последней к начальной
3)через вычисляемые поля скд создать столбец в котором будет считаться сумма долга - сумма
4) посчитать через тот же скд кол-во сток>0 и выдать это пользователю?
18. insurgut 196 18.04.19 11:12 Сейчас в теме
(16) да, на словах все понятно и логично. Только с п.3 не совсем понятно как реализовать. Может я немного ввел в заблуждение. Все делается в запросе динамического списка. Там вроде вычисляемых полей нет, поправьте.
19. oleg-x 9 18.04.19 11:30 Сейчас в теме
(18) Вы уж определитесь где делаете в СКД или динамическом списке :-)

Тогда надо обратится к таблице остатков а не оборотов. Получить остатки по Документу долга и получите нужное количество документов с долгами.
21. insurgut 196 18.04.19 12:01 Сейчас в теме
(19) документ долга - один, по нему периодические платежи. Регистр оборотный :-/
13. oleg-x 9 18.04.19 10:32 Сейчас в теме
Я правильно понимаю, вам нужно считать разницу дат от формирования долга?
14. insurgut 196 18.04.19 10:35 Сейчас в теме
(13) нет, это лишь дополнительное пожелание, но не основное. Основное - это подсчет именно количества неоплаченных платежей.
15. oleg-x 9 18.04.19 10:46 Сейчас в теме
(14) Измерение Документ долга есть? Если да и оплата идет по документам, то сделать можно без проблем. А если нет, то я бы даже не пытался делать это запросом.
Если уж очень надо в рамках СКД, то просто бы обработал результат СКД, то есть выгрузил бы в таблицу, программно отработал и обратно загрузил.
17. insurgut 196 18.04.19 11:07 Сейчас в теме
(15) да, в постановке указал, что есть измерение СчетНаОплату. Т.е. оплата идет по этому измерению.
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

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

Работа от Инфостарт
Санкт-Петербург
Временный (на проект)

Руководитель отдела внедрения 1С
Новосибирск
зарплата от 60 000 руб. до 160 000 руб.
Полный день

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