Как создать отчет в СКД для расчета задолженности с учетом индивидуальной отсрочки контрагентов

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

Разработка отчетов по дебиторской задолженности — одна из самых частых задач при работе с торговыми системами на базе 1С. Основная сложность заключается в том, что у каждого контрагента могут быть свои условия работы: одному разрешена отсрочка платежа в 5 дней, другому — в 30. В этом материале мы разберем, как правильно спроектировать такой отчет в Системе компоновки данных (СКД), почему стандартный подход с «остатками на дату» часто не работает и как реализовать корректный расчет просрочки.

Анализ проблемы: почему нельзя просто передать отсрочку в параметр

Типичная ошибка начинающего разработчика — попытка получить остатки по регистру через виртуальную таблицу Остатки, передав в параметр Период выражение типа ДОБАВИТЬКДАТЕ(&ТекущаяДата, "ДЕНЬ", -Контрагент.Отсрочка). На уровне запроса 1С это работать не будет, так как параметры виртуальных таблиц применяются ко всей выборке целиком, а не к каждой строке отдельно. Виртуальная таблица строится один раз для всего отчета.

Для решения этой задачи мы рассмотрим два основных подхода: упрощенный расчет по «возрасту» долга и профессиональный расчет по методу ФИФО (первым пришел — первым ушел).

Выбор правильного регистра накопления

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

  1. Взаиморасчеты с клиентами — содержит информацию о текущем сальдо по контрагентам и договорам.
  2. Расчеты с клиентами — более детальный регистр, позволяющий видеть долг в разрезе конкретных документов отгрузки (накладных).
  3. Хозрасчетный — бухгалтерский регистр (счет 62), если отчет строится для бухгалтерии.

Способ №1: Метод «возраста» долга (через документы отгрузки)

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

Рассмотрим пошагово логику построения запроса:

  1. Выбираем остатки из регистра РасчетыСКлиентами.Остатки. Важно включить в разрез (измерения) ОбъектРасчетов (это может быть Заказ или Накладная).
  2. Присоединяем к результату данные о дате документа отгрузки.
  3. В вычисляемых полях или прямо в тексте запроса вычисляем разницу между текущей датой и датой документа.
  4. Сравниваем полученную разницу с реквизитом Отсрочка в справочнике Контрагенты.

Пример реализации части запроса:


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

Затем в настройках СКД на закладке «Вычисляемые поля» мы можем добавить поле СуммаПросрочено с выражением:

ВЫБОР КОГДА ДнейЗадолженности > СрокОтсрочки ТОГДА СуммаДолга ИНАЧЕ 0 КОНЕЦ

Способ №2: Определение просрочки по общему балансу (логика ФИФО)

Если в вашей информационной базе взаиморасчеты ведутся «в целом по договору» (без детализации до накладных), задача усложняется. Рассмотрим ситуацию, которую описал один из участников обсуждения: на 01.11.20 долг был 5000, а после этого были оплаты. Нам нужно понять, какая часть текущего долга относится к «старым» неоплаченным отгрузкам.

Для этого используется механизм распределения текущего остатка по хронологии оборотов:

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

Рассмотрим пример: У контрагента общий долг 10 000 руб. Отсрочка — 10 дней. Последние отгрузки: - 2 дня назад на сумму 4 000 руб. (срок не вышел). - 5 дней назад на сумму 3 000 руб. (срок не вышел). - 15 дней назад на сумму 8 000 руб. (срок просрочен).

Распределяем долг 10 000: - Сначала «закрываем» свежие 4 000 (остается 6 000). - Затем «закрываем» 3 000 (остается 3 000). - Оставшиеся 3 000 относятся к отгрузке 15-дневной давности. Значит, просрочено 3 000 руб.

Технические нюансы настройки СКД

При работе с датами в СКД важно учитывать несколько моментов, чтобы отчет не выдавал «плавающие» ошибки:

Итоги и рекомендации

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

Если же ваша конфигурация не позволяет видеть остатки в разрезе документов, рассмотрите возможность включения этой опции в настройках учета (например, «Вести расчеты по накладным»), так как это стандарт де-факто для современного управленческого учета.

← На главную