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

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

  • автор:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Что такое метаданные в 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 не будет опубликован. Обязательные поля помечены *