feat(role-compile): порядок прав и узлов как у платформы

Платформа нормализует и то и другое: права внутри <object> идут в
фиксированном для типа порядке, сами <object> — по uuid объекта
метаданных. Навык писал в порядке ввода, поэтому первая же выгрузка из
Конфигуратора давала диф, которого никто не делал.

Замеры (debug/role-edit/FINDINGS.md): канон прав снят с платформы и
сошёлся с топологической сортировкой по корпусу (~290k узлов <right>);
порядок узлов по uuid подтверждён на 363 ролях ACC из 363 и отдельно на
44 ролях с вложенными объектами, где ключ — uuid самого реквизита.
Порядок дерева конфигурации тут ни при чём — прямое сравнение
с ChildObjects даёт скачущие позиции. Проверка: выход обоих портов
совпал с выгрузкой 1С байт в байт.

Сортировка узлов строго ordinal: Sort-Object сравнивает по культуре и
игнорирует дефис, из-за чего порядок разошёлся бы и с платформой, и с
py-портом.

Объект, которого нет в выгрузке (uuid неизвестен), уходит в конец с
предупреждением в stderr — платформа переставит его сама.

Кейсы с несколькими объектами переведены с preRun на фикстуры: uuid,
который meta-compile генерирует заново на каждом прогоне, сделал бы
порядок узлов плавающим. Фикстуры собраны теми же навыками. Двум
фикстурам добавлен документ-регистратор: регистр расчёта без него
платформа не принимает, и verify-snapshots это поймал.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FGkXwoXTuafcu1SXMsauFq
This commit is contained in:
Nick Shirokov
2026-09-13 17:01:54 +03:00
co-authored by Claude Opus 5
parent c23cae39d8
commit bbc3be55a5
162 changed files with 10432 additions and 523 deletions
@@ -21,18 +21,6 @@
<name>Delete</name>
<value>true</value>
</right>
<right>
<name>View</name>
<value>true</value>
</right>
<right>
<name>Edit</name>
<value>true</value>
</right>
<right>
<name>InputByString</name>
<value>true</value>
</right>
<right>
<name>Posting</name>
<value>true</value>
@@ -41,10 +29,18 @@
<name>UndoPosting</name>
<value>true</value>
</right>
<right>
<name>View</name>
<value>true</value>
</right>
<right>
<name>InteractiveInsert</name>
<value>true</value>
</right>
<right>
<name>Edit</name>
<value>true</value>
</right>
<right>
<name>InteractiveSetDeletionMark</name>
<value>true</value>
@@ -69,5 +65,9 @@
<name>InteractiveChangeOfPosted</name>
<value>true</value>
</right>
<right>
<name>InputByString</name>
<value>true</value>
</right>
</object>
</Rights>
@@ -3,13 +3,6 @@
<setForNewObjects>false</setForNewObjects>
<setForAttributesByDefault>true</setForAttributesByDefault>
<independentRightsOfChildObjects>false</independentRightsOfChildObjects>
<object>
<name>HTTPService.ЭДО.URLTemplate.ЕстьНовыеДокументы.Method.POST</name>
<right>
<name>Use</name>
<value>true</value>
</right>
</object>
<object>
<name>HTTPService.Расш1_HTTPСервис1.URLTemplate.ШаблонURL1.Method.Метод1</name>
<right>
@@ -17,4 +10,11 @@
<value>true</value>
</right>
</object>
<object>
<name>HTTPService.ЭДО.URLTemplate.ЕстьНовыеДокументы.Method.POST</name>
<right>
<name>Use</name>
<value>true</value>
</right>
</object>
</Rights>
@@ -4,14 +4,14 @@
<setForAttributesByDefault>true</setForAttributesByDefault>
<independentRightsOfChildObjects>false</independentRightsOfChildObjects>
<object>
<name>HTTPService.ВнешнийAPI.URLTemplate.Заказы.Method.Получить</name>
<name>HTTPService.ВнешнийAPI.URLTemplate.Заказы.Method.Создать</name>
<right>
<name>Use</name>
<value>true</value>
</right>
</object>
<object>
<name>HTTPService.ВнешнийAPI.URLTemplate.Заказы.Method.Создать</name>
<name>HTTPService.ВнешнийAPI.URLTemplate.Заказы.Method.Получить</name>
<right>
<name>Use</name>
<value>true</value>
@@ -3,13 +3,6 @@
<setForNewObjects>false</setForNewObjects>
<setForAttributesByDefault>true</setForAttributesByDefault>
<independentRightsOfChildObjects>false</independentRightsOfChildObjects>
<object>
<name>HTTPService.ВнешнийAPI.URLTemplate.Заказы.Method.Получить</name>
<right>
<name>Use</name>
<value>true</value>
</right>
</object>
<object>
<name>HTTPService.ВнешнийAPI.URLTemplate.Заказы.Method.Создать</name>
<right>
@@ -17,13 +10,6 @@
<value>true</value>
</right>
</object>
<object>
<name>HTTPService.ВнешнийAPI.URLTemplate.Версия.Method.GET</name>
<right>
<name>Use</name>
<value>true</value>
</right>
</object>
<object>
<name>WebService.ОбменДанными.Operation.Загрузить</name>
<right>
@@ -31,6 +17,13 @@
<value>true</value>
</right>
</object>
<object>
<name>HTTPService.ВнешнийAPI.URLTemplate.Заказы.Method.Получить</name>
<right>
<name>Use</name>
<value>true</value>
</right>
</object>
<object>
<name>WebService.ОбменДанными.Operation.Выгрузить</name>
<right>
@@ -38,4 +31,11 @@
<value>true</value>
</right>
</object>
<object>
<name>HTTPService.ВнешнийAPI.URLTemplate.Версия.Method.GET</name>
<right>
<name>Use</name>
<value>true</value>
</right>
</object>
</Rights>
@@ -247,6 +247,7 @@
<ChildObjects>
<Language>Русский</Language>
<Role>ИсторияДанныхПроцессов</Role>
<Document>РегистраторРасчёта</Document>
<ChartOfCalculationTypes>Начисления</ChartOfCalculationTypes>
<CalculationRegister>Начисление</CalculationRegister>
<BusinessProcess>Согласование</BusinessProcess>
@@ -0,0 +1,84 @@
<?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.17">
<Document uuid="UUID-001">
<InternalInfo>
<xr:GeneratedType name="DocumentObject.РегистраторРасчёта" category="Object">
<xr:TypeId>UUID-002</xr:TypeId>
<xr:ValueId>UUID-003</xr:ValueId>
</xr:GeneratedType>
<xr:GeneratedType name="DocumentRef.РегистраторРасчёта" category="Ref">
<xr:TypeId>UUID-004</xr:TypeId>
<xr:ValueId>UUID-005</xr:ValueId>
</xr:GeneratedType>
<xr:GeneratedType name="DocumentSelection.РегистраторРасчёта" category="Selection">
<xr:TypeId>UUID-006</xr:TypeId>
<xr:ValueId>UUID-007</xr:ValueId>
</xr:GeneratedType>
<xr:GeneratedType name="DocumentList.РегистраторРасчёта" category="List">
<xr:TypeId>UUID-008</xr:TypeId>
<xr:ValueId>UUID-009</xr:ValueId>
</xr:GeneratedType>
<xr:GeneratedType name="DocumentManager.РегистраторРасчёта" category="Manager">
<xr:TypeId>UUID-010</xr:TypeId>
<xr:ValueId>UUID-011</xr:ValueId>
</xr:GeneratedType>
</InternalInfo>
<Properties>
<Name>РегистраторРасчёта</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Регистратор расчёта</v8:content>
</v8:item>
</Synonym>
<Comment/>
<UseStandardCommands>true</UseStandardCommands>
<Numerator/>
<NumberType>String</NumberType>
<NumberLength>11</NumberLength>
<NumberAllowedLength>Variable</NumberAllowedLength>
<NumberPeriodicity>Year</NumberPeriodicity>
<CheckUnique>true</CheckUnique>
<Autonumbering>true</Autonumbering>
<Characteristics/>
<BasedOn/>
<InputByString>
<xr:Field>Document.РегистраторРасчёта.StandardAttribute.Number</xr:Field>
</InputByString>
<CreateOnInput>Use</CreateOnInput>
<SearchStringModeOnInputByString>Begin</SearchStringModeOnInputByString>
<FullTextSearchOnInputByString>DontUse</FullTextSearchOnInputByString>
<ChoiceDataGetModeOnInputByString>Directly</ChoiceDataGetModeOnInputByString>
<DefaultObjectForm/>
<DefaultListForm/>
<DefaultChoiceForm/>
<AuxiliaryObjectForm/>
<AuxiliaryListForm/>
<AuxiliaryChoiceForm/>
<Posting>Allow</Posting>
<RealTimePosting>Deny</RealTimePosting>
<RegisterRecordsDeletion>AutoDelete</RegisterRecordsDeletion>
<RegisterRecordsWritingOnPost>WriteSelected</RegisterRecordsWritingOnPost>
<SequenceFilling>AutoFill</SequenceFilling>
<RegisterRecords>
<xr:Item xsi:type="xr:MDObjectRef">CalculationRegister.Начисление</xr:Item>
</RegisterRecords>
<PostInPrivilegedMode>true</PostInPrivilegedMode>
<UnpostInPrivilegedMode>true</UnpostInPrivilegedMode>
<IncludeHelpInContents>false</IncludeHelpInContents>
<DataLockFields/>
<DataLockControlMode>Managed</DataLockControlMode>
<FullTextSearch>Use</FullTextSearch>
<ObjectPresentation/>
<ExtendedObjectPresentation/>
<ListPresentation/>
<ExtendedListPresentation/>
<Explanation/>
<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
<DataHistory>DontUse</DataHistory>
<UpdateDataHistoryImmediatelyAfterWrite>false</UpdateDataHistoryImmediatelyAfterWrite>
<ExecuteAfterWriteDataHistoryVersionProcessing>false</ExecuteAfterWriteDataHistoryVersionProcessing>
</Properties>
<ChildObjects/>
</Document>
</MetaDataObject>
@@ -3,25 +3,6 @@
<setForNewObjects>false</setForNewObjects>
<setForAttributesByDefault>true</setForAttributesByDefault>
<independentRightsOfChildObjects>false</independentRightsOfChildObjects>
<object>
<name>BusinessProcess.Согласование</name>
<right>
<name>Read</name>
<value>true</value>
</right>
<right>
<name>ReadDataHistory</name>
<value>true</value>
</right>
<right>
<name>ViewDataHistory</name>
<value>true</value>
</right>
<right>
<name>InteractiveDeleteMarked</name>
<value>true</value>
</right>
</object>
<object>
<name>Task.ЗадачаИсполнителя</name>
<right>
@@ -44,11 +25,11 @@
<value>true</value>
</right>
<right>
<name>EditDataHistoryVersionComment</name>
<name>InteractiveDeleteMarked</name>
<value>true</value>
</right>
<right>
<name>InteractiveDeleteMarked</name>
<name>EditDataHistoryVersionComment</name>
<value>true</value>
</right>
</object>
@@ -71,4 +52,23 @@
<value>true</value>
</right>
</object>
<object>
<name>BusinessProcess.Согласование</name>
<right>
<name>Read</name>
<value>true</value>
</right>
<right>
<name>InteractiveDeleteMarked</name>
<value>true</value>
</right>
<right>
<name>ReadDataHistory</name>
<value>true</value>
</right>
<right>
<name>ViewDataHistory</name>
<value>true</value>
</right>
</object>
</Rights>
@@ -247,6 +247,7 @@
<ChildObjects>
<Language>Русский</Language>
<Role>РольАлиасы</Role>
<Document>РегистраторРасчёта</Document>
<Report>Сводный</Report>
<ChartOfCalculationTypes>ВидыРасчета</ChartOfCalculationTypes>
<CalculationRegister>Начисления</CalculationRegister>
@@ -0,0 +1,84 @@
<?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.17">
<Document uuid="UUID-001">
<InternalInfo>
<xr:GeneratedType name="DocumentObject.РегистраторРасчёта" category="Object">
<xr:TypeId>UUID-002</xr:TypeId>
<xr:ValueId>UUID-003</xr:ValueId>
</xr:GeneratedType>
<xr:GeneratedType name="DocumentRef.РегистраторРасчёта" category="Ref">
<xr:TypeId>UUID-004</xr:TypeId>
<xr:ValueId>UUID-005</xr:ValueId>
</xr:GeneratedType>
<xr:GeneratedType name="DocumentSelection.РегистраторРасчёта" category="Selection">
<xr:TypeId>UUID-006</xr:TypeId>
<xr:ValueId>UUID-007</xr:ValueId>
</xr:GeneratedType>
<xr:GeneratedType name="DocumentList.РегистраторРасчёта" category="List">
<xr:TypeId>UUID-008</xr:TypeId>
<xr:ValueId>UUID-009</xr:ValueId>
</xr:GeneratedType>
<xr:GeneratedType name="DocumentManager.РегистраторРасчёта" category="Manager">
<xr:TypeId>UUID-010</xr:TypeId>
<xr:ValueId>UUID-011</xr:ValueId>
</xr:GeneratedType>
</InternalInfo>
<Properties>
<Name>РегистраторРасчёта</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Регистратор расчёта</v8:content>
</v8:item>
</Synonym>
<Comment/>
<UseStandardCommands>true</UseStandardCommands>
<Numerator/>
<NumberType>String</NumberType>
<NumberLength>11</NumberLength>
<NumberAllowedLength>Variable</NumberAllowedLength>
<NumberPeriodicity>Year</NumberPeriodicity>
<CheckUnique>true</CheckUnique>
<Autonumbering>true</Autonumbering>
<Characteristics/>
<BasedOn/>
<InputByString>
<xr:Field>Document.РегистраторРасчёта.StandardAttribute.Number</xr:Field>
</InputByString>
<CreateOnInput>Use</CreateOnInput>
<SearchStringModeOnInputByString>Begin</SearchStringModeOnInputByString>
<FullTextSearchOnInputByString>DontUse</FullTextSearchOnInputByString>
<ChoiceDataGetModeOnInputByString>Directly</ChoiceDataGetModeOnInputByString>
<DefaultObjectForm/>
<DefaultListForm/>
<DefaultChoiceForm/>
<AuxiliaryObjectForm/>
<AuxiliaryListForm/>
<AuxiliaryChoiceForm/>
<Posting>Allow</Posting>
<RealTimePosting>Deny</RealTimePosting>
<RegisterRecordsDeletion>AutoDelete</RegisterRecordsDeletion>
<RegisterRecordsWritingOnPost>WriteSelected</RegisterRecordsWritingOnPost>
<SequenceFilling>AutoFill</SequenceFilling>
<RegisterRecords>
<xr:Item xsi:type="xr:MDObjectRef">CalculationRegister.Начисления</xr:Item>
</RegisterRecords>
<PostInPrivilegedMode>true</PostInPrivilegedMode>
<UnpostInPrivilegedMode>true</UnpostInPrivilegedMode>
<IncludeHelpInContents>false</IncludeHelpInContents>
<DataLockFields/>
<DataLockControlMode>Managed</DataLockControlMode>
<FullTextSearch>Use</FullTextSearch>
<ObjectPresentation/>
<ExtendedObjectPresentation/>
<ListPresentation/>
<ExtendedListPresentation/>
<Explanation/>
<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
<DataHistory>DontUse</DataHistory>
<UpdateDataHistoryImmediatelyAfterWrite>false</UpdateDataHistoryImmediatelyAfterWrite>
<ExecuteAfterWriteDataHistoryVersionProcessing>false</ExecuteAfterWriteDataHistoryVersionProcessing>
</Properties>
<ChildObjects/>
</Document>
</MetaDataObject>
@@ -3,6 +3,13 @@
<setForNewObjects>false</setForNewObjects>
<setForAttributesByDefault>true</setForAttributesByDefault>
<independentRightsOfChildObjects>false</independentRightsOfChildObjects>
<object>
<name>Report.Сводный</name>
<right>
<name>View</name>
<value>true</value>
</right>
</object>
<object>
<name>CalculationRegister.Начисления</name>
<right>
@@ -17,11 +24,4 @@
<value>true</value>
</right>
</object>
<object>
<name>Report.Сводный</name>
<right>
<name>View</name>
<value>true</value>
</right>
</object>
</Rights>