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