Объект метаданных

Надоже до чего техника дошла… V8Update.htm: «Реализована возможность описания хранения характеристик для объектов метаданных в конфигурации. Данная возможность используется системой компоновки данных в отчетах и динамических списках. После задания описания, система компоновки данных автоматически определяет дополнительные характеристики объекта метаданных и представляет виды характеристик объекта в списке доступных полей объекта без необходимости использования в каждом отчете конструкции языка запросов «ХАРАКТЕРИСТИКИ».
Если в запросе схемы компоновки данных указано описание характеристик для некоторого типа, то для полей запроса с таким типом используются эти характеристики, а характеристики, описанные в метаданных не используются. Если для некоторого типа характеристики в запросе не указаны, то для этого типа используются характеристики, описанные в метаданных.
При редактировании характеристик реализована автоматическая фильтрация при выборе вида характеристики по типу объекта, для которого редактируется характеристика.»

При добавлении новых объектов в типовые конфигурации возможна ошибка при обращении к этому объекту в режиме 1C:Предприятие: «Объект не найден в Справочнике «ИдентификаторыОбъектовМетаданных».

{Справочник.ИдентификаторыОбъектовМетаданных.МодульМенеджера(738)}: Ошибка при выполнении функции ОбщегоНазначения.ИдентификаторОбъектаМетаданных().

Для объекта метаданных «Отчет.РИК_РасчетыСПартнерами» не найден идентификатор в справочнике «Идентификаторы объектов метаданных».

Для разработчика: возможно требуется обновить вспомогательные данные, которые влияют на работу программы. Для выполнения обновления можно:

— воспользоваться внешней обработкой «Инструменты разработчика: Обновление вспомогательных данных»,

— либо запустить программу с параметром командной строки 1С:Предприятия 8 «/С ЗапуститьОбновлениеИнформационнойБазы»,

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

Варианты решения:

1. В некоторых конфигурациях режиме предприятия

Все функции — Обработки — «Инструменты разработчика: Обновление вспомогательных данных», Если обработки нет, то пункт 2

Все функции — Справочники — «Идентификаторы объектов метаданных», нажать кнопку «Обновить данные справочника», Если кнопки обновить нет, то пункт 2

2. Из Конфигуратора запустить с параметром «/С ЗапуститьОбновлениеИнформационнойБазы», т.к. обработки может не оказаться под руками, а изменение версии производится с обновлением конфигурации и базы, что может оказаться не удобным:

Сервис/Параметры — Вкладка Запуск1С:Предприятия — В свойстве «Параметр запуска» добавляем «/С ЗапуститьОбновлениеИнформационнойБазы»

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

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

4. Выполнить:

Код 1C v 8.2 УП &НаСервере
Процедура ОбновитьНоваяНаСервере()
Справочники.ИдентификаторыОбъектовМетаданных.ВыполнитьОбновлениеДанных(Истина, ЛОЖЬ,Ложь);
КонецПроцедуры

Ошибка дублирования появляется в момент обновления конфигурации базы данных после обновления:

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

Как это выглядит после обновления:

Как исправить?

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

Объектом метаданных может быть не только документ, справочник, но и их реквизиты (дублирование реквизитов) — исправление аналогично

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

При обновлении типовой конфигурации могут быть две основные проблемы:

  • Конфигурация находится на поддержке: поднимите архив перед обновлением (вы же его конечно сделали) и повторите обновление еще раз. Если повторится, смотрите ниже.
  • Если конфигурации частично снята, вы можете ее окончательно снять, удалить лишний объект (сначала выясните какой — см. ниже), и затем можете заменить конфигурацию на конфигурации поставщика c последующей постановкой на поддержку (если у вас нет своих существенных изменений).

Возможно ситуация, когда при следующем обновлении ситуация повторяется, по причине совпадения внутренних идентификаторов объектов , тогда потребуется перенос данных на вновь созданные объекты/реквизиты посредством конвертации данных или других способов и повторить удаление объекта

Как выяснить какой объект удалять?

  • Сначала переименовываете и обновляете конфигурацию.
  • Заходите в режим предприятия и смотрите какие объекты в наличии или заполнены (если это реквизит).
  • Если объект новый, то можно удалить любой.

Сообщение от wladimir_ui Для хранения списка объектов метаданных Т.е. конфигуратора для этого НАМ мало???
Добавлено через 33 секунды

Не по теме:

Давайте в Регистре Сведений хранить тексты функций?!

Добавлено через 25 минут
Нашел на ИТСе
Использование идентификаторов объектов метаданных
При необходимости хранить в базе данных ссылку на объект метаданных (например, ссылка на объект метаданных Справочник.Организации) рекомендуется вместо строкового реквизита с полным именем объекта метаданных использовать ссылку на соответствующий элемент справочника ИдентификаторыОбъектовМетаданных. Такая потребность возникает, например, в различных подсистемах БСП: для хранения настроек версионирования данных, списка выбранных ролей в профилях групп доступа и т.п.
Такой подход позволяет
● повысить производительность запросов, которые обращаются к реквизитам данного типа;
● снизить размер таблиц в базе данных, в которых используются реквизиты данного типа,
● выводить в пользовательском интерфейсе представление ссылки вместо строкового имени объекта метаданных,
● а также избавиться от разработки обработчиков обновления и первоначального заполнения ИБ для актуализации строковых реквизитов с полными именами объектов метаданных при изменениях метаданных конфигурации.
Программно, ссылку на объект метаданных можно получить с помощью функции ИдентификаторОбъектаМетаданных общего модуля ОбщегоНазначения.
Справочник ИдентификаторыОбъектовМетаданных заполняется автоматически при первом запуске (и каждом обновлении) конфигурации, согласно метаданным конфигурации, а также автоматически актуализируется при каждом обновлении версии конфигурации (учитываются переименованные, добавленные и удаленные объекты метаданных). Полный список объектов метаданных (справочники, документы, регистры, и т.п.), обновление идентификаторов которых выполняется автоматически, см. в комментарии к функции ИдентификаторОбъектаМетадан*ных общего модуля ОбщегоНазначения.
Исключение составляют подсистемы и роли, обновление идентификаторов которых требуется выполнять вручную. Необходимость обновления идентификаторов подсистем и ролей возникает при их переименовании (а для подсистем – также и в случае их перемещения из одной родительской подсистемы в другую). В противном случае, возможно рассогласование идентификаторов объектов метаданных с объектами метаданных конфигурации.
Для обновления идентификаторов необходимо воспользоваться процедурой ЗаполнитьТаблицуПереименованияОбъектовМетаданных общего модуля ОбщегоНазначенияПереопределяемый и увеличить номер версии конфигурации. Например, следующий фрагмент кода описывает, что в версии конфигурации 2.0.1.2 подсистема _ДемоПоставляемыеДанные была перенесена из подсистемы _ДемоРаботаВМоделиСервиса в _ДемоНастройкаИАдминистрирование:

Обновление идентификаторов выполняется последовательно по версиям конфигурации, а в пределах одной версии – в порядке следования строк со сведениями о переименованиях. Обновление идентификаторов для переименованных подсистем выполняется также и для всех их дочерних подсистем (если они есть).
Отдельным случаем, когда обновление идентификаторов происходит автоматически, является переименование объектов метаданных с целью изменения структуры данных с помощью создания новой копии объекта метаданных. Такая необходимость возникает, когда реструктуризация объекта метаданных невозможна. Например, при сокращении длины кода справочника Подразделения с 50 до 11, может потребоваться создать новый справочник, а старый переименовать в УдалитьПодразделения. В этом случае идентификатор справочника будет автоматически назначен новому справочнику с тем же именем.
Однако если при этом новый справочник будет назван иначе, например, СтруктурныеЕдиницы, то потребуется отразить переименование справочника Подразделения в справочник СтруктурныеЕдиницы, как это описано выше.
При активной разработке конфигурации данные справочника ИдентификаторыОбъектовМетаданных можно также обновлять вручную, без увеличения номера версии конфигурации, с помощью команды Обновить данные справочника в форме списка (открыв ее, например, из меню Все функции). Однако, это допустимо только в случае, когда не производилось переименование ролей и/или подсистем. В случае переименования ролей и/или подсистем, перед выполнением команды Обновить данные справочника нужно выполнить переименование полных имен соответствующих элементов справочника. Для этого нужно открыть форму элемента справочника ИдентификаторыОбъектовМетаданных, выполнить команду Включить возможность редактирования в меню Все действия и задать новое полное имя. В противном случае, этот элемент справочника будет помечен на удаление и создан новый, что приведет к рассогласованию идентификаторов объектов метаданных с объектами метаданных конфигурации.
Добавлено через 1 минуту
Сообщение от Dethmontt повысить производительность запросов, которые обращаются к реквизитам данного типа; Вот этого не понял вообще!!!
Добавлено через 2 минуты
Если я правильно понял, то 1С-ники пытаются упростить написание процедур обновления ТИПОВЫХ конфигураций и создают геморой для всех остальных…
Добавлено через 24 секунды

Не по теме:

Неплохой монолог у меня получается =)))

Добавлено через 2 часа 7 минут
Кто юзает типовые конфы на БСП — дайте хоть один пример запроса с использованием этого справочника?!

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

Ключевые слова: копирование, запись, реквизит документ, справочник, метаданные
Данная статья написана с использованием описания метаданных, автор — Pit http://www.mista.ru/download1c/metadata_als.zip

Для копирования документа в 1С есть клавиша F9. Но зачастую нужно скопировать документ программно. И основная трудность при этом определить все реквизиты для копирования. В этом нам помогут метаданные.
Итак, приведем пример получения идентификаторов документа на примере документа «РеализацияРозница». Они делятся на три части: общие реквизиты, реквизиты шапки и реквизиты табличной части.
//Получаем идентификаторы общих реквизитов Для nn = 1 По Метаданные.ОбщийРеквизитДокумента() Цикл Сообщить(Метаданные. ОбщийРеквизитДокумента(nn).Идентификатор); КонецЦикла; //Получаем идентификаторы реквизитов шапки Для nn = 1 По Метаданные.Документ(«РеализацияРозница»).РеквизитШапки() Цикл Сообщить(Метаданные.Документ(«РеализацияРозница»).РеквизитШапки(nn).Идентификатор); КонецЦикла; //Получаем идентификаторы реквизитов табличной части Для nn = 1 По Метаданные.Документ(«РеализацияРозница»).РеквизитТабличнойЧасти() Цикл Сообщить(Метаданные.Документ(«РеализацияРозница»).РеквизитТабличнойЧасти(nn).Идентификатор); КонецЦикла;
P.S. Замечу, что эти методы позволяют получить текстовые идентификаторы реквизитов
Итак, универсальная процедура копирования документа выглядит так:
Процедура CopyDoc(Док) //создаем документ такого же вида Ндок = СоздатьОбъект(«Документ.»+Док.Вид()); //Создаем новый документ Ндок.Новый(); //устанавливаем дату документа Ндок.ДатаДок = ТекущаяДата(); //Присваиваем новому документу новый номер //здесь стоит посмотреть особенности своей конфигурации относительно правил задания префикса Ндок.УстановитьНовыйНомер( СокрЛП( Константа.ПрефиксИБ)); //копируем общие реквизиты Для nn = 1 По Метаданные.ОбщийРеквизитДокумента() Цикл Рекв = Метаданные. ОбщийРеквизитДокумента(nn).Идентификатор; Ндок.УстановитьАтрибут(Рекв,Док.ПолучитьАтрибут(Рекв)); КонецЦикла; //копируем реквизиты шапки Для nn = 1 По Метаданные.Документ(Док.Вид()).РеквизитШапки() Цикл Рекв = Метаданные.Документ(Док.Вид()).РеквизитШапки(nn).Идентификатор; Ндок.УстановитьАтрибут(Рекв,Док.ПолучитьАтрибут(Рекв)); КонецЦикла; //перебираем строки данного документа, создавая строки в новом Док.ВыбратьСтроки(); Пока Док.ПолучитьСтроку() = 1 Цикл Ндок.НоваяСтрока(); //копируем реквизиты табличной части Для nn = 1 По Метаданные.Документ(Док.Вид()).РеквизитТабличнойЧасти() Цикл Рекв = Метаданные.Документ(Док.Вид()).РеквизитТабличнойЧасти(nn).Идентификатор; Ндок.УстановитьАтрибут(Рекв,Док.ПолучитьАтрибут(Рекв)); КонецЦикла; КонецЦикла; //записываем новый документ Ндок.Записать(); //открываем новый документ ОткрытьФорму(Ндок.ТекущийДокумент()); КонецПроцедуры
Отшлифуем эту процедуру. Во-первых: автор тоже копируется в новый документ, а нам это не нужно. Во-вторых документ записывается, а это нам тоже не обязательно.
Процедура CopyDoc(Док) Ндок = «»; //открываем форму нового документа такого же вида ОткрытьФорму(«Документ.»+Док.Вид(),Ндок); //копируем общие реквизиты Для nn = 1 По Метаданные.ОбщийРеквизитДокумента() Цикл Рекв = Метаданные. ОбщийРеквизитДокумента(nn).Идентификатор; Если Рекв = «Автор» Тогда Продолжить; КонецЕсли; Ндок.УстановитьАтрибут(Рекв,Док.ПолучитьАтрибут(Рекв)); КонецЦикла; //копируем реквизиты шапки Для nn = 1 По Метаданные.Документ(Док.Вид()).РеквизитШапки() Цикл Рекв = Метаданные.Документ(Док.Вид()).РеквизитШапки(nn).Идентификатор; Ндок.УстановитьАтрибут(Рекв,Док.ПолучитьАтрибут(Рекв)); КонецЦикла; //перебираем строки данного документа, создавая строки в новом Док.ВыбратьСтроки(); Пока Док.ПолучитьСтроку() = 1 Цикл Ндок.НоваяСтрока(); //копируем реквизиты табличной части Для nn = 1 По Метаданные.Документ(Док.Вид()).РеквизитТабличнойЧасти() Цикл Рекв = Метаданные.Документ(Док.Вид()).РеквизитТабличнойЧасти(nn).Идентификатор; Ндок.УстановитьАтрибут(Рекв,Док.ПолучитьАтрибут(Рекв)); КонецЦикла; КонецЦикла; КонецПроцедуры

Отличие этой процедуры от предыдущей состоит в том, что она открывает новый документ и заполняет реквизиты, не записывая его. А также не устанавливает автора, предоставляя эту возможность самому документу.
Теперь перейдем к справочникам.
С ними все сложнее.
Получаем список идентификаторов реквизитов справочника:
Для nn = 1 По Метаданные.Справочник(«Номенклатура»).Реквизит() Цикл Сообщить(Метаданные.Справочник(«Номенклатура»).Реквизит(nn).Идентификатор); КонецЦикла;
Но это еще не все. Кроме этих реквизитов есть еще такие, как Код, Наименование, Родитель и Владелец.
Сообщить(«Код”); Сообщить(«Наименование”); Сообщить(«Родитель”); Сообщить(«Владелец”); Для nn = 1 По Метаданные.Справочник(«Номенклатура»).Реквизит() Цикл Сообщить(Метаданные.Справочник(«Номенклатура»).Реквизит(nn).Идентификатор); КонецЦикла;
Естественно, что код копировать не нужно. Кроме того, реквизиты могут быть периодическими, могут использоваться только группами, только элементами или и теми и другими. Могут изменяться вручную или документами…
Универсальная процедура для копирования элемента справочника выглядит так:
//Копируем элемент справочника, если указан Род — используем его как родителя, // если указан Влад — как владельца // Процедура CopyEl(Элем,Род=0,Влад=0) //создаем справочник того же вида Нэл = СоздатьОбъект(«Справочник.»+Элем.Вид()); //используем родителя указанного, либо как у копируемого элемента, либо не используем Если ПустоеЗначение(Род) = 0 Тогда Нэл.ИспользоватьРодителя(Род); ИначеЕсли ПустоеЗначение(Элем.Родитель) = 0 Тогда Нэл.ИспользоватьРодителя(Элем.Родитель); КонецЕсли; //используем владельца указанного, либо как у копируемого элемента, либо не используем Если ПустоеЗначение(Влад) = 0 Тогда Нэл.ИспользоватьРодителя(Влад); ИначеЕсли ПустоеЗначение(Элем.Владелец) = 0 Тогда Нэл.ИспользоватьРодителя(Элем.Владелець); КонецЕсли; //создаем группу или просто элемент, в зависимости от копируемого Если Элем.ЭтоГруппа() = 1 Тогда Нэл.НоваяГруппа(); Иначе Нэл.Новый(); КонецЕсли; //устанавливаем новый код Нэл.УстановитьНовыйКод(СокрЛП( Константа.ПрефиксИБ)); //копируем наименование Нэл.Наименование = Элем.Наименование; //перебираем реквизиты Для nn = 1 По Метаданные.Справочник(Элем.Вид()).Реквизит() Цикл Рекв = Метаданные.Справочник(Элем.Вид()).Реквизит(nn).Идентификатор; //проверяем его применяемость, для групп или для элементов, неподходящий пропускаем Если (Метаданные.Справочник(Элем.Вид()).Реквизит(nn).Использование = «ДляГрупп») и (Элем.ЭтоГруппа() = 0) Тогда Продолжить; ИначеЕсли (Метаданные.Справочник(Элем.Вид()).Реквизит(nn).Использование = «ДляЭлементов») и (Элем.ЭтоГруппа() = 1) Тогда Продолжить; //пропускаем периодические реквизиты ИначеЕсли Метаданные.Справочник(Элем.Вид()).Реквизит(nn).Периодический = 1 Тогда Продолжить; //пропускаем ссылки на подчиненные справочники ИначеЕсли Метаданные.Справочник(Элем.Вид()).Реквизит(nn).Тип = «Справочник» Тогда Если Строка(Метаданные.Справочник(Метаданные.Справочник(Элем.Вид()).Реквизит(nn).Вид).Владелец) = Элем.Вид() Тогда Продолжить; КонецЕсли; КонецЕсли; //копируем значение реквизита Нэл.УстановитьАтрибут(Рекв,Элем.ПолучитьАтрибут(Рекв)); КонецЦикла; //записываем новый элемент Нэл.Записать(); КонецПроцедуры
В процедуре есть несколько изъянов: не копируются периодические реквизиты и не создаются подчиненные справочники. Но я думаю, это можно сделать и самостоятельно.

Add a Comment

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