Алгоритм проверки уникальности и корректности ИНН, КПП при записи контрагента для БП 1.6 и 2.0 через подписку на события
В УПП есть типовой механизм проверки контрагента на уникальность при записи.
В БП 2.0 такой типовой проверки нет, пришлось добавлять свою, к тому же логика УПП-шной проверки меня не совсем устраивает.
Предлагаю свой вариант алгоритма проверки ИНН и КПП при записи элемента справочника Контрагенты.
Ни на что не претендую, если инфа будет кому-то полезна, значит не зря потратил время :).
К тому же этот вопрос возникает с неизменной периодичностью на всех форумах.
Реализовано с помощью подписки на событие, что позволяет спокойно обновлять конфигурацию.
Приведенный ниже код проверяет корректность в ИНН и КПП на:
— длина
— недопустимые символы
— уникальность ИНН+КПП (для юрлица) или уникальность ИНН (для физлица)
— проверка корректности ИНН на контрольный разряд
P.S. это первая публикация, сильно не ругайте, если есть замечания — сообщите
обновлено 13.03.2012 : добавлена проверка на Отказ, ОбменДанными.Загрузка, ЭтоГруппа (спасибо http://forum.infostart.ru/forum24/topic51955/message616590/#message616590)
- Описание
- Подробнее
Описание
В конфигурации БП реализовал следующим образом:
1) создал подписку на событие
Источник: СправочникОбъект.Контрагенты
Событие: ПередЗаписью
Обработчик: МойОбщийМодуль.ПередЗаписьюКонтрагента (где МойОбщийМодуль — собственный общий модуль, но можно при желании можно и в один из типовых засунуть)
2) собственно сам обработчик
//добавлено — 11/05/2010 (проверка на корректность и уникальность ИНН и КПП)
Процедура ПередЗаписьюКонтрагента(Источник, Отказ) Экспорт
Если Отказ ИЛИ Источник.ОбменДанными.Загрузка ИЛИ Источник.ЭтоГруппа Тогда
Возврат;
КонецЕсли;
Если Источник.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ФизЛицо Тогда
ЭтоФизлицо = Истина;
Иначе
ЭтоФизлицо = Ложь;
КонецЕсли;
// проверка ИНН на заполнение
ИНН = Источник.ИНН;
Если СтрДлина(ИНН) <> ?(ЭтоФизлицо, 12, 10) Тогда
СообщениеОНевозможностиЗаписи = «Неверное количество символов в реквизите ИНН!!!» + Символы.ПС
+ «Текущее количество символов: » + СтрДлина(ИНН) + Символы.ПС
+ «Требуемое количество символов для » + ?(ЭтоФизлицо, «Физлица: 12»,«Юрлица: 10»);
ОбщегоНазначения.СообщитьОбОшибке(СообщениеОНевозможностиЗаписи);
Отказ = Истина;
Возврат;
КонецЕсли;
// проверка ИНН на недопустимые символы
Результат = Истина;
Для а = 1 По СтрДлина(ИНН) Цикл
Если Найти(«0123456789», Сред(ИНН,а,1)) = 0 Тогда
НекорректныйСимвол = Сред(ИНН,а,1);
Результат = Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
Если НЕ Результат Тогда
СообщениеОНевозможностиЗаписи = «Недопустимый символ в реквизите ИНН: <« + НекорректныйСимвол + «> !!!»;
ОбщегоНазначения.СообщитьОбОшибке(СообщениеОНевозможностиЗаписи);
Отказ = Истина;
Возврат;
КонецЕсли;
// проверка ИНН на контрольный разряд
Если НЕ РегламентированнаяОтчетность.ИННСоответствуетТребованиям(ИНН, ЮрФизЛицо) Тогда
СообщениеОНевозможностиЗаписи = «ИНН задан неверно (не прошел проверку на контрольный разряд)!!!»;
ОбщегоНазначения.СообщитьОбОшибке(СообщениеОНевозможностиЗаписи);
Отказ = Истина;
Возврат;
КонецЕсли;
Если НЕ ЭтоФизлицо Тогда
// проверка КПП на заполнение
КПП = Источник.КПП;
Если СтрДлина(КПП) <> 9 Тогда
СообщениеОНевозможностиЗаписи = «Неверное количество символов в реквизите КПП!!!» + Символы.ПС
+ «Текущее количество символов: » + СтрДлина(КПП) + Символы.ПС
+ «Требуемое количество символов: 9»;
ОбщегоНазначения.СообщитьОбОшибке(СообщениеОНевозможностиЗаписи);
Отказ = Истина;
Возврат;
КонецЕсли;
// проверка КПП на недопустимые символы
Результат = Истина;
Для а = 1 По СтрДлина(КПП) Цикл
Если Найти(«0123456789», Сред(КПП,а,1)) = 0 Тогда
НекорректныйСимвол = Сред(КПП,а,1);
Результат = Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
Если НЕ Результат Тогда
СообщениеОНевозможностиЗаписи = «Недопустимый символ в реквизите КПП: <« + НекорректныйСимвол + «> !!!»;
ОбщегоНазначения.СообщитьОбОшибке(СообщениеОНевозможностиЗаписи);
Отказ = Истина;
Возврат;
КонецЕсли;
КонецЕсли;
// поиск дубликатов в справочнике
Запрос = Новый Запрос();
Запрос.УстановитьПараметр(«ТекущийИНН», ИНН);
Запрос.УстановитьПараметр(«ТекущийКПП», КПП);
Запрос.УстановитьПараметр(«Ссылка», Источник.Ссылка);
Запрос.Текст = «ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
| Контрагенты.Ссылка,
| ПРЕДСТАВЛЕНИЕ(Контрагенты.Ссылка) КАК ПредставлениеКонтрагента
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| НЕ Контрагенты.Ссылка = &Ссылка
| И Контрагенты.ИНН = &ТекущийИНН
| «+ ?(ЭтоФизлицо, «», » И Контрагенты.КПП = &ТекущийКПП»);
ВыборкаКонтрагентов = Запрос.Выполнить().Выбрать();
Если ВыборкаКонтрагентов.Количество() <> 0 Тогда
ВыборкаКонтрагентов.Следующий();
СообщениеОНевозможностиЗаписи = «Уже существует контрагент с таким ИНН» + ?(ЭтоФизлицо, «», » И КПП») + » (» + ВыборкаКонтрагентов.Ссылка.Код + » » + ВыборкаКонтрагентов.ПредставлениеКонтрагента + «) !!!» ;
ОбщегоНазначения.СообщитьОбОшибке(СообщениеОНевозможностиЗаписи);
Отказ = Истина;
Возврат;
КонецЕсли;
КонецПроцедуры
//финиш — 11/05/2010 (проверка на корректность и уникальность ИНН и КПП)
