Что такое метаданные в 1с
Перейти к содержимому

Что такое метаданные в 1с

Что такое метаданные в 1с

Структура базы данных 1С описывается в конфигурации с помощью объектов метаданных 1С.

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

Верхний уровень в дереве конфигурации – виды объектов метаданных 1С. По нажатию правой кнопки на вид доступна команда «Добавить», которая добавляет конкретный объект метаданных 1С.

Объекты метаданных 1С состоят из свойств, которые описывают их структуру и пользовательских данных. Так объекты метаданных 1С справочники и документы – имеют пользовательские данные, а объекты метаданных 1С отчет и обработка – имеют только свойства, описывающие их.

Вводить и просматривать пользовательские данные можно только в режиме исполнения (режим 1С:Предприятие). Просматривать и изменять свойства объекта метаданных 1С можно только в режиме конфигуратора.

Распространенные свойства объектов метаданных 1С:

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

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

Проголосовать за этот пост:

Работа с метаданными

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

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

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

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

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

Примеры

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

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

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

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

Запрос

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

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

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

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

Что такое метаданные в 1с

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

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

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

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

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

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

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

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

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

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

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

Только зарегистрированные пользователи VIP группы могут видеть этот контент.

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

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

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

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

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

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

Проголосовать за этот пост:

Что такое метаданные в 1с

Что такое объект Метаданные и зачем он может пригодиться?
Объект Метаданные предназначен для доступа к объектам конфигурации, объявленным при ее создании (т.е. в Конфигураторе). Одна из задач, где широко используется метаданные — универсальные обработки, где заранее не известно, с какими видами объектов придется работать. Другая, не менее часто возникающая задача, — универсальная обработка атрибутов похожих но, тем не менее, различных видов объектов (например — одинаковая обработка табличных частей документов, в одном из которых есть «лишнее» поле).
К каким объектам мы можем доступиться, используя Метаданные?
Практически ко всем, объявленным в Конфигураторе: Константа, Справочник, Документ, Журнал, ПланСчетов и т.д.
Синтаксис использования объекта следующий:

Кво = Метаданные.Объект(); // получение количества элементов
МетаОб = Метаданные.Объект(Номер | Идентификатор); // объект метаданных
КвоРекв = МетаОб.Реквизит(); // количество реквизитов
// хотя в некоторых случаях может быть и такой синтаксис:
КвоРекв = МетаОб.Реквизит.Количество; // количество реквизитов
МетаРекв = МетаОб.Реквизит(Номер | Идентификатор); // реквизит объекта
// или для второго случая:
МетаРекв = МетаОб.Реквизит.Получить(Номер); // реквизит объекта

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

Если Метаданные.Объект(Идентификатор).Выбран()=1 Тогда . // Объект существует
Если МетаОб.Реквизит(Идентификатор).Выбран()=1 Тогда . // Реквизит существует

Объекты метаданных имеют атрибуты, позволяющие определить подробные их характеристики. К таким атрибутам относятся стандартные (Идентификатор, Тип, Вид, Длина, Точность, . ) или специфические для конкретных объектов (ДлинаКода, ДлинаНаименования, ТипНомера, . ).
Приведем простой пример получения списка всех справочников:

Функция СписокДокументов()
Сп=СоздатьОбъект(«СписокЗначений»);
Для И1=1 По Метаданные.Справочник() Цикл
МетаСпр=Метаданные.Справочник(И1);
Сп.Установить(МетаСпр.Синоним, МетаСпр);
КонецЦикла;
Возврат Сп;
КонецФункции

Если я еще не убедил вас в полезности этого объекта — посмотрите, насколько широко он используется в стандартных конфигурациях (только «для Украины»? Или во всех? не знаю. ). Это и «Обработка документов», и функции глЕстьРеквизитШапки, глЕстьРеквизитТабличнойЧасти и другие фичи.
Напоследок рассмотрим более интересный (с практической точки зрения) пример: создание из существующего документа нового, возможно — другого вида.

Процедура КопироватьДокумент(ИсхДок, ВидДок, Сп)
// ИсхДок — исходный документ
// ВидДок — вид нового документа
// Сп — список соответствий реквизитов:
// Значение — реквизит в исходном документе
// Строка — реквизит нового документа
Д=СоздатьОбъект(«Документ.»+ВидДок);
Д.Новый();
МетаДок=Метаданные.Документ(ВидДок);

// Копируем общие реквизиты — для них соответствий не нужно
Для И1=1 По Метаданные.ОбщийРеквизитДокумента() Цикл
ИдРекв=Метаданные.ОбщийРеквизитДокумента(И1).Идентификатор;
// Идентификатор guid уникальный — не копируем!
Если НРег(ИдРекв)=»guid» Тогда Продолжить; КонецЕсли;

Д.УстановитьАтрибут(ИдРекв, ИсхДок.ПолучитьАтрибут(ИдРекв));
КонецЦикла;

// Копируем реквизиты шапки. Несопоставленные — пропускаем
Для И1=1 По МетаДок.РеквизитШапки() Цикл
ИдРекв=МетаДок.РеквизитШапки(И1).Идентификатор;
ИдИсх=Сп.Получить(ИдРекв);
Если ПустоеЗначение(ИдИсх)=1 Тогда Продолжить; КонецЕсли;

Д.УстановитьАтрибут(ИдРекв, ИсхДок.ПолучитьАтрибут(ИдИсх));
КонецЦикла;

// Построчно копируем реквизиты табличной части.
// Как и для реквизитов шапки несопоставленные — пропускаем
ИсхДок.ВыбратьСтроки();
Пока ИсхДок.ПолучитьСтроку()=1 Цикл
Д.НоваяСтрока();
Для И1=1 По МетаДок.РеквизитТабличнойЧасти() Цикл
ИдРекв=МетаДок.РеквизитТабличнойЧасти(И1).Идентификатор;
ИдИсх=Сп.Получить(ИдРекв);
Если ПустоеЗначение(ИдИсх)=1 Тогда Продолжить; КонецЕсли;

Д.УстановитьАтрибут(ИдРекв, ИсхДок.ПолучитьАтрибут(ИдИсх));
КонецЦикла;
КонецЦикла;

// Документ скопирован. Запишем и покажем
Д.Записать();
Конт=»»;
ОткрытьФорму(Д.ТекущийДокумент(), Конт, );
КонецПроцедуры

P.S.: Документацию в формате ALS (формат справки 1С) по метаданным можно найти на сайтах, посвященным 1С программированию, например в Клубе профессионалов 1С. Или воспользоваться поиском на yandex.ru.

P.P.S.: Обработку, выполняющую копирование документов можно взять здесь.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *