Что такое объект
Метаданные и зачем он может пригодиться?
Объект
Метаданные предназначен для доступа к объектам конфигурации, объявленным при ее создании (т.е. в Конфигураторе). Одна из задач, где широко используется метаданные - универсальные обработки, где заранее не известно, с какими видами объектов придется работать. Другая, не менее часто возникающая задача, - универсальная обработка атрибутов похожих но, тем не менее, различных видов объектов (например - одинаковая обработка табличных частей документов, в одном из которых есть "лишнее" поле).
К каким объектам мы можем доступиться, используя
Метаданные?
Практически ко всем, объявленным в Конфигураторе:
Константа,
Справочник,
Документ,
Журнал,
ПланСчетов и т.д.
Синтаксис использования объекта следующий:
Кво = Метаданные.Объект(); // получение количества элементов
МетаОб = Метаданные.Объект(Номер | Идентификатор); // объект метаданных
КвоРекв = МетаОб.Реквизит(); // количество реквизитов
// хотя в некоторых случаях может быть и такой синтаксис:
КвоРекв = МетаОб.Реквизит.Количество; // количество реквизитов
МетаРекв = МетаОб.Реквизит(Номер | Идентификатор); // реквизит объекта
// или для второго случая:
МетаРекв = МетаОб.Реквизит.Получить(Номер); // реквизит объекта
Какой конкретно случай использовать для доступа к объектам - смотрите в документации.
Как видите - доступ к количеству несколько отличается от общепринятого (если такое слово применимо к 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.: Обработку, выполняющую копирование документов можно взять
здесь.
--
Kivals