В конфигурации БП реализовал следующим образом:
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 (проверка на корректность и уникальность ИНН и КПП)