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