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