Tosterer
@Tosterer
Новичок

Есть ли более простое / рациональное решение?

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

2) Создаем общий модуль и там прописываем:
&НаСервере
Функция ПрошелКонтрольУникальностиСправочникаПоРеквизиту(ИмяОбъекта, СтрРеквизитов, ЗначениеСсылка) Экспорт

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

Есть ощущение, что слишком громоздкое решение задачи. Подскажите, пожалуйста, есть ли более простое / рациональное решение?
  • Вопрос задан
  • 2874 просмотра
Решения вопроса 1
@Dementor
программист, архитектор, аналитик
Конечно, можно проще, если не нужна универсальность:

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

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы