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

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

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

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

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

Разберем по шагам, как активировать этот механизм:

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

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

Способ 2. Программная реализация контроля (Исправление кода)

Если вы используете старую версию программы или стандартный функционал по каким-то причинам не подходит, рассмотрим ситуацию, возникшую в обсуждении на форуме. Автор пытался самостоятельно написать проверку в модуле объекта документа РасходнаяНакладная в процедуре ПередЗаписью, но столкнулся с ошибкой Переменная не определена (КлиентНаФормеДокумента).

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

Проанализируем исправленный и оптимизированный код для проверки задолженности. Рассмотрим пример, который нужно разместить в модуле объекта:


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    
    // Проверку запускаем только при проведении документа
    Если НЕ РежимПроведения Тогда
        Возврат;
    КонецЕсли;

    // Проверим, не является ли это новым документом, чтобы не блокировать запись
    // Или используем проверку только для конкретных условий
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   РасчетыСПокупателямиОстатки.СуммаОстаток КАК Долг
        |ИЗ
        |   РегистрНакопления.РасчетыСПокупателями.Остатки(
        |       &Период,
        |       Контрагент = &Контрагент
        |   ) КАК РасчетыСПокупателямиОстатки";
    
    // Используем текущую дату или момент времени
    Запрос.УстановитьПараметр("Период", Новый Граница(МоментВремени(), ВидГраницы.Исключая));
    Запрос.УстановитьПараметр("Контрагент", Контрагент); 
    
    РезультатЗапроса = Запрос.Выполнить();
    
    Если НЕ РезультатЗапроса.Пустой() Тогда
        Выборка = РезультатЗапроса.Выбрать();
        Выборка.Следующий();
        
        Если Выборка.Долг > 0 Тогда
            Отказ = Истина;
            Сообщение = Новый СообщениеПользователю;
            Сообщение.Текст = "Проведение запрещено! У покупателя числится задолженность: " + Выборка.Долг;
            Сообщение.Сообщить();
        КонецЕсли;
    КонецЕсли;

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

Что мы изменили в коде по сравнению с исходным вариантом на форуме:

Способ 3. Использование расширений для чистоты кода

Чтобы не снимать конфигурацию с поддержки, крайне рекомендуем использовать механизм Расширений. Вместо изменения модуля объекта напрямую, мы создадим расширение и добавим туда обработчик. Рассмотрим, как это сделать правильно через &После или &Перед.

Наиболее удачным местом для проверки является обработчик ОбработкаПроверкиЗаполнения. Это стандартный механизм платформы, который срабатывает перед записью и проведением, позволяя пользователю увидеть ошибку в удобном интерфейсе.

Пример кода в расширении:


&НаСервере
&Вместо("ОбработкаПроверкиЗаполнения")
Процедура Расш1_ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
    
    // Вызываем стандартную обработку
    ПродолжитьВызов(Отказ, ПроверяемыеРеквизиты);
    
    // Если уже есть ошибки заполнения, прерываемся
    Если Отказ Тогда
        Возврат;
    КонецЕсли;
    
    // Выполняем проверку задолженности (аналогичный запрос, как в Способе 2)
    // ... логика запроса ...
    
    Если ЗадолженностьНайдена Тогда
        Отказ = Истина;
        // Пользователь получит уведомление и документ не будет проведен
    КонецЕсли;
    
КонецПроцедуры

Посмотрим на дополнительные рекомендации

Проанализируем ситуацию, когда менеджеру нужно видеть долг еще до нажатия кнопки «Провести». Для этого можно использовать события формы документа. Посмотрим на метод ПриИзменении для поля Контрагент.

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

Резюмируем:

  1. Первым делом проверьте настройки Кредитных лимитов в вашей версии УНФ.
  2. Если версия старая, используйте программный код, но обращайтесь к реквизиту Контрагент и ресурсу СуммаОстаток.
  3. Старайтесь выносить все доработки в Расширения.
  4. Для удобства пользователей реализуйте оповещение не только при проведении, но и при выборе контрагента на форме.

Таким образом, мы обеспечим надежный контроль дебиторской задолженности и предотвратим несанкционированные отгрузки товаров неплательщикам.

← На главную