1с удалить идентификаторы объектов метаданных
Потребность в групповом редактировании довольно часто обсуждалось и обсуждается в среде специалистов, плотно работающих с большими конфигурациями. Некоторые концептуальные изменения вносимые в конфигурации требуют наличия определенных реквизитов в объектах метаданных. Обойти это можно конечно с помощью плана видов характеристик, ну у здесь полно подводных камней. Представленное здесь решение позволяет работать с любым составом объектов метаданных ( добавлять,изменять,удалять и копировать). Решение тестировалось на платформе 8.1.7. в клиент серверной версии. Реализация представленной здесь концепции возможно и на платформе 8.0, однако в виду того что в 8.1 были пересмотрены некоторые принципы хранения описания метаданных, было выбрана реализация именно на 8.1.
Итак начнем
Вначале краткий ликбез по тому как храняться описания метаданных. Все описания метаданных базы данных хранятся в таблице Config, изменения внесенные в конфигурацию конфигуратором (изменения можно вносить также с помощью Enterprise Integrator) сохраняются в таблице ConfigSave. После обновления конфигурации записи из таблицы ConfigSave заменяют записи из таблицы Config.
Структура обоих этих таблиц одинакова. В качестве ключа представлено поле FileName в этом поле храниться уникальный идентификатор объекта метаданных ( в данном случае это это может быть как какой-то прикладной объект, так и некоторые свойства этого объекта, такие как Макеты и Формы).
Нас в данном случае будут интересовать записи таблицы Config, в которых описаны реквизиты, табличные части и прочие свойства метаданных. В форме объектов конфигурации данные записи будут иметь имя «Метаданные» и будут подчинены непосредственно объекту конфигурации (описание метаданные существуют также для форм но кроме названия и версий форм они содержат мало интересного).
В версии 8.0 все записи с именем «Метаданные»(описание метаданных), всех!! объектов метаданных были объединены в одну (metadata)-эта запись была самой большой в конфигурации, что и затрудняло ее редактирование.
Цели
Для изменения метаданных объекта конфигурации достаточно:
отредактировать запись описания метаданных;
изменить версию объекта конфигурации и всей конфигурации(используется запись Versions);
Посмотрим, что же содержит в себе запись описания метаданных.
Структура запись похожа на Xml файл где вместо разделителей <> разделители <> Элементы, содержавшие набор однотипных объектов содержат флаговый идентификатор(45е46cbc-3…… или любой другой), после которого перечислено количество объектов в элементе (22).
На рисунке изображен один из 22, элемент набора записей, который характеризует реквизиты объектов метаданных. Этот блок текста представляет собой внутренне значение реквизита метаданных. (Жаль что объекты метаданных не сериализуются, в противном случае вероятно данный блок текста можно было бы, получить используя следующую конструкцию ЗначениеВСтрокуВнутр(Метаданные.Документы.АВСКлассификация.Реквизиты.Комментарий)) . Изменяя состав элементов содержащихся в блоке, мы меняем состав реквизитов метаданных или их свойства в том случае если меняем значения элементов блока.
Общий подход
Поле того, как мы определились с целями, поговорим о текущей реализации.
Не так сложно получить (прочитать внутреннее значение элементов метаданных) как их отредактировать с учетом требований.Enterprise Integrator предлагает следующее универсальное решение.
Внутреннее представление можно представить в виде структуры значений, содержащие списки значений. В списки значений помещаются однотипные объекты элементов, во главе которых стоит флаговый идентификатор, по этому флаговому идентификатору и определяются, какое свойство объектов метаданных перечислено в списке (таблица соответствий, Флаговый идентификатор-Свойство находится Настройка - Объекты конфигурации - Обозреватель объектов). Список значений, свойств объектов метаданных, формируется таким образом, чтобы при его обратном представлении в строковое представление, было получено такое же строковое значение элемента, как и до преобразования.
В рамках этой стратегии для изменения реквизитов объектов метаданных нужно выполнить следующий алгоритм.
Разобрать объект метаданных и сформировать структуру, скопировать один из элементов структуры и изменить его, после чего исходное значение элемента структуры и измененное преобразовывается в строковые представления. Полученные строковые представления заменятся одно на другое в представлении объекта метаданных.
Структура свойства
Что делать с набором свойств более, менее понятно. На этом можно было бы, остановится, если бы нам требовалось только удалять элементы наборов свойств объектов метаданных. Однако это, скорее всего, делать в групповой обработке и не придется…. Большую необходимость имеют такие групповые действия с объектами метаданных как добавление или изменение, и для того, что бы осуществлять эти операции необходимо разобрать внутреннюю структуру элемента набора свойств объекта метаданных.
На рисунке представлен реквизит документа. Почти все свойства метаданных (реквизиты) разных типов прикладных объектов различны и следовательно внутренне представление этих свойств за исключением некоторых полей (UNID,Имя, Синоним, Комментарий[,Тип]) различны. Постоянной структурой любого реквизита объекта метаданных являются не затененные элементы, структура затененных элементов может меняться в зависимости от:
- типа прикладного объекта;
- значения свойства;
- в рамках одного элемента от значения дополнительных свойство объекта метаданных в целом, например для справочника (иерархический, не иерархический), для регистра сведений (подчинен или не подчинен регистратору) и т.п.
Имя
Значение(для первых 2 рисунков)
Имя
Синоним
Комментарий
Тип
Причем расчет адресов элементов структуры происходить относительно уникального идентификатора, то есть вначале рассчитывается адрес Unid (0,0,1,1,2) после чего для остальных элементов рассчитывается отклонение от адреса Unid, (как я уже упоминал) «теория относительности» нам немного помогла.
Объекты = ПолучитьОбъектыМетаданных ( Элемент . Значение . ПолучитьТекст ());
Если Объекты . Свойство ( "Реквизиты" ) Тогда
НовыйСоставОбъектов = Объекты . Реквизиты . Скопировать ();
Для каждого Свойство из НовыйСоставОбъектов Цикл
МД = ОбъектМетаданных ( Свойство . Значение );
МД . UNID . Значение =Новый УникальныйИдентификатор ;
МД . Комментарий . Значение = МД . Комментарий . Значение + " Ei;" ;
Выше приведенный код изменяет для всех элементов свойства (в данном случае «реквизиты») объекта метаданных, уникальный идентификатор и добавляет к комментариям определенную строку. В данном коде следует обратить внимание на то, что обращение к свойствам объекта метаданных для чтения или записи, происходит следующим образом:
ОбъектМетаданных (< Элемент коллекции (Реквизит) >) .[ Ключ ]. Значение =;
МД . UNID . Значение =
потому что в структуре хранится элемент списка значений.
Копирование элементов
Ну теперь мы вплотную подошли к самому сложному.
Попробуем перефразировать крылатую фразу.
«Для того что бы что-то куда-то вставить нужно что то и где-то скопировать?»
Вот для того, что бы определить это «что- то» и «где-то» нужно определится с источником. Источником может быть любой объект конфигурации с необходимым набором параметров, то есть источником для вставки элемента в реквизиты документа, справочника,… и т.д. может являться любое измерение или ресурс, возможно и обратное, однако измерение содержит больше свойств чем например реквизит (Ведущее, Запрет незаполненных значений), поэтому при добавлении эти свойства примут такое же значение, как и первый элемент коллекции, в которую добавляется новый элемент. Отличатся эти элементы (первый элемент коллекции и добавляемый элемент) будут только элементами постоянной структуры объектов метаданных (см. выше не затененные элементы).
На рисунке изображен результат копирования реквизита табличной части документа в измерения регистра сведений.
Однако для большей надежности рекомендуется копировать реквизиты одного типа. Это увеличит скорость копирования реквизитов и компенсирует возможные коллизии.
Для того что бы определить те реквизиты которые будем копировать необходимо в форме «Объекты конфигурации» выбрать в дереве объектов источник (прикладной объект содержащий нужные реквизиты). Для каждого прикладного объекта существуют в таблице Config запись без окончания (см. Формат уникального идентификатора) в этих записях, как уже было сказано выше, и хранится описание свойств метаданных прикладного объекта. После открытия этой записи в форме «Встроенного языка», в правой части этой формы будет сформирован обозреватель объекта – дерево значений, сформированное на основе внутреннего представления свойств метаданных, строится на основании флаговых идентификаторов перечисленных в настройках Параметры – Объекты конфигурации – Обозреватель объектов, колонки этого дерева содержат все доступные свойства элемента коллекции (пока это Unid,Имя, Синоним, Комментарий и Тип). Именно в обозревателе объектов нужно выбрать необходимые элементы свойств и передать их в форму "Конструктор запросов" для групповой обработки, выбрав пункт контекстного меню в обозревателе объекта.
В результаты запроса конструктора также передастся дерево конфигурации именно по нему мы можем определить, в какие прикладные объекты нам нужно добавить выбранные свойства.
Как уже упоминалось в самом начале, нас интересует только метаданные прикладных объектов, поэтому отметим только эти строчки в результатах запроса, для нужных (редактируемых) объектов. Это достаточно просто сделать еще количество редактируемы реквизитов не велико… Но мы затеяли всю эту «кашу» не для того чтобы «тупо» сидеть и выбирать 200 элементов например справочников в дереве значений. Поскольку редактировать тексты модулей или формы в нашу задачу сейчас не входит то по большей части нам необходимы только внутренние идентификаторы определенных прикладных объектов. Получить соответствие ПолноеИмя -Unid можно используя шаблон «Метаданные» Действия – Шаблоны –Метаданные (перебор) в форме «Конструктор запроса» . Данный шаблон представляет из себя следующее выражение на встроенном языке:
Результат =Новый ТаблицаЗначений ;
Результат . Колонки . Добавить ( "Имя" );
Результат . Колонки . Добавить ( "FileName" );
Для каждого Объект из Справочники . ТипВсеСсылки (). Типы () Цикл
//Для каждого Объект из Параметры.ТипыМД.Типы() Цикл //выбранные типы
//Для Каждого Объект ИЗ Метаданные.Обработки Цикл //не ссылочныетипы
Мета =?( ТипЗнч ( Объект )= Тип ( "ОбъектМетаданных" ), Объект , Метаданные . НайтиПоТипу ( Объект ));
Если Не Мета =Неопределено Тогда
НоваяСтрока = Результат . Добавить ();
НоваяСтрока . Имя = Мета . ПолноеИмя ();
НоваяСтрока . FileName = ПолучитьИдентификаторМД ( Мета ); // получаем идентификатор САМОЕ ГЛАВНОЕ
Результат . Сортировать ( "Имя Возр" );
//ОбновитьВерсииИзменныхМетаданных(Параметры.ИзмененныеМД); //Регистрации версий для измененных метаданных, используется после групповой обработки
и позволяет определить внутренний уникальный идентификатор:
для всех объектов одного типа (Справочников или Документов или ….)-используя в заголовке цикла следующую конструкцию < МенеджерПрикладногоОбъекта >. ТипВсеСсылки (). Типы () ;
для объектов различных типов нудные типы необходимо указать в параметре «ТипыМД» - используя в заголовке цикла следующую конструкцию Для каждого Объект из Параметры . ТипыМД.Типы () Цикл ;
Для всех объектов не ссылочного типа (обработок, отчетов) по средствам перебора объектов метаданных
Заменяя заголовок цикла, мы всегда можем получить набор любых прикладных объектов. Так же дополнительный отбор можно поставить в теле цикла или поле выполнения шаблона в результат выбрать только нужны строки. После выполнения шаблона мы получим минимальный набор данных необходимый для группового редактирования реквизитов.
1. Если при изменении структуры метаданных конфигурации планируется удалить объект метаданных (реквизит, измерение, ресурс и пр.), связанный с записями информационной базы, то необходимо принять решение об удалении или переносе данных этого объекта в новые структуры. При переносе данных в другие объекты рекомендуется придерживаться следующих правил:
- Не удалять из конфигурации устаревшие объекты метаданных и реквизиты безвозвратно, а пометить их как устаревшие, добавив к их именам префикс "Удалить". Например: реквизит "ОсновнойДоговор" должен быть переименован в «УдалитьОсновнойДоговор». В синоним устаревшего объекта (реквизита) рекомендуется добавлять префикс "(не используется)", например: "(не используется) Основной договор". Если же устарел стандартный реквизит, то префикс "(не используется)" также добавляется в его синоним.
- После изменения структуры метаданных следует обеспечить перенос данных из устаревших реквизитов в новую структуру метаданных конфигурации. Кроме того, если удаляемый объект метаданных является документом – регистратором движений, а соответствующие регистры с движениями остаются в составе конфигурации, то необходимо обратить внимание на необходимость сохранения движений. Для сохранения движений документов – устаревших объектов метаданных, рекомендуется:
- Запретить генерацию движений при проведении документов этого вида.
- Запретить снятие пометки удаления для документов этого вида.
- Во всех существующих движениях документов этого вида изменить регистратор на один или несколько замещающих документов-регистраторов: существующих универсальных или специально разработанных. Например "Перенос данных","Операция".
- Пометить все документы этого вида на удаление.
- Произвести замену во всей конфигурации обращений к устаревшим реквизитам на обращение к новым данным, поскольку использование устаревших объектов и их реквизитов после изменения структуры метаданных методически неверно
- При сортировке устаревших объектов метаданных и реквизитов в дереве метаданных следует придерживаться общих требований к конфигурации .
Выполнение этих правил позволит отвязать существующие и не допустить возникновения новых записей информационной базы для объектов метаданных.
2. Безвозвратно удалять устаревшие объекты метаданных и реквизиты, помеченные префиксом "Удалить", следует при выпуске очередных версий конфигурации в том случае, если соблюдается одно из условий:
- Переход со "старой" версии конфигурации на новые версии всегда выполняется пользователями последовательно, "через" версию с реализованным переносом данных из "устаревших" объектов метаданных и реквизитов. Например: если в конфигурации версии 1.1 реквизит "ОсновнойДоговор" был помечен как устаревший, то переход с версии 1.0 на версию 2.0 всегда выполняется только последовательно: сначала на версию 1.1 (в которой происходит обработка устаревших данных), а затем на 2.0 (в которой устаревшие данные могут быть удалены безвозвратно). Непосредственный переход с версии 1.0 на 2.0 технически невозможен (запрещен).
- Вероятность того, что "старой" версией конфигурации еще пользуются, стала нулевой или пренебрежимо малой.
Другие материалы по теме:
Нас находят: удалить объект из конфигурации 1с, ОбъектМетаданных СтандартныеРеквизиты Регистратор, 1с удаленный объект метаданных остался, префикс удалить 1с, rfr d fpt 1 c yfqnb lfne ghbyznbz yvf, как удалить реквизит из конфигурации 1с, 1с как удалить индентификаторы объектов метеданных, удаление версий объектов старых данных 1с, 1с удалить объект метаданных, rfr elfkbnm vtnflfyyst 1c8
Программное создание объектов метаданных
Всем привет! Возможно ли средствами 1С или каким-либо сторонним ПО создать новый объект(документ.
Ошибка Метаданных "не найден идентификатор в справочнике Идентификатор объекта метаданных"
В общем ситуация следующая, только начал разбираться с 1С, скачал с оф сайта учебную версию для.
Подскажите, пожалуйста, для JS полный справочник объектов, свойств, методов
Здравствуйте. Подскажите, пожалуйста, есть ли для JS полный справочник объектов, свойств, методов.
Где можно найти документацию, справочник, описание COM-объектов Excel, Word?
Подскажите где можно найти документацию, справочник, описание COM-объектов Excel, Word? Мой шеф.
Для хранения списка объектов метаданных
как я понял: юзается при сравнении конфигураций (а сравнение юзается при обновлении, обмене+обновлени, совместной разработке конф, итд)
Добавлено через 2 минуты
з.ы. конкретной инфы по справочнику не находил, везде косвенные отсылки к самому явлению "идентификаторы объектов метаданных"
Т.е. конфигуратора для этого НАМ мало.
Добавлено через 33 секунды
Давайте в Регистре Сведений хранить тексты функций?!
Добавлено через 25 минут
Нашел на ИТСе
Использование идентификаторов объектов метаданных
При необходимости хранить в базе данных ссылку на объект метаданных (например, ссылка на объект метаданных Справочник.Организации) рекомендуется вместо строкового реквизита с полным именем объекта метаданных использовать ссылку на соответствующий элемент справочника ИдентификаторыОбъектовМетаданных. Такая потребность возникает, например, в различных подсистемах БСП: для хранения настроек версионирования данных, списка выбранных ролей в профилях групп доступа и т.п.
Такой подход позволяет
Программно, ссылку на объект метаданных можно получить с помощью функции ИдентификаторОбъектаМетаданных общего модуля ОбщегоНазначения.
Справочник ИдентификаторыОбъектовМетаданных заполняется автоматически при первом запуске (и каждом обновлении) конфигурации, согласно метаданным конфигурации, а также автоматически актуализируется при каждом обновлении версии конфигурации (учитываются переименованные, добавленные и удаленные объекты метаданных). Полный список объектов метаданных (справочники, документы, регистры, и т.п.), обновление идентификаторов которых выполняется автоматически, см. в комментарии к функции ИдентификаторОбъектаМетадан*ных общего модуля ОбщегоНазначения.
Исключение составляют подсистемы и роли, обновление идентификаторов которых требуется выполнять вручную. Необходимость обновления идентификаторов подсистем и ролей возникает при их переименовании (а для подсистем – также и в случае их перемещения из одной родительской подсистемы в другую). В противном случае, возможно рассогласование идентификаторов объектов метаданных с объектами метаданных конфигурации.
Для обновления идентификаторов необходимо воспользоваться процедурой ЗаполнитьТаблицуПереименованияОбъектовМетаданных общего модуля ОбщегоНазначенияПереопределяемый и увеличить номер версии конфигурации. Например, следующий фрагмент кода описывает, что в версии конфигурации 2.0.1.2 подсистема _ДемоПоставляемыеДанные была перенесена из подсистемы _ДемоРаботаВМоделиСервиса в _ДемоНастройкаИАдминистрирование:
Обновление идентификаторов выполняется последовательно по версиям конфигурации, а в пределах одной версии – в порядке следования строк со сведениями о переименованиях. Обновление идентификаторов для переименованных подсистем выполняется также и для всех их дочерних подсистем (если они есть).
Отдельным случаем, когда обновление идентификаторов происходит автоматически, является переименование объектов метаданных с целью изменения структуры данных с помощью создания новой копии объекта метаданных. Такая необходимость возникает, когда реструктуризация объекта метаданных невозможна. Например, при сокращении длины кода справочника Подразделения с 50 до 11, может потребоваться создать новый справочник, а старый переименовать в УдалитьПодразделения. В этом случае идентификатор справочника будет автоматически назначен новому справочнику с тем же именем.
Однако если при этом новый справочник будет назван иначе, например, СтруктурныеЕдиницы, то потребуется отразить переименование справочника Подразделения в справочник СтруктурныеЕдиницы, как это описано выше.
При активной разработке конфигурации данные справочника ИдентификаторыОбъектовМетаданных можно также обновлять вручную, без увеличения номера версии конфигурации, с помощью команды Обновить данные справочника в форме списка (открыв ее, например, из меню Все функции). Однако, это допустимо только в случае, когда не производилось переименование ролей и/или подсистем. В случае переименования ролей и/или подсистем, перед выполнением команды Обновить данные справочника нужно выполнить переименование полных имен соответствующих элементов справочника. Для этого нужно открыть форму элемента справочника ИдентификаторыОбъектовМетаданных, выполнить команду Включить возможность редактирования в меню Все действия и задать новое полное имя. В противном случае, этот элемент справочника будет помечен на удаление и создан новый, что приведет к рассогласованию идентификаторов объектов метаданных с объектами метаданных конфигурации.
Ошибка дублирования появляется в момент обновления конфигурации базы данных после обновления:
- При объединении конфигураций вместо обновления типовой (внутренние идентификаторы у них различные, а имя объекта метаданных совпадает)
- При обновлении конфигурации из хранилища (в случае, если 1 и тот же объект добавили различные пользователи)
Как это выглядит после обновления:
Из иллюстрации видно, что объект захвачен для разработки, следовательно исправлять его следует в месте захвата. Сразу сделайте копию информационной базы (не важно, что она некорректная, может стать еще хуже).
- В общем случае, следует удалить один из них, либо переименовать(когда они отличаются) и поместить в хранилище .
- В случае когда это типовой объект, его следует снять с поддержки перед удалением.
- Такие ошибки преимущественно возникают на 1С 8.3.6, возможно следует обновить платформу.
- В самом худшем случае, следует пересоздать хранилище заново, если объект в базе в единственном числе (перед этим следует выгрузить конфигурации из всех баз разработки, и перед развертыванием объединить их в ручном режиме.
При обновлении типовой конфигурации могут быть две основные проблемы:
Возможно ситуация, когда при следующем обновлении ситуация повторяется, по причине совпадения внутренних идентификаторов объектов , тогда потребуется перенос данных на вновь созданные объекты/реквизиты посредством конвертации данных или других способов и повторить удаление объекта
Как выяснить какой объект удалять?
- Сначала переименовываете и обновляете конфигурацию.
- Заходите в режим предприятия и смотрите какие объекты в наличии или заполнены (если это реквизит).
- Если объект новый, то можно удалить любой.
Реклама — виновница того, что народ выбрал себе в вожди Гитлера. Реклама призвана убеждать граждан, что ситуация нормальна, когда она катастрофически ненормальна.
— Фредерик Бегбедер
При добавлении новых объектов в типовые конфигурации возможна ошибка при обращении к этому объекту в режиме 1C:Предприятие: "Объект не найден в Справочнике "ИдентификаторыОбъектовМетаданных".
Для объекта метаданных "Отчет.РИК_РасчетыСПартнерами" не найден идентификатор в справочнике "Идентификаторы объектов метаданных".
Для разработчика: возможно требуется обновить вспомогательные данные, которые влияют на работу программы. Для выполнения обновления можно:
- воспользоваться внешней обработкой "Инструменты разработчика: Обновление вспомогательных данных",
- либо запустить программу с параметром командной строки 1С:Предприятия 8 "/С ЗапуститьОбновлениеИнформационнойБазы",
- либо увеличить номер версии конфигурации, чтобы при очередном запуске выполнились процедуры обновления данных информационной базы.
Варианты решения:
1. В некоторых конфигурациях режиме предприятия
Все функции - Обработки - "Инструменты разработчика: Обновление вспомогательных данных", Если обработки нет, то пункт 2
Все функции - Справочники - "Идентификаторы объектов метаданных", нажать кнопку "Обновить данные справочника", Если кнопки обновить нет, то пункт 2
2. Из Конфигуратора запустить с параметром «/С ЗапуститьОбновлениеИнформационнойБазы», т.к. обработки может не оказаться под руками, а изменение версии производится с обновлением конфигурации и базы, что может оказаться не удобным:
Сервис/Параметры - Вкладка Запуск1С:Предприятия - В свойстве «Параметр запуска» добавляем «/С ЗапуститьОбновлениеИнформационнойБазы»
При запуске Предприятия появится окно обновления конфигурации. Потом не забудьте Убрать параметр запуска, чтобы больше не запускалось обновление!
3. Обновить конфигурацию или вручную увеличить номер версии конфигурации, чтобы при очередном запуске выполнились процедуры обновления данных информационной базы.
Читайте также: