Как рассчитать просроченную задолженность в разрезе договоров с отсрочкой платежа в 1С?

Программист 1С v8.3 (Управляемые формы) Управленческий учет Торговля и дистрибуция
← На главную

Расчет просроченной задолженности — одна из самых распространенных и в то же время технически сложных задач в 1С, особенно когда учет ведется «в целом по договору». В такой ситуации у нас нет прямой связи между конкретной накладной на отгрузку и конкретным входящим платежом. Нам приходится самостоятельно «схлопывать» долги и оплаты, используя принцип ФИФО (First In, First Out). В этой статье мы подробно разберем, как реализовать такой расчет с помощью запросов.

В чем заключается основная проблема?

Проанализируем ситуацию: в регистре накопления Взаиморасчеты мы видим только итоговый остаток долга. Например, клиент должен 100 000 рублей. Но мы не знаем, состоит ли этот долг из свежей вчерашней поставки или это неоплаченный товар трехмесячной давности. Если в договоре указана ГлубинаКредита (количество дней отсрочки), нам нужно понять, какие именно отгрузки «покрываются» текущим остатком и превышают ли они допустимый срок.

Ситуация осложняется тем, что в течение периода долг мог выходить в ноль. Это означает, что старые долги были полностью погашены, и текущий остаток сформирован новыми документами. Просто взять «срез последних» движений недостаточно.

Метод «Кумулятивного итога» (Метод Ильдаровича)

Наиболее эффективным способом решения этой задачи в одном запросе считается метод распределения оплат по нарастающему итогу. Рассмотрим его логику по шагам:

  1. Собираем все отгрузки: Выбираем все документы, которые увеличивали задолженность (приход по регистру остатков), и выстраиваем их в хронологическом порядке.
  2. Рассчитываем нарастающий итог: Для каждой отгрузки вычисляем сумму всех предыдущих отгрузок плюс текущую. Это и есть «граница» данной поставки.
  3. Определяем общую сумму оплат: Вычисляем общую сумму всех платежей от клиента (и начальный остаток, если он был в нашу пользу).
  4. Сопоставляем: Если общая сумма оплат меньше «границы» отгрузки, значит, эта накладная (или ее часть) еще не оплачена.

Реализация алгоритма в запросе

Рассмотрим подробнее, как составить такой запрос. Сначала нам нужно подготовить временную таблицу со всеми документами, увеличивающими долг.


ВЫБРАТЬ
    Взаиморасчеты.Регистратор КАК ДокументОтгрузки,
    Взаиморасчеты.Период КАК ПериодОтгрузки,
    Взаиморасчеты.Сумма КАК СуммаОтгрузки,
    Взаиморасчеты.Договор.ГлубинаКредита КАК ГлубинаКредита
ПОМЕСТИТЬ ВТ_Отгрузки
ИЗ
    РегистрНакопления.Взаиморасчеты КАК Взаиморасчеты
ГДЕ
    Взаиморасчеты.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
    И Взаиморасчеты.Сумма > 0
;

Затем мы рассчитываем нарастающий итог. В современных версиях платформы 8.3.20+ это можно сделать через оконные функции, что работает значительно быстрее классического соединения таблиц.


ВЫБРАТЬ
    Т1.ДокументОтгрузки,
    Т1.СуммаОтгрузки,
    СУММА(Т1.СуммаОтгрузки) ОБЗОР(УПОРЯДОЧИТЬ ПО Т1.ПериодОтгрузки) КАК НарастающийИтогОтгрузок
ПОМЕСТИТЬ ВТ_Итоги
ИЗ
    ВТ_Отгрузки КАК Т1
;

Если же вы работаете на более ранних версиях платформы, используйте соединение таблицы самой с собой по условию Т2.ПериодОтгрузки <= Т1.ПериодОтгрузки.

Определение просроченного долга

Теперь проанализируем ситуацию с оплатами. Нам нужно получить общую сумму всех поступлений. Допустим, мы храним ее в переменной ВсегоОплачено (ее можно получить отдельным запросом к оборотам регистра). Мы сравниваем НарастающийИтогОтгрузок с этой суммой.

Логика определения остатка по конкретной накладной:

  1. Если НарастающийИтогОтгрузок - СуммаОтгрузки >= ВсегоОплачено, то накладная не оплачена совсем.
  2. Если НарастающийИтогОтгрузок <= ВсегоОплачено, то накладная полностью оплачена.
  3. В промежуточном случае часть накладной оплачена, часть — нет.

После того как мы вычислили неоплаченный остаток по каждой накладной, мы сравниваем ПериодОтгрузки с текущей датой. Если разница в днях превышает ГлубинаКредита, суммируем эти остатки в колонку «Просрочено».

Альтернативный метод: Расчет «от обратного»

Выясним причину, почему иногда этот метод может быть медленным. Если история взаиморасчетов за 10 лет огромна, расчет кумулятивного итога «повесит» систему. В таких случаях эффективнее считать «от текущего долга назад»:

  1. Берем текущий остаток долга (например, 50 000 руб.).
  2. Выбираем последние отгрузки в обратном хронологическом порядке.
  3. Набираем сумму отгрузок, пока она не сравняется с остатком долга.
  4. Все отгрузки, которые попали в этот «набор», и есть наш текущий долг.
  5. Проверяем даты этих отгрузок на предмет просрочки.

Этот метод гораздо производительнее, так как нам не нужно обрабатывать всю историю платежей, достаточно проанализировать последние несколько документов, пока не покроем сумму текущего сальдо.

Использование встроенных механизмов в ERP и УТ 11

Посмотрим на ситуацию в современных типовых конфигурациях (ERP 2.x, УТ 11, КА 2). Разработчики 1С уже внедрили механизмы, упрощающие жизнь программисту. Для этих целей используется специализированный регистр РасчетыСКлиентамиПоСрокам.

В этом регистре система при проведении любого документа (отгрузки или оплаты) автоматически распределяет суммы по датам планового погашения. В этом случае задача сводится к простому запросу остатков:


ВЫБРАТЬ
    Остатки.СуммаОстаток КАК ПросроченныйДолг
ИЗ
    РегистрНакопления.РасчетыСКлиентамиПоСрокам.Остатки(&ТекущаяДата, ДатаПлановогоПогашения < &ТекущаяДата) КАК Остатки

Важный момент: Если вы используете самописную конфигурацию или старую редакцию, реализация метода ФИФО через временные таблицы остается единственным надежным вариантом.

Резюме и советы по оптимизации

Подытожим наши действия при создании отчета по просрочке:

  1. Предварительная фильтрация: Сначала выберите только те договоры, по которым на текущий момент есть дебетовый остаток. Это отсечет 90% лишних данных.
  2. Группировка: Если отгрузок очень много, группируйте их по дням. Для расчета просрочки в днях внутридневная детализация обычно не требуется.
  3. Индексация: Обязательно индексируйте временные таблицы по полям Договор и Период, если используете соединения.
  4. Учет возвратов: Помните, что возвраты товаров могут работать как «оплаты» (закрывать старые долги) или уменьшать конкретную отгрузку — это зависит от вашей учетной политики.

Использование вышеописанных методик позволит вам строить быстрые и точные отчеты по задолженности, даже если детальный учет по документам расчетов в системе отключен.

← На главную