Как разработать «черный список» поставщиков в 1С:Бухгалтерия предприятия 3.0 и запретить оплату по ним?

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

В процессе работы любой компании рано или поздно возникает необходимость ограничить взаимодействие с неблагонадежными контрагентами. Это могут быть поставщики, сорвавшие сроки, фирмы-однодневки или организации, находящиеся в стадии банкротства. В типовой конфигурации «1С:Бухгалтерия предприятия 3.0» (БП 3.0) нет прямой кнопки «Заблокировать поставщика», поэтому разберем по шагам, как правильно спроектировать и внедрить такой механизм, используя современные инструменты платформы 1С.

Анализ бизнес-процесса: где и когда блокировать?

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

  1. Выбор контрагента в документах: запрет подбора «черного» поставщика в новые документы закупки.
  2. Создание Платежного поручения: блокировка проведения документа, если получатель в списке.
  3. Загрузка выписки (Списание с расчетного счета): самый критичный момент, так как оплата в банк-клиенте уже могла пройти, и нам важно оперативно подсветить это в учете.
  4. Контроль дублей: предотвращение создания новой карточки контрагента с тем же ИНН, чтобы обойти блокировку.

Вариант 1. Использование дополнительных реквизитов (простой способ)

Этот способ подойдет компаниям с несложной структурой согласования. Мы добавим новый признак контрагенту без изменения конфигурации. Рассмотрим подробнее этот механизм:

Зайдем в раздел Администрирование — Общие настройки — Дополнительные реквизиты и сведения. Добавим для справочника Контрагенты реквизит «В черном списке» с типом Булево. Теперь в карточке каждого поставщика появится флажок. Для реализации запретов нам потребуется написать небольшое расширение.

Проанализируем пример кода для расширения, который будет проверять этот флаг перед записью платежного поручения:


&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
    
    // Получаем значение доп. реквизита
    ЧерныйСписок = Ложь;
    Для Каждого Стр Из ТекущийОбъект.Контрагент.ДополнительныеРеквизиты Цикл
        Если Стр.Свойство.Наименование = "В черном списке" Тогда
            ЧерныйСписок = Стр.Значение;
        КонецЕсли;
    КонецЦикла;
    
    Если ЧерныйСписок Тогда
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "Внимание! Поставщик находится в черном списке. Оплата запрещена!";
        Сообщение.УстановитьДанные(ТекущийОбъект);
        Сообщение.Сообщить();
        Отказ = Истина;
    КонецЕсли;
    
КонецПроцедуры

Вариант 2. Реализация через Регистр сведений (профессиональный подход)

Если нам нужна история (почему поставщик попал в список, кто его туда занес и когда он был исключен), использование простого флажка недостаточно. В этом случае правильнее создать новый объект — Регистр сведений «ЧерныйСписокПоставщиков». Выясним преимущества этого метода:

Рассмотрим структуру такого регистра:

Для проверки наличия поставщика в таком регистре удобно использовать функцию в общем модуле расширения:


Функция КонтрагентЗаблокирован(Знач ПроверяемыйКонтрагент, Знач ДатаПроверки) Экспорт
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   ЧерныйСписокПоставщиковСрезПоследних.Статус КАК Статус
        |ИЗ
        |   РегистрСведений.ЧерныйСписокПоставщиков.СрезПоследних(&ДатаПроверки, Контрагент = &Контрагент) КАК ЧерныйСписокПоставщиковСрезПоследних";
    
    Запрос.УстановитьПараметр("ДатаПроверки", ДатаПроверки);
    Запрос.УстановитьПараметр("Контрагент", ПроверяемыйКонтрагент);
    
    Результат = Запрос.Выполнить();
    Если Не Результат.Пустой() Тогда
        Выборка = Результат.Выбрать();
        Выборка.Следующий();
        Возврат Выборка.Статус = Перечисления.СтатусыКонтрагентов.Черный;
    КонецЕсли;
    
    Возврат Ложь;
КонецФункции

Вариант 3. Блокировка на уровне подписок на события

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

Создадим подписку на событие ПередЗаписью для документов ПлатежноеПоручение, СписаниеСРасчетногоСчета, ПоступлениеТоваровУслуг. В обработчике вызовем нашу функцию проверки. Это гарантирует, что даже если документ загружен через «Директ-Банк» или внешнюю обработку, он не будет проведен при наличии контрагента в «черном списке».

Важный нюанс: Борьба с дублями

Как отмечалось в обсуждении, пользователи могут попытаться обойти запрет, создав новую карточку поставщика с тем же ИНН, но другим наименованием. Чтобы предотвратить это, необходимо внедрить жесткую проверку уникальности. Разберем, как это сделать:

В расширении для справочника Контрагенты добавим проверку в событие ПередЗаписью. При попытке сохранить нового контрагента система должна искать в базе уже существующие записи с таким же ИНН и проверять их наличие в «черном списке». Если совпадение найдено — выдаем отказ в регистрации нового элемента.

Использование сервиса «1С:СПАРК Риски»

Если бюджет компании позволяет, рассмотрим штатный механизм интеграции с сервисом СПАРК. Это позволяет автоматизировать ведение «черного списка» на основе официальных данных. Система сама будет подсвечивать контрагентов с высокими индексами риска (банкротство, ликвидация, судебные иски). В этом случае флаг неблагонадежности будет проставляться автоматически по API, исключая субъективность сотрудников.

Ролевая модель и обход блокировки

На практике случаются исключения, когда оплату «черному» поставщику должен разрешить финансовый директор или главный бухгалтер. Для этого рекомендуем создать в расширении новую Роль — РазрешитьПлатежиЗаблокированнымКонтрагентам. В коде проверки добавим условие:


Если КонтрагентЗаблокирован(Объект.Контрагент, Объект.Дата) Тогда
    Если Не РольДоступна("РазрешитьПлатежиЗаблокированнымКонтрагентам") Тогда
        Отказ = Истина;
        ВызватьИсключение "Операция отклонена: поставщик в черном списке. Обратитесь к финансовому директору.";
    КонецЕсли;
КонецЕсли;

Таким образом, мы создаем гибкую и безопасную систему контроля, которая защищает активы компании и дисциплинирует работу отдела закупок и бухгалтерии.

← На главную