Может кто делал Запрос на непогашенную сумму дебиторки в УТ 10.3?
Необходимо вывести список Не погашенных реализаций.
Вот есть пример кода, он выводит, но не совсем то что нужно,он выводит и Реализации, и платёжки. И вроде как учитывает погашенные сумму,Но проходит отчёт по Движению и Приход и Расход, а необходимо только по Приход(Реализация), и вывести непогашенные реализации. Может кто делал,может кто поделится кодом,или этот попробовать доработать.
пример который нужно реализовать:
Допустим есть контрагент Пупкин ЧП
Движение:
Реализация1-1000 руб
Реализация2-2000 руб
ПКО(оплата)-1500 руб
Реализация3-800 руб.
Запрос выведет:Контрагент|Кредитовый документ|Остаток задолженности
Пупкин ЧП| Рееализация2| 500 руб.
Пупкин ЧП| Реализация3| 800 руб.
Вот есть пример кода, он выводит, но не совсем то что нужно,он выводит и Реализации, и платёжки. И вроде как учитывает погашенные сумму,Но проходит отчёт по Движению и Приход и Расход, а необходимо только по Приход(Реализация), и вывести непогашенные реализации. Может кто делал,может кто поделится кодом,или этот попробовать доработать.
пример который нужно реализовать:
Допустим есть контрагент Пупкин ЧП
Движение:
Реализация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
ПоказатьОтветы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
1. на уровне настроек БД - в договоре установить флаг Вести расчеты по документам расчетов, тогда на регистре ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов всегда будет остаток в разрезе документа задолженности
но это не всегда возможно, тем более если в базе уже ведутся расчеты без этого признака, тогда второй вариант
2. ведомость по взаиморасчетам, приведенный запрос очень похож на нее
только это полная ведомость, а вам нужно остатки долга, потому берете результат и в цикле обрабатываете
документ с долгом в плюс и понеслась - вычитаем документы с долгом в минус пока не вычтете все
при этом или доги в минус закончатся или долги в плюс раньше
вот что осталось - то и будет остатком долга, это и выводить в результирующий отчет
но это не всегда возможно, тем более если в базе уже ведутся расчеты без этого признака, тогда второй вариант
2. ведомость по взаиморасчетам, приведенный запрос очень похож на нее
только это полная ведомость, а вам нужно остатки долга, потому берете результат и в цикле обрабатываете
документ с долгом в плюс и понеслась - вычитаем документы с долгом в минус пока не вычтете все
при этом или доги в минус закончатся или долги в плюс раньше
вот что осталось - то и будет остатком долга, это и выводить в результирующий отчет
(3) если расчеты ведутся в разрезе документов расчетов, то выполнять запрос по движениям не обязательно
достаточно получить ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Остатки
там будет все в нужном виде, т.е. документ расчетов - конечный остаток задолженности
например, так
достаточно получить ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Остатки
там будет все в нужном виде, т.е. документ расчетов - конечный остаток задолженности
например, так
ВЫБРАТЬ
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИ Обороты.ДоговорКонтрагента.Владелец КАК Контрагент,
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИ Обороты.ДоговорКонтрагента КАК ДоговорКонтрагента,
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИ Обороты.ДокументРасчетовСКонтрагентом КАК ДокументРасчетов,
СУММА(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИ Обороты.СуммаВзаиморасчетовКонечныйОстаток) КАК СуммаВзаиморасчетовКонечныйОстаток
ИЗ
РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.ОстаткиИ Обороты(
&ДатаОтчета,
&ДатаОтчета,
,
,
ДоговорКонтрагента.ВидДоговора = &СПокупателем
И ДоговорКонтрагента В (&Договоры)
И Контрагент В (&Владельцы)) КАК ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИ Обороты
СГРУППИРОВАТЬ ПО
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИ Обороты.ДоговорКонтрагента.Владелец,
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИ Обороты.ДоговорКонтрагента,
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИ Обороты.ДокументРасчетовСКонтрагентом
Показать
(6)
Всё равно не выходит
Всё равно не выходит
ВЫБРАТЬ
ВЗМ.ДоговорКонтрагента,
ВЗМ.Контрагент,
ВЗМ.ДокументРасчетовСКонтрагентом,
ВЗМ.СуммаВзаиморасчетовОстаток
ИЗ
РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Остатки КАК ВЗМ
ГДЕ
ВЗМ.Контрагент = &Контрагент
И ВЗМ.ДоговорКонтрагента.Наименование = "Договор А"
Показать
(7) забыли просуммировать остаток долга
ВЫБРАТЬ
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента.Владелец КАК Контрагент,
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента КАК ДоговорКонтрагента,
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДокументРасчетовСКонтрагентом КАК ДокументРасчетов,
СУММА(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.СуммаВзаиморасчетовОстаток) КАК СуммаВзаиморасчетовКонечныйОстаток
ИЗ
РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Остатки() КАК ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки
ГДЕ
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента.Владелец = &Контрагент
СГРУППИРОВАТЬ ПО
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента.Владелец,
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента,
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДокументРасчетовСКонтрагентом
Показать
(13) как-то так, запрос сами уже и цикл пересчета под себя подправите
// главное условие корректной обработки данных запроса, сгруппированные результаты по Клиент, Документ, ДокументДата и наличие признака Приход\Расход у суммы расчетов
тзнИсходная = Запрос.Выполнить().Выгрузить();
тзнИтоговая = тзнИсходная.СкопироватьКолонки("Клиент, ДокументДвижения, СуммаДокумента"); // копируемые колонки исключают признак Приход\Расход у суммы расчетов
спкКлиентОбработан = новый СписокЗначений; // список оработанных клиентов, для предотвращения повторений
// цикл пересчета итого по долгам для каждого клиента
Для Каждого строкаДанных Из тзнИсходная Цикл
текКлиент = строкаДанных.Клиент;
Если спкКлиентОбработан.НайтиПоЗначению(текКлиент) <> Неопределено Тогда
Продолжить;
КонецЕсли;
// суммы по документам увеличения долга
массивРасходКлиента = тзнИсходная.НайтиСтроки(Новый Структура("Клиент, ЭтоРасход", текКлиент, Истина));
// суммы по документам уменьшения долга
массивПриходКлиента = тзнИсходная.НайтиСтроки(Новый Структура("Клиент, ЭтоРасход", текКлиент, Ложь));
// для каждого нового клиента итоги обнуляем
Долг = 0;
спкПриходОбработан = Новый СписокЗначений;
// по докуентам увеличения долга
Для Каждого строкаКлиентаРасход Из массивРасходКлиента Цикл
// взяли долг по документу
Долг = Долг - строкаКлиентаРасход.СуммаДокумента;
ТекДокументРасход = строкаКлиентаРасход.ДокументДвижения;
ТекКлиент = строкаКлиентаРасход.Клиент;
// уменьшаем его по документам оплаты до тех пор, пока долг не станет положительным или оплаты не закончатся
Для Каждого строкаКлиентаПриход Из массивПриходКлиента Цикл
текДокументПриход = строкаКлиентаПриход.ДокументДвижения;
// пропускаем уже обработанные ранее документы
Если спкПриходОбработан.НайтиПоЗначению(текДокументПриход) <> Неопределено Тогда
Продолжить;
КонецЕсли;
Долг = Долг + строкаКлиентаПриход.СуммаДокумента;
спкПриходОбработан.Добавить(текДокументПриход);
// кончился долг или оплаты превысили задолженность
Если Долг > 0 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
// добавляем строку остатка долга толко в случае наличия отрицательного долга (оплат больше не осталось, а долги еще есть)
Если Долг < 0 Тогда
новаяСтрока = тзнИтоговая.Добавить();
новаяСтрока.Клиент = ТекКлиент;
новаяСтрока.ДокументДвижения = ТекДокументРасход;
новаяСтрока.СуммаДокумента = -Долг;
КонецЕсли;
КонецЦикла;
// возможен вариант, когда оплат больше, чем долгов, учитываем
Если Долг > 0 Тогда
// добавляем последний текущий долг
новаяСтрока = тзнИтоговая.Добавить();
новаяСтрока.Клиент = ТекКлиент;
новаяСтрока.ДокументДвижения = текДокументПриход;
новаяСтрока.СуммаДокумента = Долг;
// и все оставшиеся, не вошедшие в обработанные ранее
Для Каждого строкаКлиентаПриход Из массивПриходКлиента Цикл
// пропускаем уже обработанные ранее документы
Если спкПриходОбработан.НайтиПоЗначению(строкаКлиентаПриход.ДокументДвижения) <> Неопределено Тогда
Продолжить;
КонецЕсли;
новаяСтрока = тзнИтоговая.Добавить();
новаяСтрока.Клиент = строкаКлиентаПриход.Клиент;
новаяСтрока.ДокументДвижения = строкаКлиентаПриход.ДокументДвижения;
новаяСтрока.СуммаДокумента = строкаКлиентаПриход.СуммаДокумента;
спкПриходОбработан.Добавить(строкаКлиентаПриход.ДокументДвижения);
КонецЦикла;
КонецЕсли;
спкКлиентОбработан.Добавить(текКлиент);
КонецЦикла;
// в итоге получаем тзнИтоговая только с документами задолжености\переплат с остатками по документам
ВывестиВОтчет(тзнИтоговая);
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот