/
Как происходит генерация расширения с учётом кучи свойств?

Как происходит генерация расширения с учётом кучи свойств?

Роли в расширениях работают по принципу зависимости от объектов, т.е. если можно расширить форму и просто забить на реквизиты, то все будет работать, мы сможем к ним общаться из расширения и т.д. Однако, в случае ролей - если дается право на таблицу, на реквизит, то тогда этот реквизит обязан быть в конфигурации.

Таким образом - нужен был механизм, который может полностью сгенерировать расширение, и для того, чтобы он работал - достаточно передать пару реквизитов, типо путь объекта, тип объекта и еще несколько.

У разных объектов - есть разные свойства, например, 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);

 

Related content