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