Всем привет! Управляемые формы. Подскажите, есть справочник "Контактные лица", необходимо сделать проверку чтобы не заводились дубли контактных лиц. Может у кого-то есть готовое решение то поделитесь пожалуйста.
За ранее благодарен.
---
В модуле объекта справочника, в процедуре "ПередЗаписью()" наговнокодить:

```1c
    Запрос = Новый Запрос("ВЫБРАТЬ С.Ссылка ИЗ Справочник.КонтактныеЛица КАК С ГДЕ С.Наименование = &Наименование И С.Ссылка <> &Ссылка";
    Запрос.УстановитьПараметр();
    РезультатЗапроса = Запрос.Выполнить();
    Если Не РезультатЗапроса.Пустой Тогда
    Отказ = Истина;
    // Ругаемся
    КонецЕсли;
```
---
В модуле объекта справочника, в процедуре "ПередЗаписью()" наговнокодить:

```1c
    Запрос = Новый Запрос("ВЫБРАТЬ С.Ссылка ИЗ Справочник.КонтактныеЛица КАК С ГДЕ С.Наименование = &Наименование И С.Ссылка <> &Ссылка";
    Запрос.УстановитьПараметр();
    РезультатЗапроса = Запрос.Выполнить();
    Если Не РезультатЗапроса.Пустой Тогда
    Отказ = Истина;
    // Ругаемся
    КонецЕсли;
```
---
в ПередЗаписью ссылки еще "нет".
---
Молодец что заметил. А теперь подумай
---
А теперь подумайДа ну нафиг )))
---
Спасибо! Только

```1c
    Отказ = Истина;
```

что-то не отрабатывал. Сделал вот так:

```1c
    &НаСервере
    Функция ПроверитьУникальностьПоНаименованию()

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | КонтактныеЛицаПартнеров.Ссылка КАК Ссылка
    |ИЗ
    | Справочник.КонтактныеЛицаПартнеров КАК КонтактныеЛицаПартнеров
    |ГДЕ
    | КонтактныеЛицаПартнеров.Ссылка <> &Ссылка
    | И КонтактныеЛицаПартнеров.Наименование = &Наименование";

    Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);
    Запрос.УстановитьПараметр("Наименование", Объект.Наименование);

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

    Если Не РезультатЗапроса.Пустой() Тогда
    Возврат 1;
    КонецЕсли;

    КонецФункции

    &НаКлиенте
    Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)

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

    КонецПроцедуры
```
---
Кусок ОбработкаПроверкиЗаполнения
моя проверка (без отказа) наименования справочника Контрагенты
"Плюсы" данного метода:
- нечёткое сравнение
- только 1С
"Минусы":
- ещё нужно дописать обновление индексов полнотекстового поиска после записи нового элемента... т.к. его обновление идёт фоновым по расписанию и можно попасть когда записали новый и делаете его копию - если индекс не обновлен - не будет ругаться на только что записанный

Перед вызовом проверка "Если ЭтоНовый() Тогда"

```1c
    //Ищем по наименованию
    Если ПолнотекстовыйПоиск.ПолучитьРежимПолнотекстовогоПоиска() <> РежимПолнотекстовогоПоиска.Разрешить Тогда
    //Отказ = Истина;
    Сообщение = Новый СообщениеПользователю();
    Сообщение.Текст = "Использование полнотекстового поиска не разрешено. Вы можете включить его в диалоге "Управление полнотекстовым поиском"'
    Сообщение.Сообщить();
    Иначе

    Стр = СокрЛП(НаименованиеПолное);
    //ДлинаСтрокиПоиска = СтрДлина(Стр);
    СписокПоиска = ПолнотекстовыйПоиск.СоздатьСписок(Стр, 50);
    СписокПоиска.ПолучатьОписание = Истина;
    СписокПоиска.ИспользованиеМетаданных = ИспользованиеМетаданныхПолнотекстовогоПоиска.НеИспользовать;
    //Если ДлинаСтрокиПоиска < 5 Тогда
    ПорогНечеткости = 35;
    //Иначе
    СписокПоиска.ПорогНечеткости = ПорогНечеткости;

    МассивОтбор = Новый Массив();
    МассивОтбор.Добавить(Метаданные.Справочники.Контрагенты);

    СписокПоиска.ОбластьПоиска = МассивОтбор;
    СписокПоиска.ПерваяЧасть();

    Для каждого текРезультат Из СписокПоиска Цикл

    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = "ВНИМАНИЕ!!!
    |Есть похожие наименования"+СокрЛП(текРезультат.Значение);
    Сообщение.Поле = "Наименование";
    Сообщение.КлючДанных=текРезультат.Значение;
    Сообщение.Сообщить();

    КонецЦикла;
```
---
//Если ДлинаСтрокиПоиска < 5 Тогда
                    ПорогНечеткости = 35;
                    //Иначе

Т.к. ПорогНечеткости - процент "несовпадений" и если длина строки 5 и ПорогНечеткости = 50, то попадут с несовпадениями до 3 знаков...
А если длина 100 - то несовпадение 50 знаков - очень много вариантов с "мусором",
т.е. при увеличении длины нужно уменьшать ПорогНечеткости... чтобы получить меньше вариантов...
---
(2)в ПередЗаписью ссылки еще "нет".

Садись, ДВА!

ссылка есть, просто пока пустая. и для данного запроса все равно подходит
---
смысла нет проверять на неравенство пустой ссылке.
---
Если ссылка заполнена ("перезапись") - отбор всех из базы кроме неё с одинаковым наименованием
Если ссылка не заполнена ("запись нового") - отбор всех из базы с одинаковым наименованием

Нужный функционал работает...

А делать 2 запроса, или модифицировать по условию существующий... Зачем?

З.Ы. Хотя и выгладит "неправильно"
---
Условия ТС звучат так:

"необходимо сделать проверку чтобы не заводились дубли контактных лиц".

Проверять дубли при обновлении существующих - чревато.

Обычно запрет на дубли включают когда уже вычистили от дублей и не хотят чистить от дублей еще раз.
---
хм, смыла нет - а результат есть!

ну ладно, вот вам подсказка,
зачастую потом, приходится редактировать элементы справочников, что-то кроме Наименования, телефоны, ИНН, дату рождения и др.

вот в этом случае без проверки по Ссылке, вы не запишите измененный элемент!!!
и получите сообщение что Наименование не уникально

а с такой проверкой получится сохранить измененных элемент
для самого себя
или для нового
---
, (9) Хорошо, уболтали языкастые :)