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