Доброго дня! Прошу не судить строго, я новичок в 1С - начал учиться!

Вопрос след. плана. нужен модуль для проверки уникальности имени в справочниках - Создаю общий модуль

```1c
    &НаСервере

    Функция ПроверкаНаНаименование (Наименование) Экспорт

    Имя = Справочники.Номенклатура.НайтиПоНаименованию(Наименование);
    Если Не Имя.Пустая() Тогда

    Сообщить ("Такой элемент справочника уже существует");
    Возврат Истина;

    КонецЕсли;

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

В модуле объекта

```1c
    Процедура ПередЗаписью(Отказ)

    Если
    Проверки.ПроверкаНаНаименование(Наименование)= Истина Тогда

    Отказ = Истина;

    КонецЕсли;

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

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

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

Если же вы хотите создать универсальную функцию для всех справочников, то нужно переделать так:

Общий модуль:

```1c
    &НаСервере
    Функция ПроверкаНаНаименование(СправочникСсылка, Наименование) Экспорт

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

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

В модуле перед записью справочника (на примере доработки через расширение):

```1c
    &После("ПередЗаписью")
    Процедура РасшИП_ПередЗаписью(Отказ)

    ЕстьДубли = Расш_ОбщийМодуль.ПроверкаНаНаименование(Ссылка, Наименование);
    Если ЕстьДубли Тогда
    Отказ = Истина;
    КонецЕсли;

    КонецПроцедуры
```
---
Чего не хочет удалять? В данном варианте она не даст записать новый элемент. Что и требуется вроде бы.
По всем справочникам нужно либо для каждого справочника рисовать такую проверку. Либо сделать универсальную, где вторым параметром передавать вид Справочника.
Или надо Наименование искать во многих справочниках? Если это так, то стоит подумать об изменение структуры данных.
---
Нужно изменить вашу функцию, сделать что-то вроде:

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

Если же вы хотите создать универсальную функцию для всех справочников, то нужно переделать так:

Общий модуль:

```1c
    &НаСервере
    Функция ПроверкаНаНаименование(СправочникСсылка, Наименование) Экспорт

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

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

В модуле перед записью справочника (на примере доработки через расширение):

```1c
    &После("ПередЗаписью")
    Процедура РасшИП_ПередЗаписью(Отказ)

    ЕстьДубли = Расш_ОбщийМодуль.ПроверкаНаНаименование(Ссылка, Наименование);
    Если ЕстьДубли Тогда
    Отказ = Истина;
    КонецЕсли;

    КонецПроцедуры
```
---
Процедура РасшИП_ПередЗаписью(Отказ)

    ЕстьДубли = Расш_ОбщийМодуль.ПроверкаНаНаименование(Ссылка, Наименование);
    Если ЕстьДубли Тогда
        Отказ = Истина;
    КонецЕсли;

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

Огромное спасибо, за помощь. Ваш вариант отличный!
---
перед проверкой на дубли нужно условие
если ЭтотОбъект.ПометкаУдаления тогда возврат конецесли
---
в этом случае можно записать помеченный на удаление объект с таким же наименованием, как результат - наличие дублей.