Элемент справочника

SDV 34 7

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

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

Похожие публикации

Как получить дату и время создания элемента справочника, документа по ссылке

Модератору