Как из типа получить полное имя объекта метаданных?
Есть Тип (например, ДокументСсылка.ЗаказПокупателя), нужно получить из него полное имя объекта метаданных (Документ.ЗаказПокупателя), чтобы подставить в динамически формируемый текст запроса.
Как это проще и красивее сделать?
// Функция возвращает значение реквизита произвольного объекта ссылочного типа
// Предназначена для получения реквизитов недоступных пользователю объектов
Функция ПолучитьРеквизитОбъекта(Ссылка, ИмяРеквизита) Экспорт
ОбъектМетаданные = Ссылка.Метаданные();
ИмяТаблицы = ОбъектМетаданные.ПолноеИмя();
Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ РАЗРЕШЕННЫЕ " + ИмяРеквизита + " КАК " + ИмяРеквизита + " ИЗ " + ИмяТаблицы + "
|ГДЕ Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка[ИмяРеквизита];
Иначе
РеквизитМетаданные = ОбъектМетаданные.Реквизиты.Найти(ИмяРеквизита);
Возврат РеквизитМетаданные.Тип.ПривестиЗначение();
КонецЕсли;
делал поиск объекта по ид
ТипОбъекта — поле на форме с типом ОписаниеТипов
ИД — поле на форме тип Строка
спр = Справочники[СтрЗаменить(Строка(ТипОбъекта.Типы().Получить(0))," ", "")].ПолучитьСсылку(Новый УникальныйИдентификатор(ЭтаФорма.ИД));
спр.ПолучитьФорму().Открыть();
(0) В запросе делаем метку типа %ТипДокумента%. По типу документа формируем имя для запроса:
Работа во встроенном языке с объектами метаданных
Во встроенном языке "1С:Предприятия" предоставляется доступ к структуре метаданных конфигурации. Эта возможность предназначена в основном для создания универсальных алгоритмов, которые могли бы единообразно работать с различными объектами конфигурации. В этом разделе приводится информация об особенностях работы с метаданными во встроенном языке.
Доступ к метаданным предоставляется только на чтение. Программное изменение метаданных не поддерживается.
В документации по встроенному языку не приводится перечень свойств объектов метаданных и коллекций подчиненных объектов. Для ознакомления со структурой объектов и составом свойств необходимо использовать отчет по конфигурации (в режиме Конфигуратор меню Конфигурация – Отчет по конфигурации). Имена, отображаемые в этом отчете, соответствуют именам свойств и коллекций подчиненных объектов.
Структура метаданных в отчете и в программной модели не содержит ветки «Общие». Эта ветка используется только в дереве метаданных для удобства редактирования. В отчете по конфигурации и в программной модели все объекты, входящие в ветку «Общие», подчинены непосредственно корневому объекту.
Доступ к структуре метаданных осуществляется через свойство Метаданные глобального контекста. Это свойство предоставляет доступ к корневому объекту конфигурации и коллекциям объектов верхнего уровня. Каждый объект предоставляет соответственно доступ к своим свойствам и подчиненным объектам. Таким образом, можно получить доступ к любому объекту.
Например:
Кроме того, у некоторых типов предназначенных для работы с прикладными объектами, имеется метод Метаданные() , предназначенный для получения объекта метаданных, отвечающего за конкретный тип.
Например:
Однако такие методы есть не у всех типов, используемых для работы с прикладными объектами. Если необходимо получить объект метаданных, отвечающий за некоторый тип прикладного объекта, то можно использовать метод НайтиПоТипу() .
Например:
Объекты метаданных можно сравнивать на равенство. При этом проверяется идентичность объектов, а не совпадение значений свойств. То есть проверяется то, что сравнивается именно один и тот же объект конфигурации.
Например:
С помощью метода Родитель() можно получить вышестоящий объект метаданных.
Например:
Для представления объекта метаданных пользователю нужно использовать преобразование значения к строке или метод Представление() .
Например:
Объекты метаданных не могут быть сериализованы. Для получения строкового значения, соответствующего объекту метаданных, независимого от языка интерфейса пользователя нужно использовать метод ПолноеИмя() .
Например:
Для поиска объекта метаданных, соответствующего значению перечисления, можно использовать методику, описанную в разделе «Как получить имя значения перечисления, заданное в метаданных?».
Метаданные можно использовать, чтобы проверить, относится ли, например, значение к справочникам. Методика такой проверки описана в разделе «Как проверить, что тип значения относится к справочникам, документам и т. д.?».
Некоторые свойства объектов метаданных имеют перечислимый тип. Это специальные перечисления. Доступ к ним в языке выполняется через коллекцию СвойстваОбъектов , предоставляемую корневым объектом метаданных. Состав этих перечислений описан в документации, в разделе, описывающем работу с объектами метаданных.
Например:
Некоторые свойства объектов метаданных являются коллекциями значений и представляются типом КоллекцияЗначенийСвойстваОбъектаМетаданных .
Например:
В разделе документации, описывающем работу с объектами метаданных, приводятся также описания специфических типов свойств метаданных, например, таких как ПараметрыВводаПоСтроке .
Следует учитывать, что не все значения свойств метаданных могут быть получены из встроенного языка. Программный доступ к объектам метаданных не позволяет получать, например, значения свойств, хранящих формы, модули, макеты, разделы справочной информации, картинки, интерфейсы, стили, наборы предопределенных объектов, права.
Для получения форм и макетов используются специализированные методы.
Для получения значений, идентифицирующих стили и элементы стилей, а также картинок, используются специализированные коллекции.
Например:
Для проверки прав текущего пользователя используются специализированные методы глобального контекста ПравоДоступа() и ПараметрыДоступа() .
Работа с метаданными объекта 1С или как очистить все реквизиты и табличные части
Не так давно пришлось приводить конфигурацию заказчика в соответствие с законом «О защите персональных данных», который гласит, что при отказе клиенту в одобрении заявки все личные данные о нем должны удаляться из информационной системы обработки персональных данных, которой является 1С. Реквизитов и таблиц с личными данными было достаточно много, поэтому вручную прописывать очистку было нецелесообразно. А удалять сам элемент справочника было нельзя, потому что к нему был привязан документ рассмотрения заявки, и удаление нарушило бы логическую целостность информационной базы.
Поэтому необходим был механизм, который позволил бы получить полный список реквизитов и табличных частей. Для этого у объектов 1С существует встроенная функция Метаданные().
Эта функция возвращает значение особого типа — ОбъектМетаданных. В нем содержатся практически все свойства объекта. Например для элемента справочника это будут: длина наименования и кода, автонумерация, основные формы, вообще все существующие формы, представление объекта, иерархичность, макеты и многое другое.
В нашем случае потребуются Реквизиты и Табличные части. Эти компоненты метаданных содержат значение КоллекцияОбъектовМетаданных, которую можно обойти в цикле Для каждого.
У каждого из элементов коллекции тоже много свойств, в частности есть очень полезное свойство Тип, через которое можно получить тип того или иного реквизита. Полный список свойств можно узнать, например, в режиме отладки через команду Вычислить выражение. Мне же для обращения к реквизиту или табличной части потребуется свойство Имя.
В итоге модуль, очищающий реквизиты и табличные части, выглядит так:
Контрагент = КонтрагентСсылка . ПолучитьОбъект ( ) ;
//Переменная КонтрагентСсылка должна содержать ссылку на элемент</p>
Для Каждого Реквизит Из Контрагент . Метаданные ( ) . Реквизиты Цикл
Контрагент [ Реквизит . Имя ] = Неопределено ;
КонецЦикла ;
Для Каждого ТаблЧасть Из Контрагент . Метаданные ( ) . ТабличныеЧасти Цикл
Контрагент [ ТаблЧасть . Имя ] . Очистить ( ) ;
КонецЦикла ;
Функция Метаданные() применяется как для самого объекта, так и для ссылки на него. В нашем случае необходимо было изменить значения реквизитов, поэтому объект нужно было получить. Данная функция работает не только для справочников, но и для других объектов конфигурации 1С, но состав свойств будет иным.
Приведенный в заметке пример — это только один из многочисленных способов применения функции Метаданные(). Другие варианты и проблемы с использованием метаданных готов обсудить в комментариях.
Получение имени типа ссылочного значения
Определение имени типа ссылочного значения нужно в случаях выгрузки данных например в XML файл что бы описать формат хранимых данных. К примеру, имя типа для документа «Реализация товаров и услуг» будет выглядеть так: «Документ.РеализацияТоваровУслуг».
Имя типа ссылочного значения «Ссылка» определяется следующим выражением:
ИмяТипа = Метаданные . НайтиПоТипу ( ТипЗнч ( Ссылка )). ПолноеИмя ();
Получение имени типа ссылочного значения: 2 комментария
Really Appreciate this update, how can I make is so that I receive an email every time you make a new update?
traoreer