рубрики: Метаданные | Дата: 6 февраля, 2017
Метаданные представляют собой структуру базы данных 1С:Предприятия. То есть это структура в которой описываются справочники, документы, регистры, перечисления и т.д., а также подчиненные им элементы: табличные части, реквизиты, измерения ресурсы и прочее. Визуально мы можем наблюдать эту структуру в конфигураторе, когда открываем дерево конфигурации.
Редактирование метаданных возможно только в режиме конфигуратора, но в языке 1С существуют методы и функции, которые осуществляют программный доступ к метаданным в режиме чтения.
Бывают ситуации когда надо обработать по одному правилу все схожие между собой объекты. Допустим нам надо написать обработку, которая будет производить некие действия со всеми справочниками у которых есть реквизит Товар. Без использования метаданных надо будет проанализировать вручную всю ветку со справочниками в дереве конфигурации и для каждого справочника написать отдельный код. А с использованием метаданных мы можем программно обойти все справочники, а затем для каждого справочника можем проанализировать все его реквизиты. И в случае если искомый реквизит найден обработать все элементы справочника. Этот подход значительно уменьшит количество кода и предварительной ручной работы. Опять же если в конфигурацию будет добавлен новый справочник, в первом случае (без использования метаданных) необходимо будет дорабатывать обработку. Если же были использованы метаданные, никакой доработки не потребуется.
Также метаданные можно использовать в случае работы с реквизитами составного типа. Когда в зависимости от метаданных реквизита может различаться алгоритм работы программы.
В качестве первого примера рассмотрим обход в цикле всех справочников и для каждого справочника также в цикле обход всех его реквизитов. Доступ к метаданным осуществляется с использованием свойства глобального контекста Метаданные. Вот код который выполняет данную задачу
Для каждого МетаданныеСправочника Из Метаданные.Справочники Цикл
Сообщить(МетаданныеСправочника.Имя);
Сообщить(МетаданныеСправочника.Синоним);
Для каждого РеквизитСправочника Из МетаданныеСправочника.Реквизиты Цикл
Сообщить(РеквизитСправочника.Имя);
Сообщить(РеквизитСправочника.Синоним);
КонецЦикла;
КонецЦикла;
Зачастую возникает ситуация когда надо получить метаданные по ссылке какого-нибудь объекта. Это может быть элемент справочника, документ и т.д. И здесь нам поможет метод НайтиПоТипу(<Тип>). Этот метод позволяет получить метаданные по типу объекта. Соответственно если у нас есть ссылка нам надо сначала узнать ее тип. Сделать это поможет функция ТипЗнч(<Значение>). В качестве примера возьмем справочник Пользователи (т.к. он есть наверное во всех конфигурациях). Выберем из него первый попавшийся элемент и получим по нему метаданные.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Пользователи.Ссылка
|ИЗ
| Справочник.Пользователи КАК Пользователи";
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
МетаданныеОбъекта = Метаданные.НайтиПоТипу(ТипЗнч(Выборка.Ссылка));
Сообщить(МетаданныеОбъекта.Имя);
Сообщить(МетаданныеОбъекта.Синоним);
КонецЦикла;
Cуществует еще один метод, который позволяет получить метаданные по полному имени объекта. Речь идет о методе НайтиПоПолномуИмени(<ПолноеИмя>). Если взять тот же справочник Пользователи, то его полное имя выглядить как Справочник.Пользователи. Соответственно код для получения метаданных справочника Пользователи по полному имени выглядит вот так
МетаданныеПользователи = Метаданные.НайтиПоПолномуИмени("Справочник.Пользователи");
Если выбирать между получением метаданных по ссылке и по полному имени, то мне больше по душе метод НайтиПоТипу(<Тип>).
Конечно Имя и Синоним, в примерах выше — это лишь малая часть информации, которую можно извлечь из метаданных. Но тут как говориться Shift + F9 в помощь.
Добавить комментарий