Разработка отчетов по дебиторской задолженности — одна из самых частых задач при работе с торговыми системами на базе 1С. Основная сложность заключается в том, что у каждого контрагента могут быть свои условия работы: одному разрешена отсрочка платежа в 5 дней, другому — в 30. В этом материале мы разберем, как правильно спроектировать такой отчет в Системе компоновки данных (СКД), почему стандартный подход с «остатками на дату» часто не работает и как реализовать корректный расчет просрочки.
Типичная ошибка начинающего разработчика — попытка получить остатки по регистру через виртуальную таблицу Остатки, передав в параметр Период выражение типа ДОБАВИТЬКДАТЕ(&ТекущаяДата, "ДЕНЬ", -Контрагент.Отсрочка). На уровне запроса 1С это работать не будет, так как параметры виртуальных таблиц применяются ко всей выборке целиком, а не к каждой строке отдельно. Виртуальная таблица строится один раз для всего отчета.
Для решения этой задачи мы рассмотрим два основных подхода: упрощенный расчет по «возрасту» долга и профессиональный расчет по методу ФИФО (первым пришел — первым ушел).
Прежде всего, проанализируем структуру данных. В типовых конфигурациях (таких как УТ 11, ERP 2.x или КА 2) информация о продажах хранится в регистре накопления Продажи, но это регистр оборотов. В нем нет остатков. Для получения сумм долга нам понадобятся регистры остатков, такие как:
Взаиморасчеты с клиентами — содержит информацию о текущем сальдо по контрагентам и договорам.Расчеты с клиентами — более детальный регистр, позволяющий видеть долг в разрезе конкретных документов отгрузки (накладных).Хозрасчетный — бухгалтерский регистр (счет 62), если отчет строится для бухгалтерии.Этот способ является наиболее точным и простым в реализации через СКД. Вместо того чтобы искать остаток на «какую-то дату в прошлом», мы возьмем текущий остаток долга в разрезе каждой конкретной накладной и сравним дату этой накладной с текущей датой, учитывая отсрочку.
Рассмотрим пошагово логику построения запроса:
РасчетыСКлиентами.Остатки. Важно включить в разрез (измерения) ОбъектРасчетов (это может быть Заказ или Накладная).Отсрочка в справочнике Контрагенты.Пример реализации части запроса:
ВЫБРАТЬ
Остатки.Контрагент КАК Контрагент,
Остатки.ОбъектРасчетов КАК ДокументОтгрузки,
Остатки.СуммаОстаток КАК СуммаДолга,
Остатки.Контрагент.Отсрочка КАК СрокОтсрочки,
РАЗНОСТЬДАТ(Остатки.ОбъектРасчетов.Дата, &ТекущаяДата, ДЕНЬ) КАК ДнейЗадолженности
ИЗ
РегистрНакопления.РасчетыСКлиентами.Остатки(&Период, ) КАК Остатки
Затем в настройках СКД на закладке «Вычисляемые поля» мы можем добавить поле СуммаПросрочено с выражением:
ВЫБОР КОГДА ДнейЗадолженности > СрокОтсрочки ТОГДА СуммаДолга ИНАЧЕ 0 КОНЕЦ
Если в вашей информационной базе взаиморасчеты ведутся «в целом по договору» (без детализации до накладных), задача усложняется. Рассмотрим ситуацию, которую описал один из участников обсуждения: на 01.11.20 долг был 5000, а после этого были оплаты. Нам нужно понять, какая часть текущего долга относится к «старым» неоплаченным отгрузкам.
Для этого используется механизм распределения текущего остатка по хронологии оборотов:
Рассмотрим пример: У контрагента общий долг 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 руб.
При работе с датами в СКД важно учитывать несколько моментов, чтобы отчет не выдавал «плавающие» ошибки:
ДОБАВИТЬКДАТЕ всегда приводите результат к началу или концу дня, используя функцию НАЧАЛОПЕРИОДА. Это исключит ситуации, когда долг признается просроченным из-за разницы в несколько часов между текущим временем и временем создания документа.ОстаткиИОбороты, убедитесь, что в настройках ролей полей компоновки данных правильно указаны периоды (День, Месяц и т.д.). Для простого отчета по задолженности лучше использовать таблицу Остатки.Проанализировав ситуацию, мы выяснили, что наиболее эффективным и производительным методом для реализации такого отчета является использование регистра остатков с детализацией по объектам расчетов. Это позволяет избежать сложных вычислений в коде и использовать всю мощь языка запросов СКД.
Если же ваша конфигурация не позволяет видеть остатки в разрезе документов, рассмотрите возможность включения этой опции в настройках учета (например, «Вести расчеты по накладным»), так как это стандарт де-факто для современного управленческого учета.