Как происходит генерация расширения с учётом кучи свойств?
Роли в расширениях работают по принципу зависимости от объектов, т.е. если можно расширить форму и просто забить на реквизиты, то все будет работать, мы сможем к ним общаться из расширения и т.д. Однако, в случае ролей - если дается право на таблицу, на реквизит, то тогда этот реквизит обязан быть в конфигурации.
Таким образом - нужен был механизм, который может полностью сгенерировать расширение, и для того, чтобы он работал - достаточно передать пару реквизитов, типо путь объекта, тип объекта и еще несколько.
У разных объектов - есть разные свойства, например, xml справочника выглядит вот так:
<?xml version="1.0" encoding="UTF-8"?>
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.8">
<Catalog uuid="9c2b82fa-1adc-427f-a0d8-6eaeb2bef2b0">
<InternalInfo>
<xr:GeneratedType name="CatalogObject.Банки" category="Object">
<xr:TypeId>0ad45a19-1ec2-440a-8751-9f9a658125cb</xr:TypeId>
<xr:ValueId>21cc3b2b-46a7-4efe-8458-115eb901e246</xr:ValueId>
</xr:GeneratedType>
<xr:GeneratedType name="CatalogRef.Банки" category="Ref">
<xr:TypeId>c8b51a5c-fe62-4e33-b9c9-7218f4c45a62</xr:TypeId>
<xr:ValueId>a15ef270-ad3c-4f0f-afb0-91764ba2e0b0</xr:ValueId>
</xr:GeneratedType>
<xr:GeneratedType name="CatalogSelection.Банки" category="Selection">
<xr:TypeId>2d97819f-3b3f-4aac-867b-266f85c0f85e</xr:TypeId>
<xr:ValueId>62024f40-7fa1-43ef-81c2-f6338804f868</xr:ValueId>
</xr:GeneratedType>
<xr:GeneratedType name="CatalogList.Банки" category="List">
<xr:TypeId>df1dcbc8-6545-46d9-b292-39bae1dbe780</xr:TypeId>
<xr:ValueId>8f46be6d-0f35-4cbc-b312-cf827c3021d3</xr:ValueId>
</xr:GeneratedType>
<xr:GeneratedType name="CatalogManager.Банки" category="Manager">
<xr:TypeId>50f2b315-fd0c-438c-85c1-a597c6ddeb63</xr:TypeId>
<xr:ValueId>55db6044-a457-48c0-8daf-32450793ee00</xr:ValueId>
</xr:GeneratedType>
</InternalInfo>
<Properties>
<Name>Банки</Name>
<Comment/>
<ObjectBelonging>Adopted</ObjectBelonging>
</Properties>
<ChildObjects/>
</Catalog>
</MetaDataObject>
Т.е. для него обязательно нужны теги InternalInfo, Properties, ChildObjects
. Причем, у каждого типа объекта - они могут быть разными.
Все GUID - генерируются каждый раз динамически, и платформа это нормально принимает, так как эти GUID важны только если вы привязываетесь к объекту не только по имени, но и его ID (а мы это не используем), или если вы делаете собственные объекты в расширении, которые модифицируют структуру конфы, ну например - не расширяете справочник, а добавляете новый.
Для того, чтобы определить - какие теги у каких объектов, то существует три функции:
Roles_Settings.hasOnlyProperties(RefData)
Roles_Settings.hasNoChildObjects(RefData)
Roles_Settings.hasNoInternalInfo(RefData)
В них и описано все.
Кроме этого - есть функция Roles_Settings.MetaDataObject, в которой описаны все варианты этих тегов для всех объектов, например:
AccumulationRegister = New Structure;
AccumulationRegister.Insert("AccumulationRegisterRecord" , "Record" );
AccumulationRegister.Insert("AccumulationRegisterManager" , "Manager" );
AccumulationRegister.Insert("AccumulationRegisterSelection", "Selection");
AccumulationRegister.Insert("AccumulationRegisterList" , "List" );
AccumulationRegister.Insert("AccumulationRegisterRecordSet", "RecordSet");
AccumulationRegister.Insert("AccumulationRegisterRecordKey", "RecordKey");
MetaDataObject.Insert("AccumulationRegister", AccumulationRegister);