Может кто делал Запрос на непогашенную сумму дебиторки в УТ 10.3?

1. user817897 2 13.05.20 00:26 Сейчас в теме
Необходимо вывести список Не погашенных реализаций.
Вот есть пример кода, он выводит, но не совсем то что нужно,он выводит и Реализации, и платёжки. И вроде как учитывает погашенные сумму,Но проходит отчёт по Движению и Приход и Расход, а необходимо только по Приход(Реализация), и вывести непогашенные реализации. Может кто делал,может кто поделится кодом,или этот попробовать доработать.
пример который нужно реализовать:

Допустим есть контрагент Пупкин ЧП
Движение:
Реализация1-1000 руб
Реализация2-2000 руб
ПКО(оплата)-1500 руб
Реализация3-800 руб.
Запрос выведет:Контрагент|Кредитовый документ|Остаток задолженности
Пупкин ЧП| Рееализация2| 500 руб.
Пупкин ЧП| Реализация3| 800 руб.



ВЫБРАТЬ
	ВложенныйЗапрос.РасчетнаяДата,
	ВложенныйЗапрос.СуммаОстатокВВалютеВзаиморасчетов,
	ВложенныйЗапрос.ДоговорКонтрагента.ВидВзаиморасчетов.Наименование КАК ДоговорКонтрагентаНаименование,
	ВложенныйЗапрос.РасчетныйДокумент.Номер,
	ВложенныйЗапрос.РасчетныйДокумент.Дата,
	ВложенныйЗапрос.Контрагент,
	ВложенныйЗапрос.РасчетныйДокумент
ИЗ
	(ВЫБРАТЬ
		Остатки.ДоговорКонтрагента КАК ДоговорКонтрагента,
		Остатки.Сделка КАК Сделка,
		ОсновнаяТаблицаРегистра.Период КАК РасчетнаяДата,
		ОсновнаяТаблицаРегистра.Регистратор КАК РасчетныйДокумент,
		ВЫБОР
			КОГДА СУММА(ТаблицаПоследующихПриходов.СуммаВзаиморасчетов * ВЫБОР
						КОГДА ТаблицаПоследующихПриходов.ВидДвижения = &ВидДвиженияПриход
								И ТаблицаПоследующихПриходов.СуммаВзаиморасчетов > 0
								И ТаблицаПоследующихПриходов.Регистратор <> ОсновнаяТаблицаРегистра.Регистратор
							ТОГДА 1
						КОГДА ТаблицаПоследующихПриходов.ВидДвижения <> &ВидДвиженияПриход
								И ТаблицаПоследующихПриходов.СуммаВзаиморасчетов < 0
								И ТаблицаПоследующихПриходов.Регистратор <> ОсновнаяТаблицаРегистра.Регистратор
							ТОГДА -1
						ИНАЧЕ 0
					КОНЕЦ) > Остатки.СуммаВзаиморасчетовОстаток
				ТОГДА 0
			ИНАЧЕ ВЫБОР
					КОГДА СУММА(ТаблицаПоследующихПриходов.СуммаВзаиморасчетов * ВЫБОР
								КОГДА ТаблицаПоследующихПриходов.ВидДвижения = &ВидДвиженияПриход
										И ТаблицаПоследующихПриходов.СуммаВзаиморасчетов > 0
									ТОГДА 1
								КОГДА ТаблицаПоследующихПриходов.ВидДвижения <> &ВидДвиженияПриход
										И ТаблицаПоследующихПриходов.СуммаВзаиморасчетов < 0
									ТОГДА -1
								ИНАЧЕ 0
							КОНЕЦ) > Остатки.СуммаВзаиморасчетовОстаток
						ТОГДА СУММА(ВЫБОР
									КОГДА ОсновнаяТаблицаРегистра.Регистратор = ТаблицаПоследующихПриходов.Регистратор
										ТОГДА Остатки.СуммаВзаиморасчетовОстаток
									ИНАЧЕ 0
								КОНЕЦ) - СУММА(ТаблицаПоследующихПриходов.СуммаВзаиморасчетов * ВЫБОР
									КОГДА ТаблицаПоследующихПриходов.ВидДвижения = &ВидДвиженияПриход
											И ТаблицаПоследующихПриходов.СуммаВзаиморасчетов > 0
											И ОсновнаяТаблицаРегистра.Регистратор <> ТаблицаПоследующихПриходов.Регистратор
										ТОГДА 1
									КОГДА ТаблицаПоследующихПриходов.ВидДвижения <> &ВидДвиженияПриход
											И ТаблицаПоследующихПриходов.СуммаВзаиморасчетов < 0
											И ОсновнаяТаблицаРегистра.Регистратор <> ТаблицаПоследующихПриходов.Регистратор
										ТОГДА -1
									ИНАЧЕ 0
								КОНЕЦ)
					ИНАЧЕ СУММА(ОсновнаяТаблицаРегистра.СуммаВзаиморасчетов * ВЫБОР
								КОГДА ОсновнаяТаблицаРегистра.ВидДвижения = &ВидДвиженияПриход
										И ОсновнаяТаблицаРегистра.СуммаВзаиморасчетов > 0
										И ОсновнаяТаблицаРегистра.Регистратор = ТаблицаПоследующихПриходов.Регистратор
									ТОГДА 1
								КОГДА ОсновнаяТаблицаРегистра.ВидДвижения <> &ВидДвиженияПриход
										И ОсновнаяТаблицаРегистра.СуммаВзаиморасчетов < 0
										И ОсновнаяТаблицаРегистра.Регистратор = ТаблицаПоследующихПриходов.Регистратор
									ТОГДА -1
								ИНАЧЕ 0
							КОНЕЦ)
				КОНЕЦ
		КОНЕЦ КАК СуммаОстатокВВалютеВзаиморасчетов,
		Остатки.ДоговорКонтрагента.Владелец КАК Контрагент
	ИЗ
		РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки(&ДатаОтчета, {(ДоговорКонтрагента.Владелец).* КАК ДоговорКонтрагентаВладелец, (ДоговорКонтрагента).* КАК ДоговорКонтрагента, (Сделка).* КАК Сделка}) КАК Остатки
			ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
				ВзаиморасчетыСКонтрагентамиОбороты.ДоговорКонтрагента КАК ДоговорКонтрагента,
				ВзаиморасчетыСКонтрагентамиОбороты.Сделка КАК Сделка,
				ВзаиморасчетыСКонтрагентамиОбороты.Период КАК Период,
				ВзаиморасчетыСКонтрагентамиОбороты.Регистратор КАК Регистратор,
				ВЫБОР
					КОГДА ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовПриход, 0) <> 0
						ТОГДА &ВидДвиженияПриход
					ИНАЧЕ &ВидДвиженияРасход
				КОНЕЦ КАК ВидДвижения,
				СУММА(ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовПриход, 0) + ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовРасход, 0)) КАК СуммаВзаиморасчетов
			ИЗ
				РегистрНакопления.ВзаиморасчетыСКонтрагентами.Обороты(
						,
						,
						Запись,
						ДоговорКонтрагента.Владелец В (&СпКА)
							И ДоговорКонтрагента.Наименование = "Договор А") КАК ВзаиморасчетыСКонтрагентамиОбороты
			
			СГРУППИРОВАТЬ ПО
				ВзаиморасчетыСКонтрагентамиОбороты.ДоговорКонтрагента,
				ВзаиморасчетыСКонтрагентамиОбороты.Сделка,
				ВзаиморасчетыСКонтрагентамиОбороты.Период,
				ВзаиморасчетыСКонтрагентамиОбороты.Регистратор,
				ВЫБОР
					КОГДА ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовПриход, 0) <> 0
						ТОГДА &ВидДвиженияПриход
					ИНАЧЕ &ВидДвиженияРасход
				КОНЕЦ) КАК ОсновнаяТаблицаРегистра
				ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
					ВзаиморасчетыСКонтрагентамиОбороты.ДоговорКонтрагента КАК ДоговорКонтрагента,
					ВзаиморасчетыСКонтрагентамиОбороты.Сделка КАК Сделка,
					ВзаиморасчетыСКонтрагентамиОбороты.Период КАК Период,
					ВзаиморасчетыСКонтрагентамиОбороты.Регистратор КАК Регистратор,
					ВЫБОР
						КОГДА ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовПриход, 0) <> 0
							ТОГДА &ВидДвиженияПриход
						ИНАЧЕ &ВидДвиженияРасход
					КОНЕЦ КАК ВидДвижения,
					ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовПриход, 0) + ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовРасход, 0) КАК СуммаВзаиморасчетов
				ИЗ
					РегистрНакопления.ВзаиморасчетыСКонтрагентами.Обороты(
							,
							,
							Запись,
							ДоговорКонтрагента.Владелец В (&СпКА)
								И ДоговорКонтрагента.Наименование = "Договор А") КАК ВзаиморасчетыСКонтрагентамиОбороты
				
				СГРУППИРОВАТЬ ПО
					ВзаиморасчетыСКонтрагентамиОбороты.ДоговорКонтрагента,
					ВзаиморасчетыСКонтрагентамиОбороты.Сделка,
					ВзаиморасчетыСКонтрагентамиОбороты.Период,
					ВзаиморасчетыСКонтрагентамиОбороты.Регистратор,
					ВЫБОР
						КОГДА ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовПриход, 0) <> 0
							ТОГДА &ВидДвиженияПриход
						ИНАЧЕ &ВидДвиженияРасход
					КОНЕЦ,
					ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовПриход, 0) + ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовРасход, 0)) КАК ТаблицаПоследующихПриходов
				ПО (ТаблицаПоследующихПриходов.ДоговорКонтрагента = ОсновнаяТаблицаРегистра.ДоговорКонтрагента)
					И (ТаблицаПоследующихПриходов.Сделка = ОсновнаяТаблицаРегистра.Сделка)
					И (ТаблицаПоследующихПриходов.Период > ОсновнаяТаблицаРегистра.Период
						ИЛИ ТаблицаПоследующихПриходов.Период = ОсновнаяТаблицаРегистра.Период
							И ТаблицаПоследующихПриходов.Регистратор >= ОсновнаяТаблицаРегистра.Регистратор)
					И (ТаблицаПоследующихПриходов.Период <= &ДатаОтчета)
					И (ТаблицаПоследующихПриходов.ВидДвижения = &ВидДвиженияПриход
							И ТаблицаПоследующихПриходов.СуммаВзаиморасчетов > 0
						ИЛИ ТаблицаПоследующихПриходов.ВидДвижения <> &ВидДвиженияПриход
							И ТаблицаПоследующихПриходов.СуммаВзаиморасчетов < 0)
			ПО Остатки.ДоговорКонтрагента = ОсновнаяТаблицаРегистра.ДоговорКонтрагента
				И Остатки.Сделка = ОсновнаяТаблицаРегистра.Сделка
				И (ОсновнаяТаблицаРегистра.Период <= &ДатаОтчета)
				И (ОсновнаяТаблицаРегистра.ВидДвижения = &ВидДвиженияПриход
						И ОсновнаяТаблицаРегистра.СуммаВзаиморасчетов > 0
					ИЛИ ОсновнаяТаблицаРегистра.ВидДвижения <> &ВидДвиженияПриход
						И ОсновнаяТаблицаРегистра.СуммаВзаиморасчетов < 0)
	ГДЕ
		Остатки.СуммаВзаиморасчетовОстаток > 0
	
	СГРУППИРОВАТЬ ПО
		Остатки.ДоговорКонтрагента,
		Остатки.Сделка,
		ОсновнаяТаблицаРегистра.Период,
		ОсновнаяТаблицаРегистра.Регистратор,
		Остатки.СуммаВзаиморасчетовОстаток,
		Остатки.ДоговорКонтрагента.Владелец) КАК ВложенныйЗапрос
ГДЕ
	НЕ ВложенныйЗапрос.СуммаОстатокВВалютеВзаиморасчетов ЕСТЬ NULL
	И ВложенныйЗапрос.СуммаОстатокВВалютеВзаиморасчетов <> 0
Показать
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. VictorRGB2 13 13.05.20 12:26 Сейчас в теме
1. на уровне настроек БД - в договоре установить флаг Вести расчеты по документам расчетов, тогда на регистре ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов всегда будет остаток в разрезе документа задолженности

но это не всегда возможно, тем более если в базе уже ведутся расчеты без этого признака, тогда второй вариант

2. ведомость по взаиморасчетам, приведенный запрос очень похож на нее
только это полная ведомость, а вам нужно остатки долга, потому берете результат и в цикле обрабатываете
документ с долгом в плюс и понеслась - вычитаем документы с долгом в минус пока не вычтете все
при этом или доги в минус закончатся или долги в плюс раньше
вот что осталось - то и будет остатком долга, это и выводить в результирующий отчет
3. user817897 2 13.05.20 12:47 Сейчас в теме
(2)
По Первому пункту: Почти во всех контрагентах проставлена эта галочка.
По Второму: так и делал,но пока не вышло)))
4. VictorRGB2 13 13.05.20 12:49 Сейчас в теме
(3) если расчеты ведутся в разрезе документов расчетов, то выполнять запрос по движениям не обязательно
достаточно получить ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Остатки
там будет все в нужном виде, т.е. документ расчетов - конечный остаток задолженности

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

СГРУППИРОВАТЬ ПО
	ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИ Обороты.ДоговорКонтрагента.Владелец,
	ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИ Обороты.ДоговорКонтрагента,
	ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИ Обороты.ДокументРасчетовСКонтрагентом
Показать
5. user817897 2 13.05.20 12:58 Сейчас в теме
(4)Не получилось как хотелось,выводит просто документы и Возвраты и Вх.Плат.Поруч и Реализации:
Прикрепленные файлы:
6. VictorRGB2 13 13.05.20 13:01 Сейчас в теме
(5) потому что это запрос к оборотной таблице, перепишите на РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Остатки и все получится
7. user817897 2 13.05.20 13:15 Сейчас в теме
(6)
Всё равно не выходит
ВЫБРАТЬ
	ВЗМ.ДоговорКонтрагента,
	ВЗМ.Контрагент,
	ВЗМ.ДокументРасчетовСКонтрагентом,
	ВЗМ.СуммаВзаиморасчетовОстаток
ИЗ
	РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Остатки КАК ВЗМ
ГДЕ
	ВЗМ.Контрагент = &Контрагент
	И ВЗМ.ДоговорКонтрагента.Наименование = "Договор А"
Показать
8. VictorRGB2 13 13.05.20 14:00 Сейчас в теме
(7) забыли просуммировать остаток долга
ВЫБРАТЬ
    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента.Владелец КАК Контрагент,
    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента КАК ДоговорКонтрагента,
    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДокументРасчетовСКонтрагентом КАК ДокументРасчетов,
    СУММА(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.СуммаВзаиморасчетовОстаток) КАК СуммаВзаиморасчетовКонечныйОстаток
ИЗ
    РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Остатки() КАК ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки
ГДЕ 
	ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента.Владелец = &Контрагент

СГРУППИРОВАТЬ ПО
    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента.Владелец,
    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента,
    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДокументРасчетовСКонтрагентом
Показать
9. user817897 2 13.05.20 14:16 Сейчас в теме
(8) нет,не вариант)

так мы не получим необходимые данные))
10. VictorRGB2 13 13.05.20 14:26 Сейчас в теме
(9) кто мешает ограничить тип документа расчетов нужными вам?
11. user817897 2 13.05.20 19:36 Сейчас в теме
12. VictorRGB2 13 14.05.20 10:06 Сейчас в теме
(11) тогда только по оборотке остается вариант, где-то было такое, если найду, выложу текст
13. user817897 2 14.05.20 11:48 Сейчас в теме
(12)ок,спасибо,очень было бы хорошо.
14. VictorRGB2 13 14.05.20 14:32 Сейчас в теме
(13) как-то так, запрос сами уже и цикл пересчета под себя подправите

// главное условие корректной обработки данных запроса, сгруппированные результаты по Клиент, Документ, ДокументДата и наличие признака Приход\Расход у суммы расчетов

тзнИсходная = Запрос.Выполнить().Выгрузить();
тзнИтоговая = тзнИсходная.СкопироватьКолонки("Клиент, ДокументДвижения, СуммаДокумента"); // копируемые колонки исключают признак Приход\Расход у суммы расчетов

спкКлиентОбработан = новый СписокЗначений; // список оработанных клиентов, для предотвращения повторений

// цикл пересчета итого по долгам для каждого клиента
Для Каждого строкаДанных Из тзнИсходная Цикл
	текКлиент = строкаДанных.Клиент;
	Если спкКлиентОбработан.НайтиПоЗначению(текКлиент) <> Неопределено Тогда
		Продолжить;
	КонецЕсли;
	
	// суммы по документам увеличения долга
	массивРасходКлиента = тзнИсходная.НайтиСтроки(Новый Структура("Клиент, ЭтоРасход", текКлиент, Истина));
	
	// суммы по документам уменьшения долга
	массивПриходКлиента = тзнИсходная.НайтиСтроки(Новый Структура("Клиент, ЭтоРасход", текКлиент, Ложь));
	
	// для каждого нового клиента итоги обнуляем
	Долг = 0;
	спкПриходОбработан = Новый СписокЗначений;
	
	// по докуентам увеличения долга
	Для Каждого строкаКлиентаРасход Из массивРасходКлиента Цикл
		// взяли долг по документу
		Долг = Долг - строкаКлиентаРасход.СуммаДокумента;
		ТекДокументРасход = строкаКлиентаРасход.ДокументДвижения;
		ТекКлиент = строкаКлиентаРасход.Клиент;
		
		// уменьшаем его по документам оплаты до тех пор, пока долг не станет положительным или оплаты не закончатся
		Для Каждого строкаКлиентаПриход Из массивПриходКлиента Цикл
			текДокументПриход = строкаКлиентаПриход.ДокументДвижения;
			
			// пропускаем уже обработанные ранее документы
			Если спкПриходОбработан.НайтиПоЗначению(текДокументПриход) <> Неопределено Тогда
				Продолжить;
			КонецЕсли;
			
			Долг = Долг + строкаКлиентаПриход.СуммаДокумента;
			
			спкПриходОбработан.Добавить(текДокументПриход);
			
			// кончился долг или оплаты превысили задолженность
			Если Долг > 0 Тогда
				Прервать;
			КонецЕсли;
		КонецЦикла;
		
		// добавляем строку остатка долга толко в случае наличия отрицательного долга (оплат больше не осталось, а долги еще есть)
		Если Долг < 0 Тогда
			новаяСтрока = тзнИтоговая.Добавить();
			новаяСтрока.Клиент = ТекКлиент;
			новаяСтрока.ДокументДвижения = ТекДокументРасход;
			новаяСтрока.СуммаДокумента = -Долг;
		КонецЕсли;
		
	КонецЦикла;
	
	// возможен вариант, когда оплат больше, чем долгов, учитываем
	Если Долг > 0 Тогда
		// добавляем последний текущий долг
		новаяСтрока = тзнИтоговая.Добавить();
		новаяСтрока.Клиент = ТекКлиент;
		новаяСтрока.ДокументДвижения = текДокументПриход;
		новаяСтрока.СуммаДокумента = Долг;
		
		// и все оставшиеся, не вошедшие в обработанные ранее
		Для Каждого строкаКлиентаПриход Из массивПриходКлиента Цикл
			// пропускаем уже обработанные ранее документы
			Если спкПриходОбработан.НайтиПоЗначению(строкаКлиентаПриход.ДокументДвижения) <> Неопределено Тогда
				Продолжить;
			КонецЕсли;
			
			новаяСтрока = тзнИтоговая.Добавить();
			новаяСтрока.Клиент = строкаКлиентаПриход.Клиент;
			новаяСтрока.ДокументДвижения = строкаКлиентаПриход.ДокументДвижения;
			новаяСтрока.СуммаДокумента = строкаКлиентаПриход.СуммаДокумента;
			
			спкПриходОбработан.Добавить(строкаКлиентаПриход.ДокументДвижения);
		КонецЦикла;
	КонецЕсли;
	
	спкКлиентОбработан.Добавить(текКлиент);
КонецЦикла;

// в итоге получаем тзнИтоговая только с документами задолжености\переплат с остатками по документам
ВывестиВОтчет(тзнИтоговая);
Показать
15. user817897 2 14.05.20 14:42 Сейчас в теме
(14)спасибо большое,сейчас посмотрю.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот