A
A
Alex2019-03-08 11:37:25
1C
Alex, 2019-03-08 11:37:25

Is there a simpler/rational solution?

Dear experienced 1C developers, please advise the beginner.
There is a reference book "Goods", which, in addition to standard details, has a price attribute with a primitive type "number". It is necessary to check the uniqueness of the name before writing the directory element. If the name is not unique, the entry should not be made with the issuance of an appropriate message.
Googling, I found the following solution (checked - it works):
1) We write code in the object module:

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

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

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

There is a feeling that the solution to the problem is too cumbersome. Can you please tell me if there is a simpler / rational solution?

Answer the question

In order to leave comments, you need to log in

2 answer(s)
D
Dmitry Kinash, 2019-03-09
Gutter

Of course, it can be simpler if you do not need universality:

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

A
Alexey Bespalov, 2019-03-08
@FreeArcher

Because it is a universal solution that is suitable for any directory. Rewrite the function specifically for your own. Remove the loop after the query, and add a condition by name to the query. If the query returns at least one record, then the name is not unique.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question