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

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

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

Способ 1. Использование штатного функционала «Кредитные лимиты»

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

Разберем по шагам, как включить и настроить этот функционал:

  1. Перейдем в раздел Настройки — Еще больше возможностей — Продажи.
  2. Найдем пункт Кредитные лимиты и установим соответствующий флаг.
  3. Теперь откроем карточку нужного нам Договора с контрагентом. В ней появится новый раздел, посвященный кредитному лимиту.
  4. В поле Сумма кредита укажем максимально допустимый порог долга (например, "0", если любая задолженность должна блокировать отгрузку).
  5. В поле Срок оплаты (в днях) можно задать допустимое количество дней просрочки (для детального анализа таких задержек полезен расчет пеней за период по просроченной дебиторской задолженности).
  6. В параметре Контроль выберем этап, на котором система должна блокировать действия: при создании Заказа покупателя или только в момент оформления Расходной накладной.

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

Важный момент по правам доступа: проверим настройки прав пользователей — для этого подойдёт контроль задолженности и настройка запретов для 1С:УНФ. Если у сотрудника (например, у старшего менеджера или руководителя) назначена роль Добавление и изменение заказов покупателей сверх лимита, система выдаст лишь предупреждение, но документ будет проведен. Чтобы запрет был строгим для рядовых менеджеров, убедимся, что эта роль у них отсутствует.

Способ 2. Программная реализация через расширение (для старых версий или специфических условий)

Если ваша конфигурация ниже версии 1.6.19 или вам требуется уникальная логика (например, учитывать только определенные виды долга), воспользуемся механизмом расширений. Мы разберем создание процедуры, которая будет проверять остатки по регистрам накопления перед проведением документа. Для этой задачи есть запрет проведения и записи документов по условиям.

Для начала создадим новое Расширение в конфигураторе и добавим в него документ РасходнаяНакладная. Нам необходимо перехватить событие проведения.

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

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

Написание кода процедуры

Рассмотрим пример кода, который нужно разместить в модуле объекта документа. Оптимально использовать обработчик ПередЗаписью (с проверкой на режим записи "Проведение") или ОбработкаПроведения.

Важно: в коде, который часто встречается на форумах, новички часто допускают ошибку, используя несуществующие переменные типа КлиентНаФормеДокумента. В модуле объекта мы должны обращаться напрямую к реквизитам объекта через ЭтотОбъект.

Проанализируем пример корректного запроса:


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

    Запрос.УстановитьПараметр("Контрагент", ЭтотОбъект.Контрагент);
    Запрос.УстановитьПараметр("Организация", ЭтотОбъект.Организация);
    // Используем МоментВремени, чтобы не учитывать сумму текущего документа, если он уже был проведен
    Запрос.УстановитьПараметр("МоментВремени", ЭтотОбъект.МоментВремени());

    РезультатЗапроса = Запрос.Выполнить();
    
    Если Не РезультатЗапроса.Пустой() Тогда
        Выборка = РезультатЗапроса.Выбрать();
        Выборка.Следующий();
        
        Если Выборка.СуммаДолга > 0 Тогда
            Отказ = Истина;
            Сообщение = Новый СообщениеПользователю;
            Сообщение.Текст = "Проведение запрещено! У клиента " + ЭтотОбъект.Контрагент + 
                              " имеется задолженность в размере: " + Выборка.СуммаДолга;
            Сообщение.Сообщить();
        КонецЕсли;
    КонецЕсли;

КонецПроцедуры

Разбор технических нюансов решения

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

  1. Точка входа: Лучше всего размещать проверку в начале процедуры ОбработкаПроведения. Если мы установим Отказ = Истина, система прервет транзакцию проведения, и изменения не попадут в регистры.
  2. Разрез учета: Обратите внимание, что в запросе мы используем параметры Контрагент и Организация. Это важно, так как у одного клиента может быть долг перед одной вашей организацией, но отсутствовать перед другой. Если в компании ведется учет по договорам, обязательно добавьте в фильтр запроса и Договор.
  3. Обработка авансов: Регистр РасчетыСПокупателями обычно хранит долги со знаком "плюс" и авансы со знаком "минус". Если у клиента висит переплата (аванс), СуммаОстаток будет отрицательной, и наше условие Выборка.СуммаДолга > 0 пропустит документ, что является верным поведением.
  4. Момент времени: Использование ЭтотОбъект.МоментВремени() позволяет получить остатки ровно "до" проведения текущей накладной. Это исключает ситуацию, когда документ блокирует сам себя.

Рекомендации по самоконтролю

Перед тем как внедрять жесткие ограничения, рекомендуем проанализировать отчет «Задолженность покупателей по срокам долга». Часто бывает так, что запрет на отгрузку срабатывает из-за "копеечных" остатков, возникших в результате округлений или ошибок при распределении авансов.

Если вы решили использовать программный метод, обязательно предусмотрите возможность "ручного" разрешения отгрузки для определенных пользователей. Это можно сделать через добавление дополнительного реквизита в документ или через проверку специального права доступа в коде, чтобы руководитель мог провести документ в исключительной ситуации, несмотря на долг клиента.

← На главную