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