Значения реквизитов объекта. Возвращает структуру, содержащую значения реквизитов, прочитанные из информационной базы по ссылке на объект.
// Возвращает структуру, содержащую значения реквизитов, прочитанные из информационной базы по ссылке на объект.
// Рекомендуется использовать вместо обращения к реквизитам объекта через точку от ссылки на объект
// для быстрого чтения отдельных реквизитов объекта из базы данных.
//
// Если необходимо зачитать реквизит независимо от прав текущего пользователя,
// то следует использовать предварительный переход в привилегированный режим.
//
// Параметры:
// Ссылка - ЛюбаяСсылка - объект, значения реквизитов которого необходимо получить.
// - Строка - полное имя предопределенного элемента, значения реквизитов которого необходимо получить.
// Реквизиты - Строка - имена реквизитов, перечисленные через запятую, в формате
// требований к свойствам структуры.
// Например, "Код, Наименование, Родитель".
// - Структура, ФиксированнаяСтруктура - в качестве ключа передается
// псевдоним поля для возвращаемой структуры с результатом, а в качестве
// значения (опционально) фактическое имя поля в таблице.
// Если ключ задан, а значение не определено, то имя поля берется из ключа.
// - Массив, ФиксированныйМассив - имена реквизитов в формате требований
// к свойствам структуры.
// ВыбратьРазрешенные - Булево - если Истина, то запрос к объекту выполняется с учетом прав пользователя;
// если есть ограничение на уровне записей, то все реквизиты вернутся со
// значением Неопределено; если нет прав для работы с таблицей, то возникнет исключение;
// если Ложь, то возникнет исключение при отсутствии прав на таблицу
// или любой из реквизитов.
//
// Возвращаемое значение:
// Структура - содержит имена (ключи) и значения затребованных реквизитов.
// - если в параметр Реквизиты передана пустая строка, то возвращается пустая структура.
// - если в параметр Ссылка передана пустая ссылка, то возвращается структура,
// соответствующая именам реквизитов со значениями Неопределено.
// - если в параметр Ссылка передана ссылка несуществующего объекта (битая ссылка),
// то все реквизиты вернутся со значением Неопределено.
//
Функция ЗначенияРеквизитовОбъекта(Ссылка, Знач Реквизиты, ВыбратьРазрешенные = Ложь) Экспорт
// Если передано имя предопределенного.
Если ТипЗнч(Ссылка) = Тип("Строка") Тогда
ПолноеИмяПредопределенногоЭлемента = Ссылка;
// Вычисление ссылки по имени предопределенного.
// - дополнительно выполняет проверку метаданных предопределенного, выполняется предварительно.
Попытка
Ссылка = ПредопределенныйЭлемент(ПолноеИмяПредопределенногоЭлемента);
Исключение
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Неверный первый параметр Ссылка в функции ОбщегоНазначения.ЗначенияРеквизитовОбъекта:
|%1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
ВызватьИсключение ТекстОшибки;
КонецПопытки;
// Разбор полного имени предопределенного.
ЧастиПолногоИмени = СтрРазделить(ПолноеИмяПредопределенногоЭлемента, ".");
ПолноеИмяОбъектаМетаданных = ЧастиПолногоИмени[0] + "." + ЧастиПолногоИмени[1];
// Если предопределенный не создан в ИБ, то требуется выполнить проверку доступа к объекту.
// В других сценариях проверка доступа выполняется в момент исполнения запроса.
Если Ссылка = Неопределено Тогда
МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(ПолноеИмяОбъектаМетаданных);
Если Не ПравоДоступа("Чтение", МетаданныеОбъекта) Тогда
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Недостаточно прав для работы с таблицей ""%1""'"), ПолноеИмяОбъектаМетаданных);
КонецЕсли;
КонецЕсли;
Иначе // Если передана ссылка.
Попытка
ПолноеИмяОбъектаМетаданных = Ссылка.Метаданные().ПолноеИмя();
Исключение
ВызватьИсключение
НСтр("ru = 'Неверный первый параметр Ссылка в функции ОбщегоНазначения.ЗначенияРеквизитовОбъекта:
|- Значение должно быть ссылкой или именем предопределенного элемента'");
КонецПопытки;
КонецЕсли;
// Разбор реквизитов, если второй параметр Строка.
Если ТипЗнч(Реквизиты) = Тип("Строка") Тогда
Если ПустаяСтрока(Реквизиты) Тогда
Возврат Новый Структура;
КонецЕсли;
// Удаление пробелов.
Реквизиты = СтрЗаменить(Реквизиты, " ", "");
// Преобразование параметра в массив полей.
Реквизиты = СтрРазделить(Реквизиты, ",");
КонецЕсли;
// Приведение реквизитов к единому формату.
СтруктураПолей = Новый Структура;
Если ТипЗнч(Реквизиты) = Тип("Структура")
Или ТипЗнч(Реквизиты) = Тип("ФиксированнаяСтруктура") Тогда
СтруктураПолей = Реквизиты;
ИначеЕсли ТипЗнч(Реквизиты) = Тип("Массив")
Или ТипЗнч(Реквизиты) = Тип("ФиксированныйМассив") Тогда
Для Каждого Реквизит Из Реквизиты Цикл
Попытка
ПсевдонимПоля = СтрЗаменить(Реквизит, ".", "");
СтруктураПолей.Вставить(ПсевдонимПоля, Реквизит);
Исключение
// Если псевдоним не является ключом.
// Поиск ошибки доступности полей.
Результат = НайтиОшибкуДоступностиРеквизитовОбъекта(ПолноеИмяОбъектаМетаданных, Реквизиты);
Если Результат.Ошибка Тогда
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Неверный второй параметр Реквизиты в функции ОбщегоНазначения.ЗначенияРеквизитовОбъекта: %1'"),
Результат.ОписаниеОшибки);
КонецЕсли;
// Не удалось распознать ошибку, проброс первичной ошибки.
ВызватьИсключение;
КонецПопытки;
КонецЦикла;
Иначе
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Неверный тип второго параметра Реквизиты в функции ОбщегоНазначения.ЗначенияРеквизитовОбъекта: %1'"),
Строка(ТипЗнч(Реквизиты)));
КонецЕсли;
// Подготовка результата (после выполнения запроса переопределится).
Результат = Новый Структура;
// Формирование текста запроса к выбираемым полям.
ТекстЗапросаПолей = "";
Для каждого КлючИЗначение Из СтруктураПолей Цикл
ИмяПоля = ?(ЗначениеЗаполнено(КлючИЗначение.Значение),
КлючИЗначение.Значение,
КлючИЗначение.Ключ);
ПсевдонимПоля = КлючИЗначение.Ключ;
ТекстЗапросаПолей =
ТекстЗапросаПолей + ?(ПустаяСтрока(ТекстЗапросаПолей), "", ",") + "
| " + ИмяПоля + " КАК " + ПсевдонимПоля;
// Предварительное добавление поля по псевдониму в возвращаемый результат.
Результат.Вставить(ПсевдонимПоля);
КонецЦикла;
// Если предопределенного нет в ИБ.
// - приведение результата к отсутствию объекта в ИБ или передаче пустой ссылки.
Если Ссылка = Неопределено Тогда
Возврат Результат;
КонецЕсли;
ТекстЗапроса =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
|&ТекстЗапросаПолей
|ИЗ
| &ПолноеИмяОбъектаМетаданных КАК Таблица
|ГДЕ
| Таблица.Ссылка = &Ссылка";
Если Не ВыбратьРазрешенные Тогда
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "РАЗРЕШЕННЫЕ", "");
КонецЕсли;
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТекстЗапросаПолей", ТекстЗапросаПолей);
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолноеИмяОбъектаМетаданных", ПолноеИмяОбъектаМетаданных);
// Выполнение запроса.
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.Текст = ТекстЗапроса;
Попытка
Выборка = Запрос.Выполнить().Выбрать();
Исключение
// Если реквизиты были переданы строкой, то они уже конвертированы в массив.
// Если реквизиты - массив, оставляем без изменений.
// Если реквизиты - структура - конвертируем в массив.
// В остальных случаях уже было бы выброшено исключение.
Если Тип("Структура") = ТипЗнч(Реквизиты) Тогда
Реквизиты = Новый Массив;
Для каждого КлючИЗначение Из СтруктураПолей Цикл
ИмяПоля = ?(ЗначениеЗаполнено(КлючИЗначение.Значение),
КлючИЗначение.Значение,
КлючИЗначение.Ключ);
Реквизиты.Добавить(ИмяПоля);
КонецЦикла;
КонецЕсли;
// Поиск ошибки доступности полей.
Результат = НайтиОшибкуДоступностиРеквизитовОбъекта(ПолноеИмяОбъектаМетаданных, Реквизиты);
Если Результат.Ошибка Тогда
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Неверный второй параметр Реквизиты в функции ОбщегоНазначения.ЗначенияРеквизитовОбъекта: %1'"),
Результат.ОписаниеОшибки);
КонецЕсли;
// Не удалось распознать ошибку, проброс первичной ошибки.
ВызватьИсключение;
КонецПопытки;
// Заполнение реквизитов.
Если Выборка.Следующий() Тогда
ЗаполнитьЗначенияСвойств(Результат, Выборка);
КонецЕсли;
Возврат Результат;
КонецФункции
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
Вернуть значения реквизитов объекта
ЗначенияРеквизитовОбъектов (БСП)
ЗначениеРеквизитаОбъектов (БСП)
ЗначениеРеквизитаОбъекта (БСП)
ПолучитьЗначениеРеквизитаПредмета (БСП)
ЗаполнитьЗначениеРеквизитаУпорядочивания (БСП)
СброситьЗначениеРеквизитаУпорядочивания (БСП)