Как запретить ввод контрагентов с одинаковым ИНН в 1С:УПП 1.3?

Программист 1С v8.3 (Обычные формы) Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При ведении справочника Контрагенты в «1С:Управление производственным предприятием 1.3» часто возникает проблема задвоения данных. Дублирование записей приводит к ошибкам при формировании регламентированной отчетности, путанице во взаиморасчетах и сложностям при сопоставлении первичных документов. Разберем по шагам, какими способами можно ограничить или полностью заблокировать создание элементов с одинаковым ИНН.

Способ 1. Использование штатной настройки предупреждения о дублях

В типовой конфигурации 1С:УПП 1.3 предусмотрен пользовательский механизм проверки. Выясним, как его включить для учетных записей пользователей:

  1. Перейдем в главное меню конфигурации: Сервис → Пользователи → Настройка пользователей.
  2. Выберем нужного пользователя или группу пользователей в дереве настроек.
  3. Раскроем ветку Другие настройки.
  4. Найдем опцию Выполнять поиск дублей при записи нового контрагента и установим для нее значение Истина (флаг).
  5. Сохраним внесенные изменения.

Проанализируем особенности и ограничения этого штатного механизма:

  1. Уведомительный характер: при нажатии кнопки записи программа выдает диалоговое окно со списком похожих контрагентов, однако пользователь может проигнорировать предупреждение и продолжить сохранение дубля.
  2. Работа только в интерфейсе: проверка срабатывает исключительно при интерактивном вводе через форму элемента. При программной записи, загрузке выписок из клиент-банка, обмене через ЭДО или импорте документов из внешних систем контроль не выполняется.

Способ 2. Программный запрет через подписку на событие «ПередЗаписью»

Если требуется гарантированный и жесткий запрет создания дубликатов (как интерактивно, так и программно), рассмотрим разработку серверного контроля. Лучшей практикой является создание отдельной подписки на событие для справочника СправочникОбъект.Контрагенты на событие ПередЗаписью. Это позволяет не вносить изменения в типовой модуль объекта справочника и сохранять конфигурацию на поддержке.

Разберем важные нюансы бизнес-логики, которые необходимо учесть в проверочном алгоритме:

  1. Филиалы и обособленные подразделения: у головной организации и ее филиалов ИНН совпадает, но различается код КПП. Для юридических лиц проверку уникальности необходимо выполнять строго по связке ИНН + КПП.
  2. Физические лица и индивидуальные предприниматели: у ИП и физлиц КПП отсутствует, а ИНН состоит из 12 цифр. Проверка выполняется только по полю ИНН.
  3. Пустые значения ИНН: для некоторых категорий контрагентов (например, розничные покупатели-физические лица или иностранные партнеры) ИНН может быть не заполнен. Если поле пустое, проверку следует сразу прерывать, иначе программа заблокирует создание второго контрагента без ИНН.
  4. Режим загрузки данных: при переносе данных, регламентных обменах или работе распределенных информационных баз (РИБ) проверку необходимо отключать через свойство ОбменДанными.Загрузка, чтобы избежать сбоев фонового обмена.
  5. Исключение текущего элемента и пометок на удаление: при редактировании существующего элемента нельзя сравнивать его с самим собой (проверяем условие по ссылке), а также следует исключать из выборки элементы, помеченные на удаление.

Посмотрим на пример реализации серверной процедуры в общем модуле:


Процедура ПроверитьДублиКонтрагентовПередЗаписью(Источник, Отказ) Экспорт

    // Пропускаем проверку при регламентной загрузке данных и обмене
    Если Источник.ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;

    ИНН = СокрЛП(Источник.ИНН);
    КПП = СокрЛП(Источник.КПП);

    // Если ИНН не заполнен, контроль уникальности не выполняется
    Если ПустаяСтрока(ИНН) Тогда
        Возврат;
    КонецЕсли;

    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ ПЕРВЫЕ 1
        |	Контрагенты.Ссылка КАК Ссылка,
        |	Контрагенты.Наименование КАК Наименование
        |ИЗ
        |	Справочник.Контрагенты КАК Контрагенты
        |ГДЕ
        |	Контрагенты.ИНН = &ИНН
        |	И Контрагенты.Ссылка <> &ТекущаяСсылка
        |	И НЕ Контрагенты.ПометкаУдаления
        |	И (&ПроверятьКПП = ЛОЖЬ ИЛИ Контрагенты.КПП = &КПП)";

    Запрос.УстановитьПараметр("ИНН", ИНН);
    Запрос.УстановитьПараметр("ТекущаяСсылка", Источник.Ссылка);

    // Для юридических лиц (ИНН 10 знаков) контролируем связку ИНН + КПП
    Если СтрДлина(ИНН) = 10 И НЕ ПустаяСтрока(КПП) Тогда
        Запрос.УстановитьПараметр("ПроверятьКПП", Истина);
        Запрос.УстановитьПараметр("КПП", КПП);
    Иначе
        Запрос.УстановитьПараметр("ПроверятьКПП", Ложь);
        Запрос.УстановитьПараметр("КПП", "");
    КонецЕсли;

    Результат = Запрос.Выполнить();

    Если НЕ Результат.Пустой() Тогда
        Выборка = Результат.Выбрать();
        Выборка.Следующий();
        
        ТекстОшибки = СтрШаблон(
            "Запись отменена! Контрагент с ИНН %1 %2уже зарегистрирован в базе: ""%3"" (код: %4).",
            ИНН,
            ?(ПустаяСтрока(КПП), "", "и КПП " + КПП + " "),
            Выборка.Наименование,
            Выборка.Ссылка.Код
        );
        
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки);
        Отказ = Истина;
    КонецЕсли;

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

Обработка уже имеющихся дубликатов

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

← На главную