Расчет просроченной задолженности — одна из самых распространенных и в то же время технически сложных задач в 1С, особенно когда учет ведется «в целом по договору». В такой ситуации у нас нет прямой связи между конкретной накладной на отгрузку и конкретным входящим платежом. Нам приходится самостоятельно «схлопывать» долги и оплаты, используя принцип ФИФО (First In, First Out). В этой статье мы подробно разберем, как реализовать такой расчет с помощью запросов.
Проанализируем ситуацию: в регистре накопления Взаиморасчеты мы видим только итоговый остаток долга. Например, клиент должен 100 000 рублей. Но мы не знаем, состоит ли этот долг из свежей вчерашней поставки или это неоплаченный товар трехмесячной давности. Если в договоре указана ГлубинаКредита (количество дней отсрочки), нам нужно понять, какие именно отгрузки «покрываются» текущим остатком и превышают ли они допустимый срок.
Ситуация осложняется тем, что в течение периода долг мог выходить в ноль. Это означает, что старые долги были полностью погашены, и текущий остаток сформирован новыми документами. Просто взять «срез последних» движений недостаточно.
Наиболее эффективным способом решения этой задачи в одном запросе считается метод распределения оплат по нарастающему итогу. Рассмотрим его логику по шагам:
Рассмотрим подробнее, как составить такой запрос. Сначала нам нужно подготовить временную таблицу со всеми документами, увеличивающими долг.
ВЫБРАТЬ
Взаиморасчеты.Регистратор КАК ДокументОтгрузки,
Взаиморасчеты.Период КАК ПериодОтгрузки,
Взаиморасчеты.Сумма КАК СуммаОтгрузки,
Взаиморасчеты.Договор.ГлубинаКредита КАК ГлубинаКредита
ПОМЕСТИТЬ ВТ_Отгрузки
ИЗ
РегистрНакопления.Взаиморасчеты КАК Взаиморасчеты
ГДЕ
Взаиморасчеты.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
И Взаиморасчеты.Сумма > 0
;
Затем мы рассчитываем нарастающий итог. В современных версиях платформы 8.3.20+ это можно сделать через оконные функции, что работает значительно быстрее классического соединения таблиц.
ВЫБРАТЬ
Т1.ДокументОтгрузки,
Т1.СуммаОтгрузки,
СУММА(Т1.СуммаОтгрузки) ОБЗОР(УПОРЯДОЧИТЬ ПО Т1.ПериодОтгрузки) КАК НарастающийИтогОтгрузок
ПОМЕСТИТЬ ВТ_Итоги
ИЗ
ВТ_Отгрузки КАК Т1
;
Если же вы работаете на более ранних версиях платформы, используйте соединение таблицы самой с собой по условию Т2.ПериодОтгрузки <= Т1.ПериодОтгрузки.
Теперь проанализируем ситуацию с оплатами. Нам нужно получить общую сумму всех поступлений. Допустим, мы храним ее в переменной ВсегоОплачено (ее можно получить отдельным запросом к оборотам регистра). Мы сравниваем НарастающийИтогОтгрузок с этой суммой.
Логика определения остатка по конкретной накладной:
НарастающийИтогОтгрузок - СуммаОтгрузки >= ВсегоОплачено, то накладная не оплачена совсем.НарастающийИтогОтгрузок <= ВсегоОплачено, то накладная полностью оплачена.После того как мы вычислили неоплаченный остаток по каждой накладной, мы сравниваем ПериодОтгрузки с текущей датой. Если разница в днях превышает ГлубинаКредита, суммируем эти остатки в колонку «Просрочено».
Выясним причину, почему иногда этот метод может быть медленным. Если история взаиморасчетов за 10 лет огромна, расчет кумулятивного итога «повесит» систему. В таких случаях эффективнее считать «от текущего долга назад»:
Этот метод гораздо производительнее, так как нам не нужно обрабатывать всю историю платежей, достаточно проанализировать последние несколько документов, пока не покроем сумму текущего сальдо.
Посмотрим на ситуацию в современных типовых конфигурациях (ERP 2.x, УТ 11, КА 2). Разработчики 1С уже внедрили механизмы, упрощающие жизнь программисту. Для этих целей используется специализированный регистр РасчетыСКлиентамиПоСрокам.
В этом регистре система при проведении любого документа (отгрузки или оплаты) автоматически распределяет суммы по датам планового погашения. В этом случае задача сводится к простому запросу остатков:
ВЫБРАТЬ
Остатки.СуммаОстаток КАК ПросроченныйДолг
ИЗ
РегистрНакопления.РасчетыСКлиентамиПоСрокам.Остатки(&ТекущаяДата, ДатаПлановогоПогашения < &ТекущаяДата) КАК Остатки
Важный момент: Если вы используете самописную конфигурацию или старую редакцию, реализация метода ФИФО через временные таблицы остается единственным надежным вариантом.
Подытожим наши действия при создании отчета по просрочке:
Договор и Период, если используете соединения.Использование вышеописанных методик позволит вам строить быстрые и точные отчеты по задолженности, даже если детальный учет по документам расчетов в системе отключен.