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