Элемент справочника
Теги: 1С,Справочник

Ищет/создаёт элемент справочника

# Код реализации

```1c
// Функция - Элемент справочника ищет/создаёт элемент справочника
//
// Параметры:
//  НазваниеСправочника      - Строка - Название справочника элемент которого необходимо вернуть
//  СтруктураПараметров      - Структура - Ключ = Название реквизиты, Значение = Значение
//  Режим - Число                 - Варианты:
//                                        1 - ищет и возвращает ссылку;
//                                        2 - ищет и возвращает ссылку, если не находит создаёт новый элемент и возвращает ссылку на него
//                                        3 - создаёт новый элемент и возвращает ссылку на него
//
// Возвращаемое значение:
//  СправочникСсылка
//
Функция ЭлементСправочника(НазваниеСправочника, СтруктураПараметров, Режим = 2) Экспорт

    Результат = Неопределено;

    Искать = (Режим = 1 или Режим = 2);

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

                ТекстУсловий = ТекстУсловий + НазваниеСправочника + "." + ЭлементСтруктуры.Ключ + " = &" + ЭлементСтруктуры.Ключ + " И ";

            КонецЕсли;
        КонецЦикла;
        ТекстУсловий = ТекстУсловий + "ИСТИНА = ИСТИНА";
        Запрос.Текст = "ВЫБРАТЬ " + НазваниеСправочника + ".Ссылка ИЗ Справочник." + НазваниеСправочника  + " КАК " + НазваниеСправочника + " ГДЕ " + ТекстУсловий;

        ТЗ_РезультатЗапроса = Запрос.Выполнить().Выгрузить();

        Если ТЗ_РезультатЗапроса.Количество() = 1 Тогда
            Результат = ТЗ_РезультатЗапроса[0].Ссылка;
        ИначеЕсли ТЗ_РезультатЗапроса.Количество() > 1 Тогда
            Сообщить("Найдено более одного элемента:");
            Сообщить(ТЗ_РезультатЗапроса[0].Ссылка);
            Результат = ТЗ_РезультатЗапроса[0].Ссылка;
        КонецЕсли;
    КонецЕсли;

    Создавать = (Режим = 3 или (Режим = 2 и не ЗначениеЗаполнено(Результат)));

    Если Создавать Тогда
        Если СтруктураПараметров.Свойство("ЭтоГруппа") и СтруктураПараметров.ЭтоГруппа Тогда
            НовыйЭлемент = Справочники[НазваниеСправочника].СоздатьГруппу();
        Иначе
            НовыйЭлемент = Справочники[НазваниеСправочника].СоздатьЭлемент();
        КонецЕсли;

        ЗаполнитьЗначенияСвойств(НовыйЭлемент, СтруктураПараметров);
        НовыйЭлемент.Записать();
        Результат = НовыйЭлемент.Ссылка;
    КонецЕсли;

    Возврат Результат;

КонецФункции
```