1с как получить имя метаданных из ссылки
Перейти к содержимому

1с как получить имя метаданных из ссылки

  • автор:

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

В результате её выполнения мы получим той ссылки которой является данная переменная.

Однако синоним в большинстве случаев не совпадает с наименованием объекта метаданных, кроме того не очевидно чем именно является данный объект, справочником, перечислением, документом или еще чем.

Когда нам нужно получить всю цепочку имени объекта метаданных, нам необходимо получить его полное имя: Метаданные.НайтиПоТипу(_Тип).ПолноеИмя();

Так например для ссылки _ДОГ на элемент справочника договоров, имеем следующее:

В приведенном фрагменте, обходим реквизиты объекта метаданных, получаем и выводим их полное имя, в том случае если тип составной просматриваем все типы реквизита .Типы()

Здесь стоит упомянуть о таком о объекте как ОписаниеТипов — это объект, который управляет ограничением допустимых типов значений, присваиваемых объектам системы. Этот объект используют в момент создания объектов, он определяет набор допустимых типов и используется как свойства создаваемых объектов.

Область применения: управляемое приложение, мобильное приложение, обычное приложение.

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

2. В тех случаях, когда тип объекта метаданного заранее неизвестен, рекомендуется воспользоваться методом НайтиПоТипу , например:

// Получить полное имя объекта метаданных вида «Справочник.Номенклатура», «Документ.ПриходнаяНакладная» по переданной ссылке.
ИмяОбъектаМетаданного = Метаданные.НайтиПоТипу(ТипЗнч(Ссылка)).ПолноеИмя();

Для того чтобы получить имя объекта, следует воспользоваться свойством «Имя» объекта метаданных, который можно получить методом «Метаданные».

Например, если «Справ» — это ссылка на элемент справочника, тогда имя этого справочника, заданное в конфигураторе, можно получить следующим образом:

Для типов, не имеющих метода Метаданные() , можно использовать поиск в структуре метаданных конфигурации. Например, если переменная «ВыборкаНоменклатуры» имеет тип СправочникВыборка.Номенклатура, тогда:

1с как получить имя метаданных из ссылки

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

Из программы на языке 1С доступен список метаданных 1С и их свойства.

Это удобно, когда требуется получить список документов в конфигурации или отработать все реквизиты документа.

Рассмотрим, как работать с метаданными 1С конфигурации из языка 1С.

Метаданные 1С конфигурации

Глобальная переменная Метаданные дает доступ к метаданным 1С всей конфигурации (т.е. к «корню» конфигурации). Далее через точку можно обращаться к «коллекциям» — документы, справочники и т.п., чтобы выйти на конкретный справочник или документ, у которых соответственно есть «коллекции» реквизиты, табличные части и т.п. – все, как в конфигураторе, в дереве конфигурации.

Пример – создадим список всех документов конфигурации для того, чтобы пользователь мог выбрать нужный документ из списка:
спДокументовКонфигурации = Новый СписокЗначений(); //сюда будем сохранять список

//Метаданные — глобальная переменная, которая дает доступ ко всем метаданным 1С конфигурации
//Метаданные.Документы — коллекция документов конфигурации
Для каждого Документ из Метаданные.Документы Цикл
//Документ — это метаданные 1С документа (каждого, так как мы обходим их в цикле)
//.Имя — наименование документа так, как оно задано в конфигурации
//.Синоним — «человеческое» наименование документа, которое отображается пользователю
//список значений может хранить значение (имя документа) и «представление для пользователя» (как раз — синоним документа)
спДокументовКонфигурации.Добавить( Документ.Имя, Документ.Синоним );
КонецЦикла;

//даем возможность пользователю выбрать из списка нужный документ
элДокумент = спДокументовКонфигурации.ВыбратьЭлемент();

//если пользователь нажал «Отмена», то результатом выбора будет значение НЕОПРЕДЕЛЕНО, иначе результатом будет — выбранный элемент
Если элДокумент Неопределено Тогда
//в .Значение списка значений мы записывали имя документа «как в конфигурации»
//создадим новый документ с таким именем, напомним — к документам можно обращаться Документы.ИмяДокумента или Документы[ИмяДокумента]
обДокумент = Документы[элДокумент.Значение].СоздатьДокумент();
//ДокументОбъект.ПолучитьФорму() — возвращает форму с указанным именем, а если имя не указано — то форму «по-умолчанию»
обДокумент.ПолучитьФорму().Открыть();
КонецЕсли;

Пример – для общего журнала документов (отображающего все виды документов) создадим запрос, который вернет список всех документов:

Метаданные 1С объекта

Большинство объектов 1С, сохраняемых в базе данных (справочники, документы и т.д.) представлены ссылками и объектами (подробнее см. «Ссылки и объекты»).

У ссылок и объектов есть метод .Метаданные(), который позволяет выйти на метаданные 1С этого объекта.

Пример – проверка на наличие реквизитов с типом «Справочник.Организация» в документе и обнуление значения этих реквизитов:
//ДокументОбъект — документ, полученный на изменение или создание
//аналогичным образом можно работать со ссылками, например: ДокументСсылка = Документ.ИмяДокумента.ПустаяСсылка().Метаданные()
ДокументОбъект = Документы.ПоступлениеТоваров.СоздатьДокумент();

//цикл по реквизитам
Для каждого Реквизит из ДокументОбъект.Метаданные().Реквизиты Цикл
//у каждого реквизита может быть как один, так и несколько типов, подробнее см. «ОписаниеТипов»
мТипов = Реквизит.Тип.Типы();
//проверяем по каждому типу — тот ли это нужный нам?
Для каждого Тип из мТипов Цикл
Если Тип = Тип(«СправочникСсылка.Организации») Тогда
//обнуляем реквизит с этим именем в документе
//для «обнуления» можно приравнивать его к Неопределено,
//по факту значение будет установлено не Неопределено, а «пустое значение» типа реквизита
//Неопределено только если у реквизита несколько типов
ДокументОбъект[Реквизит.Имя] = Неопределено;
КонецЕсли;
КонецЦикла;
КонецЦикла;

//цикл по табличным частям
Для каждого ТабЧасть из ДокументОбъект.Метаданные().ТабличныеЧасти Цикл
//в табличной части тоже реквизиты (колонки таб.части)
Для каждого Реквизит из ТабЧасть.Реквизиты Цикл
//здесь аналогично
мТипов = Реквизит.Тип.Типы();
Для каждого Тип из мТипов Цикл
Если Тип = Тип(«СправочникСсылка.Организации») Тогда
//так как это таб.часть, то мы должны пройтись по всем строкам этой тач. части
Для каждого Строка из ДокументОбъект[ТабЧасть.Имя] Цикл
Строка[Реквизит.Имя] = Неопределено;
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;

Работа с метаданными объекта 1С или как очистить все реквизиты и табличные части

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

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

Эта функция возвращает значение особого типа — ОбъектМетаданных. В нем содержатся практически все свойства объекта. Например для элемента справочника это будут: длина наименования и кода, автонумерация, основные формы, вообще все существующие формы, представление объекта, иерархичность, макеты и многое другое.

В нашем случае потребуются Реквизиты и Табличные части. Эти компоненты метаданных содержат значение КоллекцияОбъектовМетаданных, которую можно обойти в цикле Для каждого.

У каждого из элементов коллекции тоже много свойств, в частности есть очень полезное свойство Тип, через которое можно получить тип того или иного реквизита. Полный список свойств можно узнать, например, в режиме отладки через команду Вычислить выражение. Мне же для обращения к реквизиту или табличной части потребуется свойство Имя.

В итоге модуль, очищающий реквизиты и табличные части, выглядит так:

Контрагент = КонтрагентСсылка . ПолучитьОбъект ( ) ;
//Переменная КонтрагентСсылка должна содержать ссылку на элемент</p>
Для Каждого Реквизит Из Контрагент . Метаданные ( ) . Реквизиты Цикл
Контрагент [ Реквизит . Имя ] = Неопределено ;
КонецЦикла ;

Для Каждого ТаблЧасть Из Контрагент . Метаданные ( ) . ТабличныеЧасти Цикл
Контрагент [ ТаблЧасть . Имя ] . Очистить ( ) ;
КонецЦикла ;

Функция Метаданные() применяется как для самого объекта, так и для ссылки на него. В нашем случае необходимо было изменить значения реквизитов, поэтому объект нужно было получить. Данная функция работает не только для справочников, но и для других объектов конфигурации 1С, но состав свойств будет иным.

Приведенный в заметке пример — это только один из многочисленных способов применения функции Метаданные(). Другие варианты и проблемы с использованием метаданных готов обсудить в комментариях.

Добавить комментарий

Ваш адрес email не будет опубликован.