1с как найти метаданные по имени

Узнать метаданные по наименованию

Я
   John83

18.11.10 — 17:39

Получаю строку (например «Номенклатура»), далее нужно узнать, является это справочником или перечислением.

Как это сделать?

PS дальше нужно будет

Справочники[строка].НайтиПоНаименованию(«фыва»)

   Живой Ископаемый

1 — 18.11.10 — 17:41

а если есть и справочник и перечисление — что выберешь?

   John83

2 — 18.11.10 — 17:41

(1) мне так думается, что в типовых такого не бывает

   Живой Ископаемый

3 — 18.11.10 — 17:42

в типовых есть процедурки для (0) наверное

   zbv

4 — 18.11.10 — 17:45

(0) запихай Имена справочников в одну структуру или соответствие, имена документов в другую и проверяй справочник это или документ по наличию.

   mikecool

5 — 18.11.10 — 17:46

Если Метаданные.Справочники.ТипВсессылки.Найти(«Номенклатура»)
кажись так

   John83

6 — 18.11.10 — 17:48

(4) так типовых методов нет? жаль…
всем спасибо

   mikecool

7 — 18.11.10 — 17:49

(6) обнови страницу

   73

8 — 18.11.10 — 17:50

(5) Не надо там ТипВсеСсылки…

   John83

9 — 18.11.10 — 17:51

(5) есть Справочники.ТипВсеСсылки().СодержитТип()
надо будет завтра попробовать
еще раз спасибо

   mikecool

10 — 18.11.10 — 18:00

(8)(9) это я на память придумал ))

   Bober

11 — 18.11.10 — 18:06

ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(«Справочник.» + имяОбъекта);

Если ОбъектМетаданных <> определено Тогда

   John83

12 — 19.11.10 — 09:31

(11) спасибо

   John83

13 — 19.11.10 — 09:33

немного усложним задачку
по значению перечисления, узнать вид перечисления.
без перебора метаданных возможно?

   Sammo

14 — 19.11.10 — 09:46

Вид в каком виде?
ЗначениеПеречисления.Метаданные().Имя
Перечисления[ЗначениеПеречисления.Метаданные().Имя]

  

John83

15 — 19.11.10 — 10:36

(14) попробуем
спасибо

Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа.
Фредерик Брукс-младший

  • Главная
  • О сайте
  • Главная
  • Содержание

Рукопашный бой Карташ

Категории

—>

рубрики: Метаданные | Дата: 6 февраля, 2017

Что такое метаданные

Метаданные представляют собой структуру базы данных 1С:Предприятия. То есть это структура в которой описываются справочники, документы, регистры, перечисления и т.д., а также подчиненные им элементы: табличные части, реквизиты, измерения ресурсы и прочее. Визуально мы можем наблюдать эту структуру в конфигураторе, когда открываем дерево конфигурации.


Редактирование метаданных возможно только в режиме конфигуратора, но в языке 1С существуют методы и функции, которые осуществляют программный доступ к метаданным в режиме чтения.

Зачем нужна работа с метаданными

Бывают ситуации когда надо обработать по одному правилу все схожие между собой объекты. Допустим нам надо написать обработку, которая будет производить некие действия со всеми справочниками у которых есть реквизит Товар. Без использования метаданных надо будет проанализировать вручную всю ветку со справочниками в дереве конфигурации и для каждого справочника написать отдельный код. А с использованием метаданных мы можем программно обойти все справочники, а затем для каждого справочника можем проанализировать все его реквизиты. И в случае если искомый реквизит найден обработать все элементы справочника. Этот подход значительно уменьшит количество кода и предварительной ручной работы. Опять же если в конфигурацию будет добавлен новый справочник, в первом случае (без использования метаданных) необходимо будет дорабатывать обработку. Если же были использованы метаданные, никакой доработки не потребуется.

Также метаданные можно использовать в случае работы с реквизитами составного типа. Когда в зависимости от метаданных реквизита может различаться алгоритм работы программы.

Примеры

Обход метаданных в цикле

В качестве первого примера рассмотрим обход в цикле всех справочников и для каждого справочника также в цикле обход всех его реквизитов. Доступ к метаданным осуществляется с использованием свойства глобального контекста Метаданные. Вот код который выполняет данную задачу




Для каждого МетаданныеСправочника Из Метаданные.Справочники Цикл

	Сообщить(МетаданныеСправочника.Имя);
	Сообщить(МетаданныеСправочника.Синоним);

	Для каждого РеквизитСправочника Из МетаданныеСправочника.Реквизиты Цикл

		Сообщить(РеквизитСправочника.Имя);
		Сообщить(РеквизитСправочника.Синоним);

	КонецЦикла;

КонецЦикла;

Получение метаданных по ссылке объекта

Зачастую возникает ситуация когда надо получить метаданные по ссылке какого-нибудь объекта. Это может быть элемент справочника, документ и т.д. И здесь нам поможет метод НайтиПоТипу(<Тип>). Этот метод позволяет получить метаданные по типу объекта. Соответственно если у нас есть ссылка нам надо сначала узнать ее тип. Сделать это поможет функция ТипЗнч(<Значение>). В качестве примера возьмем справочник Пользователи (т.к. он есть наверное во всех конфигурациях). Выберем из него первый попавшийся элемент и получим по нему метаданные.




Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
|	Пользователи.Ссылка
|ИЗ
|	Справочник.Пользователи КАК Пользователи";

Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();

Пока Выборка.Следующий() Цикл

	МетаданныеОбъекта = Метаданные.НайтиПоТипу(ТипЗнч(Выборка.Ссылка));

	Сообщить(МетаданныеОбъекта.Имя);
	Сообщить(МетаданныеОбъекта.Синоним);

КонецЦикла;

Получение метаданных по полному имени

Cуществует еще один метод, который позволяет получить метаданные по полному имени объекта. Речь идет о методе НайтиПоПолномуИмени(<ПолноеИмя>). Если взять тот же справочник Пользователи, то его полное имя выглядить как Справочник.Пользователи. Соответственно код для получения метаданных справочника Пользователи по полному имени выглядит вот так




МетаданныеПользователи = Метаданные.НайтиПоПолномуИмени("Справочник.Пользователи");

Если выбирать между получением метаданных по ссылке и по полному имени, то мне больше по душе метод НайтиПоТипу(<Тип>).

Конечно Имя и Синоним, в примерах выше — это лишь малая часть информации, которую можно извлечь из метаданных. Но тут как говориться Shift + F9 в помощь.

Поиск объекта метаданных в конфигурации

Объект конфигурации можно найти с помощью диалога Поиск объектов метаданных. Диалог вызывается для окна “Конфигурация” выбором пункта меню “Правка – Найти” или по нажатию Ctrl +F.


В поле Искать указывается строка поиска.
Если требуется найти слово целиком, установите флажок Слово целиком.
Если важен регистр, установите флажок Учитывать регистр
Для обозначения области поиска установите или снимите флажки поиска в Именах, Синонимах, Комментариях.

Похожее

Содержание:

1.      Когда возникает необходимость проверить наличие реквизита 1С?

2.      Как можно получить метаданные объекта 1С?  

1.    Когда возникает необходимость проверить наличие реквизита 1С

Потребность проверки наличия реквизита обычно возникает при написании общих, универсальных процедур или функций, к примеру, когда необходимо выполнить ряд однообразных действий, проверить заполнение перед проведением, при этом реквизитный состав обрабатываемых объектов метаданных отличается незначительно (например, в документе, отражающем продажу товара, есть реквизит Склад, а в документе, отражающем перемещение товара – реквизиты Склад-отправитель и Склад-получатель).

В ряде типовых конфигураций 1С предлагается стандартная функция проверки наличия реквизита в объекте (расположена в модуле “ОбщегоНазначения”)

Функция ЕстьРеквизитОбъекта(ИмяРеквизита, МетаданныеОбъекта) Экспорт

            Возврат НЕ (МетаданныеОбъекта.Реквизиты.Найти(ИмяРеквизита) = Неопределено);

КонецФункции   

2. Как можно получить метаданные объекта 1С

Однако написать свою функцию также не представляет труда. В первую очередь необходимо получить метаданные объекта 1С одним из способов:

через функцию Метаданные() объекта

пример синтаксиса: СправочникСсылка.Метаданные()

                                    ДокументСсылка.Метаданные()

через свойство глобального контекста Метаданные

пример синтаксиса: Метаданные.Справочники.[ИмяСправочника]

                                    Метаданные.Документы.[ИмяДокумента]

Далее через свойство “Реквизиты” использовать функцию Найти(). В случае, если реквизит не найден, возвращается значение Неопределено.

Пример 1

Метаданные = Контрагент.Метаданные();

Если Метаданные.Реквизиты.Найти(«Ответственный») = Неопределено Тогда

            Возврат Ложь;

Иначе

            Возврат Истина;

КонецЕсли;

Пример 2

Функция ПолучитьОрганизацию(Контрагент, Пользователь)

            Если Метаданные.Справочники.Контрагенты.Реквизиты.Найти(«Организация») <> Неопределено Тогда

                        Возврат Контрагент.Организация;

            Иначе

                        Возврат Пользователь.Организация;

            КонецЕсли;

КонецФункции

Описанный алгоритм подходит для случаев проверки наличия реквизита шапки. Но что делать, когда возникает необходимость определить, существует ли реквизит в табличной части 1С (справочника или документа)? Для этого используется следующая конструкция:

Метаданные.Справочники.<ИмяСправочника>.ТабличныеЧасти.Реквизиты.Найти(<ИмяОбъектаПоиска>).

При обработке таблиц значений также возможно выполнить проверку существования колонки – в этом случае применяется метод Свойство(), с помощью которого, помимо основной функции – получения значения элемента по указанному имени, можно проверить, имеется ли указанного свойство.

Пример синтаксиса:

Если НЕ ТекущаяСтрока.Свойство(«Исключить») ИЛИ НЕ ТекущаяСтрока.Исключить Тогда

            ЗаполнитьЗначенияСвойств(ТаблицаЗагрузки.Добавить(); ТекущаяСтрока);

КонецЕсли;

Специалист компании ООО «Кодерлайн»

Кондренко Анна Сергеевна

Узнать тип объекта (справочник, документ, перечисление…), можно используя функцию «XMLТипЗнч».

//Если СоединениеС1С_.Справочники.ТипВсеСсылки().СодержитТип(СоединениеС1С_.ТипЗнч(Источник)) Тогда
    Если Найти(СоединениеС1С_.XMLТипЗнч(источник).TypeName,»CatalogRef»)>0 Тогда

       

        Вид = Источник.Метаданные().Имя;
        Если Вид=»Партнеры» Тогда
            Вид=»Контрагенты»;
        КонецЕсли;
        Если Источник.Пустая() Тогда
            Возврат Справочники[Вид].ПустаяСсылка();
        КонецЕсли;
        УиИст = СоединениеС1С_.string(Источник.УникальныйИдентификатор());
        Уи = Новый УникальныйИдентификатор(УиИст);
        Нашли = Справочники[Вид].ПолучитьСсылку(Уи);
        Если Найти(строка(Нашли),»<Объект не найден>»)>0 Тогда
            Сообщить_(«Не нашли в УТ:»+вид+»: «+Источник.Наименование);
        КонецЕсли;
        Возврат Нашли;
    //ИначеЕсли СоединениеС1С_.Перечисления.ТипВсеСсылки().СодержитТип(СоединениеС1С_.ТипЗнч(Источник)) Тогда    
    ИначеЕсли Найти(СоединениеС1С_.XMLТипЗнч(источник).TypeName,»EnumRef»)>0 Тогда
        ИмяПеречисления = Источник.Метаданные().Имя;
        НужныйИндекс = СоединениеС1С_.Перечисления[ИмяПеречисления].Индекс(Источник);
        ИмяЗначения = СоединениеС1С_.Метаданные.Перечисления[ИмяПеречисления].ЗначенияПеречисления.получить(НужныйИндекс).имя;

       
        Возврат Перечисления[ИмяПеречисления][ИмяЗначения];
    КонецЕсли;

DocumentRef - документ ссылка
DocumentObject - документ объект 
CharOfAccountsRef - план счетов

 

Понравилась статья? Поделить с друзьями:
  • Как найти клетуса в гта 5
  • Как найти натяжение нити перекинутой через блок
  • Как найти ведьмин студень
  • Возможно подключение заблокировано брандмауэром или антивирусной программой как исправить
  • Как найти передаточное число шестеренок