Как получить долг клиента в 1С:УНФ для контроля лимита задолженности?

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

В процессе разработки кастомизаций для конфигурации 1С:Управление нашей фирмой (УНФ) часто возникает задача оперативного получения текущей задолженности контрагента. Это критично для реализации механизмов контроля кредитного лимита, когда система должна блокировать создание или проведение новых заказов, если долг клиента превысил определенный порог. Рассмотрим, как правильно извлечь эти данные с помощью механизмов платформы 1С.

Анализ регистра взаиморасчетов

Для того чтобы получить актуальную информацию о долгах, нам необходимо обратиться к регистру накопления РасчетыСПокупателями. В 1С:УНФ именно этот регистр отвечает за хранение информации о дебиторской задолженности. Важно понимать, что нам не нужны все движения документа, а только итоговое состояние на текущий момент. Для этого в языке запросов 1С используются виртуальные таблицы остатков.

Проанализируем базовый запрос, который позволяет получить развернутую информацию по долгам клиента в разрезе организаций, договоров и документов-оснований:


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

В данном примере мы используем виртуальную таблицу Остатки. Обратите внимание на параметры: крайне важно передавать условие по контрагенту непосредственно в параметры виртуальной таблицы (в скобках), а не в секцию ГДЕ. Это значительно ускоряет выполнение запроса, так как СУБД фильтрует данные на этапе формирования итогов, а не после выборки всех записей регистра.

Проблема "лишних строк" и агрегация данных

При использовании вышеуказанного запроса программисты часто сталкиваются с ситуацией, когда по одному контрагенту возвращается несколько строк (например, если есть долги по разным договорам или заказам). Если наша задача — получить одну общую цифру для сравнения с лимитом, нам необходимо применить агрегатные функции.

Рассмотрим модифицированный запрос, который суммирует все остатки по конкретному контрагенту:


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

Использование функции СУММА и группировки по контрагенту позволяет получить единое значение. Это именно то, что нужно для логики проверки: Если РеальныйДолг + СуммаТекущегоЗаказа > Лимит Тогда....

Реализация логики контроля лимита

Выясним причину, по которой обычного остатка по регистру может быть недостаточно. В сообщении 11 форума описывается классический бизнес-процесс: у клиента есть лимит (например, 100 000 руб.), текущий долг составляет 80 000 руб., и он пытается сделать заказ на 25 000 руб. Сумма превышает лимит на 5 000 руб.

Для реализации такой проверки в коде модуля документа (например, ЗаказПокупателя) в процедуре ОбработкаПроверкиЗаполнения или ПередЗаписью, мы можем использовать следующий алгоритм:

  1. Получаем ЛимитКредита из реквизитов справочника Контрагенты или ДоговорыКонтрагентов.
  2. Выполняем запрос к остаткам регистра РасчетыСПокупателями для получения текущего сальдо.
  3. Рассчитываем планируемую задолженность: ТекущийДолг + Объект.СуммаДокумента.
  4. Сравниваем результат с лимитом и выводим предупреждение пользователю через ОбщегоНазначенияКлиентСервер.СообщитьПользователю.

Важные нюансы учета в УНФ

Разберем подробнее технические детали, которые могут повлиять на корректность расчета "реального долга":

1. Тип расчетов: В регистре присутствует измерение ТипРасчетов. Оно разделяет долги покупателей и авансы. Если сумма остатка отрицательная — это аванс клиента (наш долг перед ним). Для корректного расчета чистого долга нужно учитывать знак суммы или фильтровать только дебиторскую задолженность.

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

3. Прогнозируемый долг: Проанализируем ситуацию глубже. Если клиент уже сделал три заказа, которые еще не отгружены, фактически его долг в регистре РасчетыСПокупателями не изменился (так как не было документа РасходнаяНакладная). Однако эти заказы уже резервируют часть его кредитного лимита. Профессиональный подход подразумевает учет остатков по регистру ЗаказыПокупателей. Сумма невыполненных заказов + текущий долг = реальный кредитный риск.

Типовые возможности конфигурации

Прежде чем приступать к написанию собственного кода, стоит проверить, не реализован ли этот функционал в вашей версии 1С:УНФ. В последних релизах в карточке Договора или Контрагента предусмотрена настройка "Контролировать остаток задолженности".

Если этот флаг установлен и указана сумма допустимого долга, система сама будет блокировать проведение документов. Использование типового функционала предпочтительнее, так как оно гарантирует стабильность работы системы при обновлениях конфигурации.

Использование программного интерфейса (API)

В современных конфигурациях на базе БСП и УНФ не рекомендуется писать прямые запросы к регистрам в модулях форм. Правильнее использовать вызовы функций из общих модулей. Например, поищите функции в модуле ВзаиморасчетыСервер. Часто там уже есть готовые методы типа ЗадолженностьКонтрагента(Параметры), которые возвращают нужные цифры, учитывая все сложности учета (валюты, авансы, заказы).

Подведем итог: для простого получения долга достаточно запроса к РегистрНакопления.РасчетыСПокупателями.Остатки с группировкой по контрагенту. Но для создания надежной системы контроля лимитов необходимо учитывать авансы, валютные разницы и суммы заказов в работе.

← На главную