Задать вопрос
Tosterer
@Tosterer
Новичок

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

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

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

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

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

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

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

Похожие вопросы