Одной из наиболее востребованных задач в автоматизации учета на базе 1С:Бухгалтерия предприятия 3.0 (БП 3.0) является получение актуальной дебиторской задолженности с указанием даты ее возникновения. Стандартные бухгалтерские итоги позволяют легко увидеть общую сумму долга на конкретную дату, однако они не дают прямого ответа на вопрос: «Из каких именно отгрузок состоит этот остаток и как давно он висит?». Разберем подробно, как решить эту задачу с помощью встроенных средств программы и написания собственных запросов.
Прежде чем приступать к написанию сложного кода, проанализируем возможности типовой конфигурации. В БП 3.0 уже заложен мощный механизм анализа задолженности, который находится в разделе «Руководителю». Отчет называется «Дебиторская задолженность по срокам долга».
Этот отчет использует встроенные алгоритмы сопоставления оплат и отгрузок. Чтобы данные в нем были корректными, важно убедиться в следующем:
Если же типовой отчет не подходит по формату или требуется встроить логику в собственный механизм, перейдем к техническим решениям на уровне запросов 1С.
Проблема простого обращения к виртуальной таблице Остатки регистра бухгалтерии Хозрасчетный заключается в том, что она возвращает агрегированную сумму. Для получения даты возникновения долга нам необходимо реализовать алгоритм FIFO (First In, First Out) наоборот.
Рассмотрим логику процесса:
Посмотрим на пример структуры сложного запроса, который позволяет вычислить остатки с учетом периодов их возникновения. Проанализируем ситуацию, когда нам нужно собрать данные по счетам 60, 62 и 76.
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ВзаиморасчетыОстатки.Организация КАК Организация,
ВЫРАЗИТЬ(ВзаиморасчетыОстатки.Субконто1 КАК Справочник.Контрагенты) КАК Контрагент,
ВЫРАЗИТЬ(ВзаиморасчетыОстатки.Субконто2 КАК Справочник.ДоговорыКонтрагентов) КАК Договор,
ВзаиморасчетыОстатки.СуммаОстаток КАК ОбщийДолг
ПОМЕСТИТЬ ВтОстатки
ИЗ
РегистрБухгалтерии.Хозрасчетный.Остатки(&Период, Счет В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыСПокупателями)), , ) КАК ВзаиморасчетыОстатки
ГДЕ
ВзаиморасчетыОстатки.СуммаОстаток > 0;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Обороты.Организация КАК Организация,
Обороты.Субконто1 КАК Контрагент,
Обороты.Субконто2 КАК Договор,
Обороты.Регистратор КАК ДокументВозникновения,
Обороты.СуммаОборотДт КАК СуммаПродажи,
Обороты.Период КАК Период
ПОМЕСТИТЬ ВтОбороты
ИЗ
РегистрБухгалтерии.Хозрасчетный.Обороты(, &Период, Запись, Счет В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыСПокупателями)), , , , ) КАК Обороты
ГДЕ
Обороты.СуммаОборотДт > 0;
После подготовки временных таблиц необходимо соединить их таким образом, чтобы для каждой записи из ВтОбороты рассчитать сумму последующих (более новых) отгрузок. Если сумма «будущих» отгрузок меньше общего остатка долга, значит, данная отгрузка входит в текущую задолженность.
Выясним важную деталь: ведение учета по документам расчетов значительно упрощает задачу. В 1С:Бухгалтерия на счетах расчетов (60, 62) часто используется три субконто: Контрагенты, Договоры и Документы расчетов с контрагентами.
Если в настройках договора или учетной политики включен признак «Вести расчеты по документам», то система сама распределяет оплаты по отгрузкам (в момент проведения документа). В этом случае дата возникновения долга — это просто дата документа из третьего субконто Субконто3, по которому висит ненулевой остаток в виртуальной таблице Хозрасчетный.Остатки.
Проанализируем пример запроса для такой ситуации:
ВЫБРАТЬ
ХозрасчетныйОстатки.Организация,
ХозрасчетныйОстатки.Субконто1 КАК Контрагент,
ХозрасчетныйОстатки.Субконто2 КАК Договор,
ХозрасчетныйОстатки.Субконто3 КАК ДокументРасчетов,
ХозрасчетныйОстатки.Субконто3.Дата КАК ДатаВозникновения,
ХозрасчетныйОстатки.СуммаОстатокДт КАК СуммаДолга
ИЗ
РегистрБухгалтерии.Хозрасчетный.Остатки(&Период, Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыСПокупателями), , ) КАК ХозрасчетныйОстатки
ГДЕ
ХозрасчетныйОстатки.СуммаОстатокДт > 0
Важно: если учет по документам расчетов не ведется, Субконто3 будет пустым, и единственным выходом останется использование метода обратного нарастающего итога, описанного выше.
Рассмотрим альтернативный вариант, предложенный участниками обсуждения. Если запрос получается слишком громоздким и трудночитаемым, можно выполнить расчет программно в модуле:
ТаблицуЗначений.СрокОплаты из справочника ДоговорыКонтрагентов, добавляя эти дни к дате документа с помощью функции ДобавитьКДате().Такой подход часто оказывается более производительным на больших объемах данных, так как позволяет избежать сложных вложенных соединений в SQL-запросе, которые могут привести к зависанию системы при расчете нарастающих итогов.
Подводя итог, отметим, что выбор решения зависит от настроек вашей базы данных. Если включено ведение учета по документам расчетов, используйте прямые остатки по Субконто3. Если же учет ведется только в разрезе договоров, используйте метод FIFO через запрос с нарастающим итогом или программную обработку выборок. Это позволит вам точно определять «возраст» долга и эффективно работать с просроченной дебиторской задолженностью.