По объекту метаданных как получить сам объект |
Я |
20.02.16 – 14:02
или хотя бы тип объекта …
1 – 20.02.16 – 14:04
Че?
2 – 20.02.16 – 14:04
Имя, Карл, Имя!
3 – 20.02.16 – 14:05
(0) Метаданные – это класс, а объект – один из многих его экземпляров.
4 – 20.02.16 – 14:07
у меня переменная в ней Значение типа ОбъектМетаданных
5 – 20.02.16 – 14:11
(4) Вот у тебя есть Метаданные.Справочники.Пользователи – какой тип ты надеешься получить? Ссылка? Объект? Менеджер?
6 – 20.02.16 – 14:14
(5) Объект
7 – 20.02.16 – 14:15
(6) найди по ссылке и получи объект
8 – 20.02.16 – 14:16
Вобще-то мне нужен тип этого объекта
9 – 20.02.16 – 14:17
(2) ему человек нужон, на конкретно, мужчина или женчина, а именно человек
10 – 20.02.16 – 14:17
ну вот мой код:
Процедура ДобавитьЭлементы(Ветка, Объект)
Для каждого Элемент Из Объект Цикл
Узлы = Ветка.ПолучитьЭлементы();
Узел = Узлы.Добавить();
Узел.Узел = Элемент.Имя;
//Узел.Объект = Элемент.;
Если Узел.ПолучитьРодителя().Узел=”Табличные части” Тогда
ДобавитьЭлементы(Узел, Элемент.Реквизиты);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ДобавитьВеткуРеквизиты(Дерево, Объект)
Ветка = Дерево.Добавить();
Ветка.Узел = “Реквизиты”;
ДобавитьЭлементы(Ветка,Объект.Реквизиты);
КонецПроцедуры
Процедура ДобавитьВеткуТЧ(Дерево, Объект)
Ветка = Дерево.Добавить();
Ветка.Узел = “Табличные части”;
ДобавитьЭлементы(Ветка,Объект.ТабличныеЧасти);
КонецПроцедуры
Процедура ДобавитьВеткуФормы(Дерево, Объект)
Ветка = Дерево.Добавить();
Ветка.Узел = “Формы”;
ДобавитьЭлементы(Ветка,Объект.Формы);
КонецПроцедуры
Процедура ДобавитьВеткуМакеты(Дерево, Объект)
Ветка = Дерево.Добавить();
Ветка.Узел = “Макеты”;
ДобавитьЭлементы(Ветка,Объект.Макеты);
КонецПроцедуры
Процедура ЗаполнитьДерево(ИмяДокумента)
Док = Метаданные.Документы[ИмяДокумента];
Дерево = СтруктураДокумента1С.ПолучитьЭлементы();
Дерево.Очистить();
Для каждого Элемент Из Док.Реквизиты Цикл
//Элемент
КонецЦикла;
ДобавитьВеткуРеквизиты(Дерево, Док);
ДобавитьВеткуТЧ(Дерево, Док);
ДобавитьВеткуФормы(Дерево, Док);
ДобавитьВеткуМакеты(Дерево, Док);
КонецПроцедуры
11 – 20.02.16 – 14:19
В процедуре первой условие допустим по табличным частям – по названию объекта, а вдруг объект ктото так назвал к примеру и код будет неправильно работать так как у тог не будет реквизитов
12 – 20.02.16 – 14:19
(8) кури ОписаниеТипов
13 – 20.02.16 – 14:20
Если ТипЗнч(ТекОбъект) = Тип(“СправочникСсылка.Номенклатура”) Тогда
…
КонецЕсли;
14 – 20.02.16 – 14:20
(12) не курю, бросил )
15 – 20.02.16 – 14:21
(13) Я не знаю ТекОбъект
16 – 20.02.16 – 14:22
У меня в первой процедуре Элемент типа ОбъектМетаданных
17 – 20.02.16 – 14:23
(14) тогда бросай 1С – это не твое
18 – 20.02.16 – 14:23
19 – 20.02.16 – 14:25
(15) Так а какой именно объект тебе нужен? Помедитируй над этим. И над отличием данных и метаданных.
20 – 20.02.16 – 14:26
ну мне надо понять мой Элемент табличная часть или нет
21 – 20.02.16 – 14:27
и еще узнать ссылочного типа или нет
22 – 20.02.16 – 14:28
(12) чото я покурил но не всосал
23 – 20.02.16 – 14:31
Парадокс, метаданных в том, что получить объект по ссылке можно, а вот ссылку по объекту приходится формировать руками.
Хорошо, что хоть есть метод у объекта метаданных “ПолноеИмя”.
24 – 20.02.16 – 14:38
(23) Вот я получил его
Элемент.ПолноеИмя=”Документ.ПриемНаРаботу.ТабличнаяЧасть.Удержания”
Что дальше … ?
25 – 20.02.16 – 14:39
А мне нужен тип …
26 – 20.02.16 – 14:40
(24) Я от безысходности парсил строку, вычленял первую часть (“справочник”, “документ”, “перечисление”), подцеплял менеджер, из него по имени получал ссылку.
(25) А какой тип нужен из “Документ.ПриемНаРаботу.ТабличнаяЧасть.Удержания”?
27 – 20.02.16 – 14:42
Ну мне надо понять – если это табличная часть то для нее вывести реквизиты, если это ссылочный тип, то структуру этого объекта
28 – 20.02.16 – 14:43
а то, если я начинаю искать реквизиты для реквизитов то их там уже нету … можно конечно исключениями поработать …
29 – 20.02.16 – 14:44
но не люблю я их много использовать
30 – 20.02.16 – 14:45
родитель объекта метаданных даст коллекцию по которой можно понять тип метаменеджера по которому сравнением Если = Тогда ИначеЕсли получить объект глобального контекста который позволит вычислить чисто конкретного менеджера по имени а у него есть метод создания
31 – 20.02.16 – 14:47
(27) ПолноеИмя = <ОбъектМетаданных>.<ИмяОбъекта>.ТабличнаяЧасть.<ИмяТабличнойЧасти>
Это ни о чем не говорит? Нужно именно тип получить, не взирая на то, что тип еще нужно как-то проверить?
32 – 20.02.16 – 14:57
(30) Родитель мне известен, это Объект Вообще не понял вашего сообщения много буков и ни одной даже запятой
33 – 20.02.16 – 14:57
(32) Ну, ты первый начал
34 – 20.02.16 – 14:59
(31) Смотрите. Вот я просматриваю допустим реквизиты документа.
Вот перебираю их – Сотрудник.
Теперь мне надо перебрать реквизиты справочника “Сотрудники” Как мне теперь сослаться на объект метаданных “Сотрудники” ?
35 – 20.02.16 – 15:00
(33) ну у меня тоже бывает, да
36 – 20.02.16 – 15:01
(30) Я так понял сделать процедуру мегасравнения не универсальную это некрасиво и не правильно
37 – 20.02.16 – 15:01
(34) И натыкаешься на составной тип
38 – 20.02.16 – 15:02
(37) не понял
39 – 20.02.16 – 15:05
(37) Мне пофик составной не составной – я в рекурсии все равно уже
40 – 20.02.16 – 15:06
мне осталось в задаче всего-то перейти от реквизита к самому объекту … помогите, люди!!!
41 – 20.02.16 – 15:08
(39) Вот ты просматриваешь допустим реквизиты документа. Вот перебираешь их – Основание составного типа. Теперь тебе надо перебрать реквизиты?
42 – 20.02.16 – 15:09
.Тип Возвращает мне “ФизическиеЛица”
43 – 20.02.16 – 15:10
(42) А почему там строка?
44 – 20.02.16 – 15:10
тип “ОписаниеТипов”
45 – 20.02.16 – 15:10
(43) не строка ОписаниеТипов
46 – 20.02.16 – 15:11
(44) Ну так ты в (0) и хотел тип
47 – 20.02.16 – 15:11
Мне из него надо объект получить как-то Метаданные.Справочники.ФизическиеЛица
48 – 20.02.16 – 15:12
(46) Концепция поменялась 🙂
49 – 20.02.16 – 15:13
(46) и ОписаниеТипов и тип не совсем одно и то же
50 – 20.02.16 – 15:14
(49) я про составные тебе давно говорю
51 – 20.02.16 – 15:14
то есть мне надо тип реквизита
52 – 20.02.16 – 15:14
(50) что составные?
53 – 20.02.16 – 15:16
(52) ну основание документа например
54 – 20.02.16 – 15:16
Там же не тип
55 – 20.02.16 – 15:17
(45) (52) А если в ОписаниеТипов массив типов? Например, СправочникСсылка.ФизическиеЛица, СправочникСсылка.Контрагенты, СправочникСсылка.Склады и Строка. Какой из этих объектов метаданных тебе нужен и что делать со строкой?
56 – 20.02.16 – 15:18
(55) Да мне хотя бы с простым вариантом решить
57 – 20.02.16 – 15:18
(56) тогда по типу надо объект метаданных искать
58 – 20.02.16 – 15:18
ну да, а как?
59 – 20.02.16 – 15:18
в СП же написано
60 – 20.02.16 – 15:19
(59) СП это шо?
61 – 20.02.16 – 15:20
Северная пивоварня
62 – 20.02.16 – 15:20
(55) А в описаниеТипов может всегда массив?
63 – 20.02.16 – 15:20
64 – 20.02.16 – 15:21
(63) хаха, а если серьезно?
65 – 20.02.16 – 15:21
ЖКК знаю, СП нет
66 – 20.02.16 – 15:22
(62) ты ж в (22) уже раскурил
67 – 20.02.16 – 15:22
ИзвестныйМнеТип = “СправочникСсылка.ФизическиеЛица”;
СправочникСсылка = Новый(ИзвестныйМнеТип);
ОбъектМетаданных = СправочникСсылка .Метаданные();
68 – 20.02.16 – 15:22
(34) Ну хорошо, перебираем реквизиты документа. Наткнулись на тип “СправочникСсылка.Сотрудники”. Делаем:
Метаданные.НайтиПоТипу(ТекущийТип)
Получаем объект справочника Сотрудники.
Проходим по его реквизитам, натыкаемся на реквизит “ДокументПриема”, находим документ приема, просматриваем его реквизиты, находим с типом “Сотрудник”.
И тут начинается понимание рекурсии.
69 – 20.02.16 – 15:22
(66) удже забыл
70 – 20.02.16 – 15:23
(68) ну вот, а то СП ..
71 – 20.02.16 – 15:23
14.28 – 15.22
Рекорд
72 – 20.02.16 – 15:23
(62) >> в описаниеТипов может всегда массив?
Вообще-то всегда.
73 – 20.02.16 – 15:25
(72) значит нормально курил
74 – 20.02.16 – 15:26
(70) а еще есть БСП… это Большая СП… ибо судя по сообщениям СП – НЁХ.
(62) В описании типов описание типов. Для получения массива нужен метод.
75 – 20.02.16 – 15:26
(68) Метаданные.НайтиПоТипу(Элемент.Тип) – не работает требует тип а у меня описаниетипов
76 – 20.02.16 – 15:26
(74) Так я в синтакс-помощнике курил! А что такое СП ???
77 – 20.02.16 – 15:27
(76) Так это он и есть!!!
78 – 20.02.16 – 15:27
79 – 20.02.16 – 15:27
(74) Большая синтакс-помощница?
80 – 20.02.16 – 15:28
(77) Геннадий, вот ваше полотенце!
81 – 20.02.16 – 15:28
82 – 20.02.16 – 15:28
(80) Надо короче: Гена, на!
83 – 20.02.16 – 15:30
(75)
Например, так:
Док = Метаданные.Документы.РеализацияТоваров;
Для Каждого Реквием Из Док.Реквизиты Цикл
Сообщить(Реквием.Имя);
ТипыРеквиема = Реквием.Тип.Типы();
Для Каждого ТипР Из ТипыРеквиема Цикл
ПодчиненныйМета = Метаданные.НайтиПоТипу(ТипР);
Если ПодчиненныйМета <> Неопределено Тогда
Для Каждого ПодчиненныйРеквием Из ПодчиненныйМета.Реквизиты Цикл
Сообщить(Реквием.Имя + “.” + ПодчиненныйРеквием.Имя);
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Для Каждого ТаЧасть Из Док.ТабличныеЧасти Цикл
Для Каждого Реквием Из ТаЧасть.Реквизиты Цикл
// Написать примерно то же самое…
КонецЦикла;
КонецЦикла;
Про рекурсию также стоит помнить
84 – 20.02.16 – 15:30
Вобщем у нас конец рабдня, всех с 23Ф
85 – 20.02.16 – 15:32
(83) Сообщить(Реквием.Имя);
86 – 20.02.16 – 15:33
+ к (67): Если есть описание типов
Для Каждого Тип Из ИзвестноеМнеОписаниеТипов Цикл
ОбъектСсылка = Новый(Тип);
ОбъектМетаданных = ОбъектСсылка.Метаданные();
КонецЦикла;
87 – 20.02.16 – 15:38
(86) Это если в описаниях только ссылки. А если будет строка/число/дата/уникальный идентификатор, то упадет с ошибкой отсутствия метода.
88 – 20.02.16 – 15:45
(87) попытка не пытка в 1С
89 – 20.02.16 – 15:54
(88) 4. Недопустимо делать проверки наличия у объекта реквизитов, методов, макетов и т.п., используя для этого исключения, т.к. это может привести к сложно диагностируемым ошибкам, а также затрудняет отладку в режиме «Останавливаться по ошибке».
Вместо перехвата исключений в этом случае рекомендуется:
использовать механизмы работы с метаданными, чтобы явным образом проверять наличие или отсутствие реквизита (макета и т.п.);
если различия связаны с особенностями встраивания библиотек – описывать особенности явным образом в переопределяемых модулях (см. Переопределяемые и поставляемые объекты);
пересмотреть логику работы методов, использующих перехват исключений. Например, можно предусмотреть параметры, которые определяются в вызывающем коде и указывают нужно или нет обращаться к какому-либо методу или свойству объекта.
90 – 21.02.16 – 12:44
Использую попытки там, где они выигрывают по скорости и всем советую. В механизме остановки по ошибке давно есть фильтр. Сложно диагностируемых ошибок новых не появится, если в попытке будет строго одна операция.
91 – 21.02.16 – 14:30
(90) Очень радостно за тебя. Необходимо срочно распространить эту информацию! Расскажи, пожалуйста, подробно о своих достижениях фирме 1С и они внесут изменения в систему стандартов и методик разработки конфигураций для платформы 1С:Предприятие 8.
92 – 21.02.16 – 14:48
(91) Еще 4 года назад об этом им написал, сори что не поставил тебя в копии. Какое у тебя мыло?
93 – 21.02.16 – 15:15
(92) Странно, что за 4 года они так и не внесли изменения. Но не опускай руки, надо продолжать борьбу! Напиши еще на info@sportloto.ru
94 – 21.02.16 – 15:21
(93) Согласен странно. Ведь мое мнение очень важно для 1С. Раз ты так внимательно следишь за моими стараниями, давай свое мыло, подпишу тебя на рассылку о важных событиях, чтобы ты ничего не пропустил.
95 – 21.02.16 – 15:34
(94) liteawri@disposableinbox.com
Только подпиши на действительно важные – мне тоже очень хочется быть на острие прогресса и нести свет заблудшим душам!
96 – 21.02.16 – 15:37
(95) Отправил письмо с запросом подтверждения подписки. Там внутри можно указать флажками, на какие события ты подписываешься. Жду ответ.
97 – 21.02.16 – 16:01
Что-то нет там твоего письма. Ты точно его посылал? Попыткой-Исключением не пользовался?
98 – 21.02.16 – 16:08
Повезло теме, что здесь возник наш диалог. Теперь она будет в топах наверное месяц.
(97) Проверь в спам-фильтрах. Мои письма туда часто попадают.
99 – 21.02.16 – 16:43
(98) Нет в спаме, похоже раньше убилось – в фильтрах почтовика застряло. Это кстати объясняет, почему твое письмо в 1С не получали.
Даешь сотню!
100 – 24.02.16 – 09:33
В общем вот что получилось
Перем
Вложенность;
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Для Каждого Док из Метаданные.Документы цикл
Элементы.Документ1С.СписокВыбора.Добавить(Док.Имя, Док.Синоним);
КонецЦикла;
КонецПроцедуры
Процедура ДобавитьЭлементы(Ветка, Объект)
Для каждого Элемент Из Объект Цикл
Узлы = Ветка.ПолучитьЭлементы();
Узел = Узлы.Добавить();
Узел.Узел = Элемент.Имя;
Попытка
Если Узел.ПолучитьРодителя().Узел=”Табличные части” Тогда
ДобавитьЭлементы(Узел, Элемент.Реквизиты);
Иначе
ТипыЭлемента = Элемент.Тип.Типы();
Для Каждого ТипЭлемента Из ТипыЭлемента Цикл
СвязанныйОбъект = Метаданные.НайтиПоТипу(ТипЭлемента);
Если СвязанныйОбъект <> Неопределено Тогда
ЗаполнитьВеткиДерева(Узел.ПолучитьЭлементы(), СвязанныйОбъект);
КонецЕсли;
КонецЦикла;
КонецЕсли;
Исключение
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Процедура ДобавитьВеткуДерева(Дерево, Узел, НазваниеУзла)
Ветка = Дерево.Добавить();
Ветка.Узел = НазваниеУзла;
ДобавитьЭлементы(Ветка,Узел);
КонецПроцедуры
Процедура ЗаполнитьВеткиДерева(Дерево, Док)
Если МаксимальнаяВложенность>0 И Вложенность>=МаксимальнаяВложенность Тогда
Возврат;
КонецЕсли;
Вложенность=Вложенность+1;
ДобавитьВеткуДерева(Дерево, Док.Реквизиты, “Реквизиты”);
ДобавитьВеткуДерева(Дерево, Док.ТабличныеЧасти, “Табличные части”);
ДобавитьВеткуДерева(Дерево, Док.Формы, “Формы”);
ДобавитьВеткуДерева(Дерево, Док.Макеты, “Макеты”);
КонецПроцедуры
Процедура ЗаполнитьДерево(ИмяДокумента)
Вложенность=0;
Док = Метаданные.Документы[ИмяДокумента];
Дерево = СтруктураДокумента1С.ПолучитьЭлементы();
Дерево.Очистить();
ЗаполнитьВеткиДерева(Дерево, Док);
КонецПроцедуры
&НаКлиенте
Процедура Документ1СПриИзменении(Элемент)
ЗаполнитьДерево(Документ1С);
КонецПроцедуры
Как получить доступ к реквизитам объекта?
Статья носит справочный характер. Предназначена для начинающих программистов.
Получить массив реквизитов объекта можно при помощи самого объекта:
ДокСсылка = СсылкаНаДокумент(ТипДокумента, НомерДок); ДокОбъект = ДокСсылка.ПолучитьОбъект(); МассивРеквизитовОбъекта = ДокОбъект.Метаданные().Реквизиты;
Получив массив реквизитов, можно организовать Цикл для просмотра имен реквизитов:
Для каждого Реквизит Из ДокОбъект.Метаданные().Реквизиты Цикл Сообщить(Реквизит.Имя + " :" + Реквизит.Представление()); КонецЦикла;
Для того, чтобы получить значения реквизитов объекта вообще говоря надо обратиться с запросом к БД, типа:
Запрос = "ВЫБРАТЬ | ИмяРеквизита, |ИЗ | Объект.ТипОбъекта КАК ОбъектТипОбъекта |ГДЕ | ОбъектТипОбъекта.Ссылка = &СсылкаНаОбъект Запрос.УстановитьПараметр("СсылкаНаОбъект", СсылкаНаОбъект);
В запрос надо передать ссылку на объект и имя реквизита. Запрос вернет таблицу или выборку со значением реквизита.
Удобнее конечно для поиска значений реквизитов воспользоваться готовыми решениями, например фунцией ПолучитьЗначенияРеквизитов() общего модуля ОбщегоНазначения.
// Возвращает структуру, содержащую значения реквизитов прочитанные из информационной базы // по ссылке на объект. // // Если доступа к одному из реквизитов нет, возникнет исключение прав доступа. // Если необходимо зачитать реквизит независимо от прав текущего пользователя, // то следует использовать предварительный переход в привилегированный режим. // // Параметры: // Ссылка - ссылка на объект, - элемент справочника, документ, ... // ИменаРеквизитов - Строка или Структура - Если Строка, то имена реквизитов, // перечисленные через запятую, в формате требований к свойствам структуры. // Например, "Код, Наименование, Родитель". // Если Структура, то в качестве ключа передается псевдоним поля для // возвращаемой структуры с результатом, а в качестве значения (опционально) // - фактическое имя поля в таблице. // Если значение не определено, то имя поля берется из ключа. // // Возвращаемое значение: // Структура - содержит список свойств, как список имен в строке // ИменаРеквизитов, со значениям реквизитов, прочитанных // из информационной базы. // Функция ПолучитьЗначенияРеквизитов(Ссылка, ИменаРеквизитов) Экспорт Если ТипЗнч(ИменаРеквизитов) = Тип("Структура") Тогда СтруктураРеквизитов = ИменаРеквизитов; ИначеЕсли ТипЗнч(ИменаРеквизитов) = Тип("Строка") Тогда СтруктураРеквизитов = Новый Структура(ИменаРеквизитов);; Иначе ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Неверный тип второго параметра ИменаИлиСтруктураРеквизитов: %1'"), Строка(ТипЗнч(ИменаРеквизитов))); КонецЕсли; ТекстПолей = ""; Для каждого КлючИЗначение Из СтруктураРеквизитов Цикл ИмяПоля = ?(ЗначениеЗаполнено(КлючИЗначение.Значение), СокрЛП(КлючИЗначение.Значение), СокрЛП(КлючИЗначение.Ключ)); Псевдоним = СокрЛП(КлючИЗначение.Ключ); ТекстПолей = ТекстПолей + ?(ПустаяСтрока(ТекстПолей), "", ",") + " | " + ИмяПоля + " КАК " + Псевдоним; КонецЦикла; Запрос = Новый Запрос( "ВЫБРАТЬ |" + ТекстПолей + " |ИЗ | " + Ссылка.Метаданные().ПолноеИмя() + " КАК ПсевдонимЗаданнойТаблицы |ГДЕ | ПсевдонимЗаданнойТаблицы.Ссылка = &Ссылка |"); Запрос.УстановитьПараметр("Ссылка", Ссылка); Выборка = Запрос.Выполнить().Выбрать(); Выборка.Следующий(); Результат = Новый Структура; Для каждого КлючИЗначение Из СтруктураРеквизитов Цикл Результат.Вставить(КлючИЗначение.Ключ); КонецЦикла; ЗаполнитьЗначенияСвойств(Результат, Выборка); Возврат Результат; КонецФункции
Значение реквизитов в этой функции получено через запрос к БД. Возвращаемое значение – структура (ключ-значение). Пример использования:
ДокСсылка = СсылкаНаДокумент(ТипДокумента, НомерДок); СтруктураНастроек = Новый Структура; //инициируем структуру настроек именами реквизитов Для каждого Реквизит Из ДокОбъект.Метаданные().Реквизиты Цикл СтруктураНастроек.Вставить(Реквизит.Имя, Реквизит.Имя); КонецЦикла; ЗначенияРеквизитов = ПолучитьЗначенияРеквизитов(ДокСсылка , СтруктураНастроек); СканПростойСтруктуры(ЗначенияРеквизитов); //вывести структуру для просмотра
Поскольку в функцию ПолучитьЗначенияРеквизитов() во второй параметр надо передать структуру, то мы создали структуру и организовали Цикл ее инициализации данными из массива имен реквизитов объекта. Возвращает функция так же структуру (ключ-значение), с которой удобно работать. Для просмотра этой структуры можно воспользоваться циклом, либо вызвать функцию СканПростойСтруктуры(), которой передать структуру для просмотра.
Функция СканПростойСтруктуры(Структура) Для каждого Элемент из Структура Цикл Сообщить(Элемент.Ключ + ": " + Элемент.Значение); КонецЦикла; КонецФункции
Если исследуемый объект использует так же еще и общие реквизиты, и их необходимо найти, то можно воспользоваться функцией МассивИменРеквизитовОбъекта(), которая находит не только реквизиты объекта но и общие и даже стандартные реквизиты, которые использует объект:
// Возвращает массив имен всех реквизитов переданного объекта // Функция МассивИменРеквизитовОбъекта(Объект) Экспорт МассивИменРеквизитов = Новый Массив; Если ТипЗнч(Объект) = Тип("ОбъектМетаданных") Тогда МетаданныеОбъекта = Объект; Иначе МетаданныеОбъекта = Метаданные.НайтиПоТипу(ТипЗнч(Объект)); Если МетаданныеОбъекта = Неопределено Тогда Возврат МассивИменРеквизитов; КонецЕсли; КонецЕсли; Для индекс = 0 по 1 Цикл // КоллекцияРеквизитов = ?(индекс = 0, МетаданныеОбъекта.СтандартныеРеквизиты, МетаданныеОбъекта.Реквизиты); КоллекцияРеквизитов = МетаданныеОбъекта.Реквизиты; Для каждого Реквизит Из КоллекцияРеквизитов Цикл МассивИменРеквизитов.Добавить(Реквизит.Имя); КонецЦикла; КонецЦикла; Для каждого ОбщийРеквизит Из Метаданные.ОбщиеРеквизиты Цикл Если ИспользуетсяОбщийРеквизит(ОбщийРеквизит, МетаданныеОбъекта) Тогда МассивИменРеквизитов.Добавить(ОбщийРеквизит.Имя); КонецЕсли; КонецЦикла; Возврат МассивИменРеквизитов; КонецФункции
Тогда программа будет выглядеть так:
ДокСсылка = СсылкаНаДокумент(ТипДокумента, НомерДок); ДокОбъект = ДокСсылка.ПолучитьОбъект(); мМассивИмен = МассивИменРеквизитовОбъекта(ДокОбъект); СтруктураНастроек = Новый Структура; Для каждого эл Из мМассивИмен Цикл СтруктураНастроек.Вставить(эл, эл); КонецЦикла; ЗначенияРеквизитов = ОбщегоНазначения.ПолучитьЗначенияРеквизитов(ДокСсылка , СтруктураНастроек); СканПростойСтруктуры(ЗначенияРеквизитов);
Вспомогательная функция:
// Проверяет используется ли в Объекте указанный общий реквизит // Функция ИспользуетсяОбщийРеквизит(ОбщийРеквизит, Объект) Экспорт Если ТипЗнч(Объект) = Тип("ОбъектМетаданных") Тогда МетаданныеОбъекта = Объект; Иначе МетаданныеОбъекта = Метаданные.НайтиПоТипу(ТипЗнч(Объект)); Если МетаданныеОбъекта = Неопределено Тогда Возврат Ложь; КонецЕсли; КонецЕсли; Если ТипЗнч(ОбщийРеквизит) = Тип("ОбъектМетаданных") Тогда МетаданныеОбщегоРеквизита = ОбщийРеквизит; Иначе МетаданныеОбщегоРеквизита = Метаданные.ОбщиеРеквизиты.Найти(ОбщийРеквизит); Если МетаданныеОбщегоРеквизита = Неопределено Тогда Возврат Ложь; КонецЕсли; КонецЕсли; ЭлементСостава = МетаданныеОбщегоРеквизита.Состав.Найти(МетаданныеОбъекта); Если ЭлементСостава = Неопределено Тогда Возврат Ложь; КонецЕсли; пИспользованиеОбщегоРеквизита = Метаданные.СвойстваОбъектов.ИспользованиеОбщегоРеквизита; Если ЭлементСостава.Использование = пИспользованиеОбщегоРеквизита.Использовать Тогда Возврат Истина; ИначеЕсли ЭлементСостава.Использование = пИспользованиеОбщегоРеквизита.НеИспользовать Тогда Возврат Ложь; Иначе пАвтоИспользованиеОбщегоРеквизита = Метаданные.СвойстваОбъектов.АвтоИспользованиеОбщегоРеквизита; Если МетаданныеОбщегоРеквизита.АвтоИспользование = пАвтоИспользованиеОбщегоРеквизита.Использовать Тогда Возврат Истина; Иначе Возврат Ложь; КонецЕсли; КонецЕсли; КонецФункции
Как получить значение отдельного реквизита объекта?
Иногда необязательно получать значения всего массива реквизитов. Программист как правило знает имя реквизита, значение которого необходимо получить. К отдельному реквизиту объекта можно обратиться просто по его имени:
Поставщик = ДокОбъект.Метаданные().Реквизиты.Поставщик;
Получить значение этого реквизита можно так же через запрос, написанный специально для этого реквизита. Но можно воспользоваться все той же функцией ПолучитьЗначенияРеквизитов(). Цикл для настройки структуры в этом случае не нужен, так как нам надо найти значение всего одного элемента:
ДокСсылка = СсылкаНаДокумент(ТипДокумента, НомерДок); ДокОбъект = ДокСсылка.ПолучитьОбъект(); Организация = Строка(ДокОбъект.Метаданные().Реквизиты.Организация); СтруктураНастроек = Новый Структура; СтруктураНастроек.Вставить(Организация, Организация); ЗначенияРеквизитов = ОбщегоНазначения.ПолучитьЗначенияРеквизитов(ДокСсылка , СтруктураНастроек); СканПростойСтруктуры(ЗначенияРеквизитов);
Обратите внимание что здесь реквизит который необходимо найти преобразовывается к типу Строка, потому, что в структуру настроек надо передать именно строку.
Как найти имена реквизитов в таб части объекта?
Функция определяет есть ли реквизит в таб части документа:
// Позволяет определить есть ли среди реквизитов табличной части документа // реквизит с переданным именем. // // Параметры: // ИмяРеквизита - строковое имя искомого реквизита, // МетаданныеДокумента - объект описания метаданных документа, среди реквизитов которого производится поиск. // ИмяТабЧасти - строковое имя табличной части документа, среди реквизитов которого производится поиск // // Возвращаемое значение: // Истина - нашли реквизит с таким именем, Ложь - не нашли. // Функция ЕстьРеквизитТабЧастиДокумента(ИмяРеквизита, МетаданныеДокумента, ИмяТабЧасти) Экспорт ТабЧасть = МетаданныеДокумента.ТабличныеЧасти.Найти(ИмяТабЧасти); Если ТабЧасть = Неопределено Тогда // Нет такой таб. части в документе Возврат Ложь; Иначе Возврат НЕ (ТабЧасть.Реквизиты.Найти(ИмяРеквизита) = Неопределено); КонецЕсли; КонецФункции
Пример использования:
ИмяРеквизита = "Номенклатура"; МетаданныеДокумента = ДокОбъект.Метаданные(); ИмяТабЧасти = "Товары"; Если ЕстьРеквизитТабЧастиДокумента(ИмяРеквизита, МетаданныеДокумента, ИмяТабЧасти) Тогда Сообщить("Реквизит есть!"); Иначе Сообщить("Реквизита нет"); КонецЕсли;
Сообщить имя реквизитов таб части:
Для каждого Реквизит Из ДокОбъект.Метаданные().ТабличныеЧасти.Найти("Товары").Реквизиты Цикл Собщить(Реквизит.Имя); КонецЦикла;
Как найти значение всех реквизитов всех таб частей документа через запрос
Чтобы найти значения всех реквизитов всех табличных частей объекта через запрос воспользуемся функцией
ПолучитьЗначенияРеквизитовТабЧасти().
Функция ПолучитьЗначенияРеквизитовТабчасти(Ссылка, ИменаРеквизитов, ИмяТабЧасти) Экспорт ИмяТЧ = ИмяТабЧасти; ПолноеИмя = Ссылка.Метаданные().ПолноеИмя(); Если ТипЗнч(ИменаРеквизитов) = Тип("Структура") Тогда СтруктураРеквизитов = ИменаРеквизитов; ИначеЕсли ТипЗнч(ИменаРеквизитов) = Тип("Строка") Тогда СтруктураРеквизитов = Новый Структура(ИменаРеквизитов);; Иначе ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Неверный тип второго параметра ИменаИлиСтруктураРеквизитов: %1'"), Строка(ТипЗнч(ИменаРеквизитов))); КонецЕсли; ТекстПолей = ""; Для Каждого КлючИЗначение Из СтруктураРеквизитов Цикл ИмяПоля = ?(ЗначениеЗаполнено(КлючИЗначение.Значение), СокрЛП(КлючИЗначение.Значение), СокрЛП(КлючИЗначение.Ключ)); Псевдоним = СокрЛП(КлючИЗначение.Ключ); ТекстПолей = ТекстПолей + ?(ПустаяСтрока(ТекстПолей), "", ",") + " | " + ИмяПоля + " КАК " + Псевдоним; КонецЦикла; Запрос = Новый Запрос( "ВЫБРАТЬ |" + ТекстПолей + " |ИЗ | " + ПолноеИмя + "." + ИмяТЧ + " КАК ПсевдонимЗаданнойТаблицы |ГДЕ | ПсевдонимЗаданнойТаблицы.Ссылка = &Ссылка |"); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить().Выгрузить(); Возврат Результат; КонецФункции
Пример использования:
ДокСсылка = СсылкаНаДокумент(ТипДокумента, НомерДок); ДокОбъект = ДокСсылка.ПолучитьОбъект(); МассивТабЧастей = Новый Массив; Для каждого ТабЧасть Из ДокОбъект.Метаданные().ТабличныеЧасти Цикл МассивТабЧастей.Добавить(ТабЧасть.Имя); КонецЦикла; Для Каждого ТабЧасть Из МассивТабЧастей Цикл СтруктураНастроек = Новый Структура; Для каждого Реквизит Из ДокОбъект.Метаданные().ТабличныеЧасти.Найти(ТабЧасть).Реквизиты Цикл СтруктураНастроек.Вставить(Реквизит.Имя, Реквизит.Имя); КонецЦикла; Сообщить("Имя таб части: " + ТабЧасть); ТабЗнач = ПолучитьЗначенияРеквизитовТабЧасти(ДокСсылка , СтруктураНастроек, ТабЧасть); ПоказатьТаблицу(ТабЗнач); КонецЦикла;
Вспомогательная функция:
функция ПоказатьТаблицу(Табл) Сообщить("///Функция ПоказатьТаблицу///"); Количество = Табл.Колонки.Количество(); Для каждого Строка из Табл Цикл Для Индекс = 0 По Количество-1 Цикл Сообщить(СокрЛП(Индекс)+" "+СокрЛП(Табл.Колонки[Индекс].Имя)+ ": " + Строка[СокрЛП(Табл.Колонки[Индекс].Имя)]); КонецЦикла; КонецЦикла; Сообщить("///Конец Функция ПоказатьТаблицу///"); КонецФункции
Результат для документа “Реализация товаров услуг”:
Имя таб части: Товары
///Функция ПоказатьТаблицу///
0 ЕдиницаИзмерения: шт
1 ЕдиницаИзмеренияМест:
2 Качество: Новый
3 Количество: 1
4 КоличествоМест: 0
5 Коэффициент: 1
6 Номенклатура: Вентилятор настольный
7 ПроцентСкидкиНаценки: 0
8 СерияНоменклатуры: Н-908, С-890 от 01.01.2003
9 СпособСписанияОстаткаТоваров: Со склада
10 СтавкаНДС: Без НДС
11 Сумма: 445,5
12 СуммаНДС: 0
13 ХарактеристикаНоменклатуры:
14 Цена: 450
15 Склад: Магазин “Бытовая техника”
16 ПроцентАвтоматическихСкидок: 1
17 УсловиеАвтоматическойСкидки: По виду дисконтных карт
18 ЗначениеУсловияАвтоматическойСкидки: Серебряная карта
19 КлючСтроки: 3
20 КлючСвязи: 0
21 ЗаказПокупателя: Заказ покупателя ТД000000001 от 08.06.2008 12:00:00
0 ЕдиницаИзмерения: шт
1 ЕдиницаИзмеренияМест:
2 Качество: Новый
3 Количество: 1
4 КоличествоМест: 0
5 Коэффициент: 1
6 Номенклатура: Набор вентиляторов
7 ПроцентСкидкиНаценки: 0
8 СерияНоменклатуры:
9 СпособСписанияОстаткаТоваров: Со склада
10 СтавкаНДС: Без НДС
11 Сумма: 1948,32
12 СуммаНДС: 0
13 ХарактеристикаНоменклатуры:
14 Цена: 1968
15 Склад: Магазин “Бытовая техника”
16 ПроцентАвтоматическихСкидок: 1
17 УсловиеАвтоматическойСкидки: По виду дисконтных карт
18 ЗначениеУсловияАвтоматическойСкидки: Серебряная карта
19 КлючСтроки: 4
20 КлючСвязи: 0
21 ЗаказПокупателя: Заказ покупателя ТД000000001 от 08.06.2008 12:00:00
///Конец Функция ПоказатьТаблицу///
Имя таб части: ВозвратнаяТара
///Функция ПоказатьТаблицу///
///Конец Функция ПоказатьТаблицу///
Имя таб части: Услуги
///Функция ПоказатьТаблицу///
///Конец Функция ПоказатьТаблицу///
Имя таб части: СоставНабора
///Функция ПоказатьТаблицу///
0 Номенклатура: Вентилятор BINATONE ALPINE 160вт, напольный ,
1 ХарактеристикаНоменклатуры:
2 СерияНоменклатуры: 01234/11020/7654321, БОЛГАРИЯ
3 Количество: 1
4 ЕдиницаИзмерения: шт
5 Склад: Магазин “Бытовая техника”
6 Качество: Новый
7 СпособСписанияОстаткаТоваров: Со склада
8 КлючСтроки: 4
9 Цена: 1068
10 КлючСвязи: 0
0 Номенклатура: Вентилятор JIPONIC (Тайв.),
1 ХарактеристикаНоменклатуры:
2 СерияНоменклатуры: 11234/11020/7654321, ТАЙВАНЬ (КИТАЙ)
3 Количество: 1
4 ЕдиницаИзмерения: шт
5 Склад: Магазин “Бытовая техника”
6 Качество: Новый
7 СпособСписанияОстаткаТоваров: Со склада
8 КлючСтроки: 4
9 Цена: 900
10 КлючСвязи: 0
///Конец Функция ПоказатьТаблицу///
Имя таб части: СерийныеНомера
///Функция ПоказатьТаблицу///
///Конец Функция ПоказатьТаблицу///
Имя таб части: СерийныеНомераСоставНабора
///Функция ПоказатьТаблицу///
///Конец Функция ПоказатьТаблицу///
Имя таб части: ДокументыРасчетовСКонтрагентом
///Функция ПоказатьТаблицу///
///Конец Функция ПоказатьТаблицу///
В этой статье разберем метаданные 1С. Метаданные или объекты метаданных в 1С – это «кирпичики», из которых строится конфигурация 1С. Узнаем, что такое метаданные (объекты метаданных) и научимся получать значения свойств объектов метаданных.
В учебной конфигурации, справочник Номенклатура – это объект метаданных. Документ Закупка товаров – тоже объект метаданных.
Все объекты метаданных 1С перечислены в дереве конфигурации.
У объектов метаданных имеются прототипы. Визуально в дереве конфигурации прототипы представлены в виде веток дерева.
Например, у справочника Номенклатура прототип Справочники.
А у документа Закупка товаров – прототип Документы.
У объектов одного прототипа похожие свойств и методы. Кроме принадлежности к прототипу свойства и методы объектов метаданных определяются дополнительными характеристиками. Например, включена у справочников иерархия или нет.
В процессе конфигурирования разработчик настраивает свойства объектов метаданных. Например, длина кода справочника 1С это свойство. В учебной конфигурации у справочника Номенклатура длина кода 9.
А у справочника Валюта – 3.
На свойства объекта метаданных можно посмотреть, как в редакторе объекта. Редактор открывается при двойном клике мышкой по объекту. Так и в палитре свойств объекта. Для того, чтобы открыть палитру свойств, следует выделить объект, вызвать контекстное меню и выполнить команду «Свойства».
После, справа откроется палитра свойств объекта метаданных, в которой можно прочитать или отредактировать разные свойства объекта. Например, длину наименования.
К свойствам объектов метаданных можно обратиться при помощи программного кода. Сделать это можно воспользовавшись свойством глобального контекста, которое так и называется Метаданные.
Это свойство является коллекцией объектов метаданных и включает в себя все метаданные конфигурации 1С, которые даже не созданы.
У свойства Метаданные имеются свойства, которые отображают прототипы объектов. Это тоже коллекции. Например, для справочников имеется свое свойство.
Которое, также является коллекцией.
В этой коллекции содержатся все объекты метаданных, которые входят в ветку Справочники дерева конфигурации 1С.
Мы можем прочитать свойство того или иного объекта метаданных. Например, длину кода у справочника Валюта.
Поскольку свойство Метаданные и его свойства, которые соответствуют прототипам, являются коллекциями, то их можно обойти циклом.
Например, обойдем циклом справочники и выведем имя справочника, синоним и длину кода.
Для Каждого стрСправочника из Метаданные.Справочники Цикл Сообщить("Имя " + стрСправочника.Имя + ", синоним: " + стрСправочника.Синоним + " (длина кода: " + стрСправочника.ДлинаКода + ")"); КонецЦикла;
В учебной конфигурации, у этого кода будет следующий результат.
Обратите внимание, что этот код должен выполняться в серверном контексте (или в клиентском на толстом клиенте), поскольку у свойства Метаданные доступность Сервер, Толстый клиент и т.д.
Кроме свойств объекта можно получить доступ к свойствам реквизитов при помощи всё того же свойства глобального контекста Метаданные. Для того, чтобы обратиться к реквизитам объекта, необходимо получить доступ к этому объекту посредством свойства глобального контекста Метаданные, а потом уже обратиться к свойству Реквизиты полученного объекта.
Например, к реквизитам конкурентного справочника можно обратиться так:
РеквизитыСправочника = Метаданные.Справочники.Контрагенты.Реквизиты;
А к реквизитам конкурентного документа – так:
РеквизитыДокумента = Метаданные.Документы.ЗакупкаТоваров.Реквизиты;
Получаемые реквизиты являются коллекцией, которая содержит все реквизиты объекта. Её также можно обойти циклом и прочитать тот или иной реквизит.
РеквизитыДокумента = Метаданные.Документы.ЗакупкаТоваров.Реквизиты; Сообщить("Выводим реквизиты документа " + Метаданные.Документы.ЗакупкаТоваров.Синоним); Для Каждого стрРеквизит из РеквизитыДокумента Цикл Сообщить(" Имя: " + стрРеквизит.Имя + ", синоним " + стрРеквизит.Синоним); КонецЦикла;
Результат работы этого кода в учебной конфигурации будет следующим.
Некоторые свойства объектов имеют перечисленный тип, т.е. перечисление определенных значений. Например, у документов имеется свойство Проведение. У этого свойства есть несколько значений: Разрешить и Запретить. Свойство Проведение и является перечисленным типом.
При помощи свойства глобального контекста Метаданные мы можем проверить какое значение перечисленного типа установлено у того или иного объекта. Для этого нужно воспользоваться свойством СвойстваОбъектов. Оно содержит в себе все перечисленные типы и их значения.
Мы можем сравнить значение перечисленного типа в реквизите объекта метаданных со значением из коллекции соответствующего типа в свойстве СвойстваОбъектов. Например, выведем все документы и сообщим можно эти документы проводить или нельзя.
Для Каждого стрДокумент Из Метаданные.Документы Цикл Сообщить("Выводим " + стрДокумент.Представление() + "(" + стрДокумент.ПолноеИмя() + ")"); Если СтрДокумент.Проведение = Метаданные.СвойстваОбъектов.Проведение.Разрешить Тогда Сообщить(Символы.Таб + "Документ можно проводить"); ИначеЕсли СтрДокумент.Проведение = Метаданные.СвойстваОбъектов.Проведение.Запретить Тогда Сообщить(Символы.Таб + "Документ нельзя проводить"); КонецЕсли; КонецЦикла;
Как вы видите, при помощи свойства глобального контекста Метаданные можно получать очень подробную информацию об объектах конфигурации, эта информация может вам пригодиться при написании различных алгоритмов.
Читайте также по теме:
Объект в 1С
Ссылка в 1С
Более подробно и основательно начальные вопросы программирования в 1С есть вы можете изучить в
Книга «Программировать в 1С за 11 шагов»
Изучайте программирование в 1С в месте с моей книгой «Программировать в 1С за 11 шагов»
Книга написана понятным и простым языком — для новичка.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника
О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Промо-код на скидку в 15% — 48PVXHeYu
Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog
Если Вам понравился этот урок, был полезен или помог решить какую-нибудь проблему, то Вы можете поддержать мой проект, перечислив любую сумму.
можно оплатить вручную:
Яндекс.Деньги — 410012882996301
Web Money — R955262494655
Вступайте в мои группы:
Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009
- Раздел
- Общие объекты
- Подразделы
- Работа с объектами метаданных
- ИмяОбъекта
- Типы свойств объектов метаданных
- ПодвидОбъекта
- КоллекцияОбъектовМетаданных
- ТипСтатьи
- Методы
КоллекцияОбъектовМетаданных.Найти (MetadataObjectCollection.Find)
КоллекцияОбъектовМетаданных (MetadataObjectCollection)
Найти (Find)
Синтаксис:
Найти(<Наименование>)
Параметры:
<Наименование> (обязательный)
Тип: Строка.
Наименование объекта описания метаданного.
Возвращаемое значение:
Тип: ОбъектМетаданных: Куб, ОбъектМетаданных: ТаблицаИзмерения, ОбъектМетаданных: ВнешнийИсточникДанных, ОбъектМетаданных: Поле, ОбъектМетаданных: Таблица, ОбъектМетаданных: HTTPСервис, ОбъектМетаданных: Функция, ОбъектМетаданных: ШаблонURLHTTPСервиса, ОбъектМетаданных: ОпределяемыйТип, ОбъектМетаданных: ПланВидовРасчета, ОбъектМетаданных: ПланСчетов, ОбъектМетаданных: БизнесПроцесс, ОбъектМетаданных: Документ, ОбъектМетаданных: ЖурналДокументов, ОбъектМетаданных: Задача, ОбъектМетаданных: ПланВидовХарактеристик, ОбъектМетаданных: ПланОбмена, ОбъектМетаданных: РегистрБухгалтерии, ОбъектМетаданных: РегистрНакопления, ОбъектМетаданных: РегистрРасчета, ОбъектМетаданных: РегистрСведений, ОбъектМетаданных: Справочник, ОбъектМетаданных: ФункциональнаяОпция, ОбъектМетаданных: ПараметрФункциональныхОпций, ОбъектМетаданных: Команда, ОбъектМетаданных: ГруппаКоманд, ОбъектМетаданных: ХранилищеНастроек, ОбъектМетаданных: ОбщаяКоманда, ОбъектМетаданных: WebСервис, ОбъектМетаданных: WSСсылка, ОбъектМетаданных: Интерфейс, ОбъектМетаданных: Константа, ОбъектМетаданных: КритерийОтбора, ОбъектМетаданных: Нумератор, ОбъектМетаданных: Обработка, ОбъектМетаданных: ОбщаяКартинка, ОбъектМетаданных: Макет, ОбъектМетаданных: ОбщийМодуль, ОбъектМетаданных: Форма , ОбъектМетаданных: Стиль, ОбъектМетаданных: Язык, ОбъектМетаданных: Отчет, ОбъектМетаданных: ПакетXDTO, ОбъектМетаданных: ПараметрСеанса, ОбъектМетаданных: Перечисление, ОбъектМетаданных: ПодпискаНаСобытие, ОбъектМетаданных: Подсистема, ОбъектМетаданных: Последовательность, ОбъектМетаданных: РегламентноеЗадание, ОбъектМетаданных: Роль, ОбъектМетаданных: ЭлементСтиля, ОбъектМетаданных: Графа, ОбъектМетаданных: Измерение, ОбъектМетаданных: ЗначениеПеречисления, ОбъектМетаданных: ОперацияWebСервиса, ОбъектМетаданных: Перерасчет, ОбъектМетаданных: ПараметрWebСервиса, ОбъектМетаданных: ПризнакУчетаПланаСчетов, ОбъектМетаданных: ПризнакУчетаСубконтоПланаСчетов, ОбъектМетаданных: Реквизит, ОбъектМетаданных: ТабличнаяЧасть, ОбъектМетаданных: Ресурс, ОбъектМетаданных: РеквизитАдресации, ОбъектМетаданных: ОбщийРеквизит; Неопределено.
Если объект не найден, то возвращается значение Неопределено.
Описание:
Осуществляет поиск в коллекции объекта описания метаданного по его имени.
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
Пример:
МетаданныеРегистра = Метаданные.РегистрыНакопления.Найти(ИмяРегистра);
- Главная
- О сайте
- Главная
- Содержание
Категории
–>
рубрики: Метаданные | Дата: 6 февраля, 2017
Что такое метаданные
Метаданные представляют собой структуру базы данных 1С:Предприятия. То есть это структура в которой описываются справочники, документы, регистры, перечисления и т.д., а также подчиненные им элементы: табличные части, реквизиты, измерения ресурсы и прочее. Визуально мы можем наблюдать эту структуру в конфигураторе, когда открываем дерево конфигурации.
Редактирование метаданных возможно только в режиме конфигуратора, но в языке 1С существуют методы и функции, которые осуществляют программный доступ к метаданным в режиме чтения.
Зачем нужна работа с метаданными
Бывают ситуации когда надо обработать по одному правилу все схожие между собой объекты. Допустим нам надо написать обработку, которая будет производить некие действия со всеми справочниками у которых есть реквизит Товар. Без использования метаданных надо будет проанализировать вручную всю ветку со справочниками в дереве конфигурации и для каждого справочника написать отдельный код. А с использованием метаданных мы можем программно обойти все справочники, а затем для каждого справочника можем проанализировать все его реквизиты. И в случае если искомый реквизит найден обработать все элементы справочника. Этот подход значительно уменьшит количество кода и предварительной ручной работы. Опять же если в конфигурацию будет добавлен новый справочник, в первом случае (без использования метаданных) необходимо будет дорабатывать обработку. Если же были использованы метаданные, никакой доработки не потребуется.
Также метаданные можно использовать в случае работы с реквизитами составного типа. Когда в зависимости от метаданных реквизита может различаться алгоритм работы программы.
Примеры
Обход метаданных в цикле
В качестве первого примера рассмотрим обход в цикле всех справочников и для каждого справочника также в цикле обход всех его реквизитов. Доступ к метаданным осуществляется с использованием свойства глобального контекста Метаданные. Вот код который выполняет данную задачу
Для каждого МетаданныеСправочника Из Метаданные.Справочники Цикл
Сообщить(МетаданныеСправочника.Имя);
Сообщить(МетаданныеСправочника.Синоним);
Для каждого РеквизитСправочника Из МетаданныеСправочника.Реквизиты Цикл
Сообщить(РеквизитСправочника.Имя);
Сообщить(РеквизитСправочника.Синоним);
КонецЦикла;
КонецЦикла;
Получение метаданных по ссылке объекта
Зачастую возникает ситуация когда надо получить метаданные по ссылке какого-нибудь объекта. Это может быть элемент справочника, документ и т.д. И здесь нам поможет метод НайтиПоТипу(<Тип>). Этот метод позволяет получить метаданные по типу объекта. Соответственно если у нас есть ссылка нам надо сначала узнать ее тип. Сделать это поможет функция ТипЗнч(<Значение>). В качестве примера возьмем справочник Пользователи (т.к. он есть наверное во всех конфигурациях). Выберем из него первый попавшийся элемент и получим по нему метаданные.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Пользователи.Ссылка
|ИЗ
| Справочник.Пользователи КАК Пользователи";
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
МетаданныеОбъекта = Метаданные.НайтиПоТипу(ТипЗнч(Выборка.Ссылка));
Сообщить(МетаданныеОбъекта.Имя);
Сообщить(МетаданныеОбъекта.Синоним);
КонецЦикла;
Получение метаданных по полному имени
Cуществует еще один метод, который позволяет получить метаданные по полному имени объекта. Речь идет о методе НайтиПоПолномуИмени(<ПолноеИмя>). Если взять тот же справочник Пользователи, то его полное имя выглядить как Справочник.Пользователи. Соответственно код для получения метаданных справочника Пользователи по полному имени выглядит вот так
МетаданныеПользователи = Метаданные.НайтиПоПолномуИмени("Справочник.Пользователи");
Если выбирать между получением метаданных по ссылке и по полному имени, то мне больше по душе метод НайтиПоТипу(<Тип>).
Конечно Имя и Синоним, в примерах выше — это лишь малая часть информации, которую можно извлечь из метаданных. Но тут как говориться Shift + F9 в помощь.