diff --git a/.claude/skills/cfe-borrow/scripts/cfe-borrow.ps1 b/.claude/skills/cfe-borrow/scripts/cfe-borrow.ps1 index 856f55a6..8d86930b 100644 --- a/.claude/skills/cfe-borrow/scripts/cfe-borrow.ps1 +++ b/.claude/skills/cfe-borrow/scripts/cfe-borrow.ps1 @@ -1,4 +1,4 @@ -# cfe-borrow v1.20 — Borrow objects from configuration into extension (CFE) (+тип Bot; cfe-diff/cfe-borrow: недостающие типы) +# cfe-borrow v1.21 — Borrow objects from configuration into extension (CFE) (полный набор GeneratedType у заимствованных оболочек) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)][string]$ExtensionPath, @@ -209,7 +209,8 @@ $script:generatedTypes = @{ @{ prefix = "AccumulationRegisterRecordKey"; category = "RecordKey" } ) "AccountingRegister" = @( - @{ prefix = "AccountingRegisterRecord"; category = "Record" } + @{ prefix = "AccountingRegisterRecord"; category = "Record" } + @{ prefix = "AccountingRegisterExtDimensions"; category = "ExtDimensions" } @{ prefix = "AccountingRegisterManager"; category = "Manager" } @{ prefix = "AccountingRegisterSelection"; category = "Selection" } @{ prefix = "AccountingRegisterList"; category = "List" } @@ -223,6 +224,7 @@ $script:generatedTypes = @{ @{ prefix = "CalculationRegisterList"; category = "List" } @{ prefix = "CalculationRegisterRecordSet"; category = "RecordSet" } @{ prefix = "CalculationRegisterRecordKey"; category = "RecordKey" } + @{ prefix = "RecalculationsManager"; category = "Recalcs" } ) "ChartOfAccounts" = @( @{ prefix = "ChartOfAccountsObject"; category = "Object" } @@ -230,12 +232,15 @@ $script:generatedTypes = @{ @{ prefix = "ChartOfAccountsSelection"; category = "Selection" } @{ prefix = "ChartOfAccountsList"; category = "List" } @{ prefix = "ChartOfAccountsManager"; category = "Manager" } + @{ prefix = "ChartOfAccountsExtDimensionTypes"; category = "ExtDimensionTypes" } + @{ prefix = "ChartOfAccountsExtDimensionTypesRow"; category = "ExtDimensionTypesRow" } ) "ChartOfCharacteristicTypes" = @( @{ prefix = "ChartOfCharacteristicTypesObject"; category = "Object" } @{ prefix = "ChartOfCharacteristicTypesRef"; category = "Ref" } @{ prefix = "ChartOfCharacteristicTypesSelection"; category = "Selection" } @{ prefix = "ChartOfCharacteristicTypesList"; category = "List" } + @{ prefix = "Characteristic"; category = "Characteristic" } @{ prefix = "ChartOfCharacteristicTypesManager"; category = "Manager" } ) "ChartOfCalculationTypes" = @( @@ -245,8 +250,11 @@ $script:generatedTypes = @{ @{ prefix = "ChartOfCalculationTypesList"; category = "List" } @{ prefix = "ChartOfCalculationTypesManager"; category = "Manager" } @{ prefix = "DisplacingCalculationTypes"; category = "DisplacingCalculationTypes" } + @{ prefix = "DisplacingCalculationTypesRow"; category = "DisplacingCalculationTypesRow" } @{ prefix = "BaseCalculationTypes"; category = "BaseCalculationTypes" } + @{ prefix = "BaseCalculationTypesRow"; category = "BaseCalculationTypesRow" } @{ prefix = "LeadingCalculationTypes"; category = "LeadingCalculationTypes" } + @{ prefix = "LeadingCalculationTypesRow"; category = "LeadingCalculationTypesRow" } ) "BusinessProcess" = @( @{ prefix = "BusinessProcessObject"; category = "Object" } @@ -254,6 +262,7 @@ $script:generatedTypes = @{ @{ prefix = "BusinessProcessSelection"; category = "Selection" } @{ prefix = "BusinessProcessList"; category = "List" } @{ prefix = "BusinessProcessManager"; category = "Manager" } + @{ prefix = "BusinessProcessRoutePointRef"; category = "RoutePointRef" } ) "Task" = @( @{ prefix = "TaskObject"; category = "Object" } diff --git a/.claude/skills/cfe-borrow/scripts/cfe-borrow.py b/.claude/skills/cfe-borrow/scripts/cfe-borrow.py index 38fa68fb..9344a73c 100644 --- a/.claude/skills/cfe-borrow/scripts/cfe-borrow.py +++ b/.claude/skills/cfe-borrow/scripts/cfe-borrow.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# cfe-borrow v1.20 — Borrow objects from configuration into extension (CFE) (+тип Bot; cfe-diff/cfe-borrow: недостающие типы) +# cfe-borrow v1.21 — Borrow objects from configuration into extension (CFE) (полный набор GeneratedType у заимствованных оболочек) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse @@ -202,6 +202,7 @@ GENERATED_TYPES = { ], "AccountingRegister": [ {"prefix": "AccountingRegisterRecord", "category": "Record"}, + {"prefix": "AccountingRegisterExtDimensions", "category": "ExtDimensions"}, {"prefix": "AccountingRegisterManager", "category": "Manager"}, {"prefix": "AccountingRegisterSelection", "category": "Selection"}, {"prefix": "AccountingRegisterList", "category": "List"}, @@ -215,6 +216,7 @@ GENERATED_TYPES = { {"prefix": "CalculationRegisterList", "category": "List"}, {"prefix": "CalculationRegisterRecordSet", "category": "RecordSet"}, {"prefix": "CalculationRegisterRecordKey", "category": "RecordKey"}, + {"prefix": "RecalculationsManager", "category": "Recalcs"}, ], "ChartOfAccounts": [ {"prefix": "ChartOfAccountsObject", "category": "Object"}, @@ -222,12 +224,15 @@ GENERATED_TYPES = { {"prefix": "ChartOfAccountsSelection", "category": "Selection"}, {"prefix": "ChartOfAccountsList", "category": "List"}, {"prefix": "ChartOfAccountsManager", "category": "Manager"}, + {"prefix": "ChartOfAccountsExtDimensionTypes", "category": "ExtDimensionTypes"}, + {"prefix": "ChartOfAccountsExtDimensionTypesRow", "category": "ExtDimensionTypesRow"}, ], "ChartOfCharacteristicTypes": [ {"prefix": "ChartOfCharacteristicTypesObject", "category": "Object"}, {"prefix": "ChartOfCharacteristicTypesRef", "category": "Ref"}, {"prefix": "ChartOfCharacteristicTypesSelection", "category": "Selection"}, {"prefix": "ChartOfCharacteristicTypesList", "category": "List"}, + {"prefix": "Characteristic", "category": "Characteristic"}, {"prefix": "ChartOfCharacteristicTypesManager", "category": "Manager"}, ], "ChartOfCalculationTypes": [ @@ -237,8 +242,11 @@ GENERATED_TYPES = { {"prefix": "ChartOfCalculationTypesList", "category": "List"}, {"prefix": "ChartOfCalculationTypesManager", "category": "Manager"}, {"prefix": "DisplacingCalculationTypes", "category": "DisplacingCalculationTypes"}, + {"prefix": "DisplacingCalculationTypesRow", "category": "DisplacingCalculationTypesRow"}, {"prefix": "BaseCalculationTypes", "category": "BaseCalculationTypes"}, + {"prefix": "BaseCalculationTypesRow", "category": "BaseCalculationTypesRow"}, {"prefix": "LeadingCalculationTypes", "category": "LeadingCalculationTypes"}, + {"prefix": "LeadingCalculationTypesRow", "category": "LeadingCalculationTypesRow"}, ], "BusinessProcess": [ {"prefix": "BusinessProcessObject", "category": "Object"}, @@ -246,6 +254,7 @@ GENERATED_TYPES = { {"prefix": "BusinessProcessSelection", "category": "Selection"}, {"prefix": "BusinessProcessList", "category": "List"}, {"prefix": "BusinessProcessManager", "category": "Manager"}, + {"prefix": "BusinessProcessRoutePointRef", "category": "RoutePointRef"}, ], "Task": [ {"prefix": "TaskObject", "category": "Object"}, diff --git a/docs/1c-configuration-spec.md b/docs/1c-configuration-spec.md index 017d37e3..74de792e 100644 --- a/docs/1c-configuration-spec.md +++ b/docs/1c-configuration-spec.md @@ -283,6 +283,44 @@ ClassId — фиксированные идентификаторы классо Внутри одного типа объекты отсортированы по имени (алфавитный порядок). Типы, для которых нет объектов, в ChildObjects не записываются. +### 2.5. InternalInfo объектов — наборы GeneratedType + +У каждого объекта метаданных в `` перечислены порождаемые платформой типы. Набор фиксирован для типа объекта: имя элемента — `<префикс>.<ИмяОбъекта>`, атрибут `category` — категория из таблицы. **Неполный набор платформа отвергает при загрузке**: «отсутствует один или более типов объекта <Тип>» (для заимствованных оболочек в расширениях — тоже). + +Запись `префикс`/Категория; `…` в префиксе = имя типа объекта (`…Ref` у `ChartOfAccounts` читается `ChartOfAccountsRef`). + +| Тип объекта | Префикс + категория (в порядке типовой выгрузки) | +|-------------|--------------------------------------------------| +| `Catalog` | `CatalogObject`/Object, `CatalogRef`/Ref, `CatalogSelection`/Selection, `CatalogList`/List, `CatalogManager`/Manager | +| `Document` | `DocumentObject`/Object, `DocumentRef`/Ref, `DocumentSelection`/Selection, `DocumentList`/List, `DocumentManager`/Manager | +| `Enum` | `EnumRef`/Ref, `EnumManager`/Manager, `EnumList`/List | +| `Constant` | `ConstantManager`/Manager, `ConstantValueManager`/ValueManager, `ConstantValueKey`/ValueKey | +| `Report` | `ReportObject`/Object, `ReportManager`/Manager | +| `DataProcessor` | `DataProcessorObject`/Object, `DataProcessorManager`/Manager | +| `ExchangePlan` | `ExchangePlanObject`/Object, `ExchangePlanRef`/Ref, `ExchangePlanSelection`/Selection, `ExchangePlanList`/List, `ExchangePlanManager`/Manager | +| `Task` | `TaskObject`/Object, `TaskRef`/Ref, `TaskSelection`/Selection, `TaskList`/List, `TaskManager`/Manager | +| `BusinessProcess` | `BusinessProcessObject`/Object, `BusinessProcessRef`/Ref, `BusinessProcessSelection`/Selection, `BusinessProcessList`/List, `BusinessProcessManager`/Manager, `BusinessProcessRoutePointRef`/RoutePointRef | +| `ChartOfCharacteristicTypes` | `ChartOfCharacteristicTypesObject`/Object, `…Ref`/Ref, `…Selection`/Selection, `…List`/List, `Characteristic`/Characteristic, `…Manager`/Manager | +| `ChartOfAccounts` | `ChartOfAccountsObject`/Object, `…Ref`/Ref, `…Selection`/Selection, `…List`/List, `…Manager`/Manager, `…ExtDimensionTypes`/ExtDimensionTypes, `…ExtDimensionTypesRow`/ExtDimensionTypesRow | +| `ChartOfCalculationTypes` | `ChartOfCalculationTypesObject`/Object, `…Ref`/Ref, `…Selection`/Selection, `…List`/List, `…Manager`/Manager, `DisplacingCalculationTypes`/DisplacingCalculationTypes, `DisplacingCalculationTypesRow`/DisplacingCalculationTypesRow, `BaseCalculationTypes`/BaseCalculationTypes, `BaseCalculationTypesRow`/BaseCalculationTypesRow, `LeadingCalculationTypes`/LeadingCalculationTypes, `LeadingCalculationTypesRow`/LeadingCalculationTypesRow | +| `InformationRegister` | `InformationRegisterRecord`/Record, `…Manager`/Manager, `…Selection`/Selection, `…List`/List, `…RecordSet`/RecordSet, `…RecordKey`/RecordKey, `…RecordManager`/RecordManager | +| `AccumulationRegister` | `AccumulationRegisterRecord`/Record, `…Manager`/Manager, `…Selection`/Selection, `…List`/List, `…RecordSet`/RecordSet, `…RecordKey`/RecordKey | +| `AccountingRegister` | `AccountingRegisterRecord`/Record, `AccountingRegisterExtDimensions`/ExtDimensions, `…Manager`/Manager, `…Selection`/Selection, `…List`/List, `…RecordSet`/RecordSet, `…RecordKey`/RecordKey | +| `CalculationRegister` | `CalculationRegisterRecord`/Record, `…Manager`/Manager, `…Selection`/Selection, `…List`/List, `…RecordSet`/RecordSet, `…RecordKey`/RecordKey, `RecalculationsManager`/Recalcs | +| `DocumentJournal` | `DocumentJournalSelection`/Selection, `DocumentJournalList`/List, `DocumentJournalManager`/Manager | +| `Sequence` | `SequenceRecord`/Record, `SequenceManager`/Manager, `SequenceRecordSet`/RecordSet | +| `FilterCriterion` | `FilterCriterionManager`/Manager, `FilterCriterionList`/List | +| `SettingsStorage` | `SettingsStorageManager`/Manager | +| `IntegrationService` | `IntegrationServiceManager`/Manager | +| `WSReference` | `WSReferenceManager`/Manager | +| `DefinedType` | `DefinedType`/DefinedType | + +Табличные части объектов несут собственную пару в своём ``: `<Тип>TabularSection.<Объект>.<ТЧ>`/TabularSection и `<Тип>TabularSectionRow.<Объект>.<ТЧ>`/TabularSectionRow. + +Без ``/`GeneratedType` идут `CommonModule`, `ScheduledJob`, `EventSubscription` и прочие объекты без порождаемых типов. + +Порядок в таблице — как в типовых выгрузках; на загрузку он не влияет (проверено вставкой `Characteristic` в середину набора заимствованного плана видов характеристик), значим именно состав. + --- ## 3. ConfigDumpInfo.xml — служебный файл выгрузки diff --git a/tests/skills/cases/cfe-borrow/gentypes-full.json b/tests/skills/cases/cfe-borrow/gentypes-full.json new file mode 100644 index 00000000..147f1b68 --- /dev/null +++ b/tests/skills/cases/cfe-borrow/gentypes-full.json @@ -0,0 +1,51 @@ +{ + "name": "Заимствование типов с расширенным набором GeneratedType (ПВХ/план счетов/ПВР/регистры/бизнес-процесс)", + "preRun": [ + { + "script": "meta-compile/scripts/meta-compile", + "input": { "type": "ChartOfCharacteristicTypes", "name": "ВидыСубконто", "valueType": "String(50)" }, + "args": { "-JsonPath": "{inputFile}", "-OutputDir": "{workDir}" } + }, + { + "script": "meta-compile/scripts/meta-compile", + "input": { "type": "ChartOfAccounts", "name": "Хозрасчетный", "extDimensionTypes": "ChartOfCharacteristicTypes.ВидыСубконто" }, + "args": { "-JsonPath": "{inputFile}", "-OutputDir": "{workDir}" } + }, + { + "script": "meta-compile/scripts/meta-compile", + "input": { "type": "ChartOfCalculationTypes", "name": "ОсновныеНачисления" }, + "args": { "-JsonPath": "{inputFile}", "-OutputDir": "{workDir}" } + }, + { + "script": "meta-compile/scripts/meta-compile", + "input": { + "type": "AccountingRegister", "name": "Хозрасчетный", + "chartOfAccounts": "ChartOfAccounts.Хозрасчетный", + "resources": [ { "name": "Сумма", "type": "Number(15,2)", "balance": true } ] + }, + "args": { "-JsonPath": "{inputFile}", "-OutputDir": "{workDir}" } + }, + { + "script": "meta-compile/scripts/meta-compile", + "input": { + "type": "CalculationRegister", "name": "Начисления", + "chartOfCalculationTypes": "ChartOfCalculationTypes.ОсновныеНачисления", + "resources": [ { "name": "Результат", "type": "Number(15,2)" } ] + }, + "args": { "-JsonPath": "{inputFile}", "-OutputDir": "{workDir}" } + }, + { + "script": "meta-compile/scripts/meta-compile", + "input": { "type": "BusinessProcess", "name": "Согласование" }, + "args": { "-JsonPath": "{inputFile}", "-OutputDir": "{workDir}" } + }, + { + "script": "cfe-init/scripts/cfe-init", + "args": { "-Name": "Тест", "-OutputDir": "{workDir}/ext", "-ConfigPath": "{workDir}" } + } + ], + "params": { + "extensionPath": "ext", + "object": "ChartOfCharacteristicTypes.ВидыСубконто ;; ChartOfAccounts.Хозрасчетный ;; ChartOfCalculationTypes.ОсновныеНачисления ;; AccountingRegister.Хозрасчетный ;; CalculationRegister.Начисления ;; BusinessProcess.Согласование" + } +} diff --git a/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/AccountingRegisters/Хозрасчетный.xml b/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/AccountingRegisters/Хозрасчетный.xml new file mode 100644 index 00000000..bc5f8c31 --- /dev/null +++ b/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/AccountingRegisters/Хозрасчетный.xml @@ -0,0 +1,426 @@ + + + + + + UUID-002 + UUID-003 + + + UUID-004 + UUID-005 + + + UUID-006 + UUID-007 + + + UUID-008 + UUID-009 + + + UUID-010 + UUID-011 + + + UUID-012 + UUID-013 + + + UUID-014 + UUID-015 + + + + Хозрасчетный + + + ru + Хозрасчетный + + + + true + false + ChartOfAccounts.Хозрасчетный + false + 0 + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + AccountingRegister.Хозрасчетный.StandardAttribute.Account + 1 + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + AccountingRegister.Хозрасчетный.StandardAttribute.Account + 2 + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + AccountingRegister.Хозрасчетный.StandardAttribute.Account + 3 + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + Managed + true + Use + + + + + + + + Сумма + + + ru + Сумма + + + + + xs:decimal + + 15 + 2 + Any + + + false + + + + false + + false + false + + + DontCheck + Items + + + Auto + Auto + + + Auto + true + + + Use + + + + + \ No newline at end of file diff --git a/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/AccountingRegisters/Хозрасчетный/Ext/RecordSetModule.bsl b/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/AccountingRegisters/Хозрасчетный/Ext/RecordSetModule.bsl new file mode 100644 index 00000000..e69de29b diff --git a/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/BusinessProcesses/Согласование.xml b/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/BusinessProcesses/Согласование.xml new file mode 100644 index 00000000..ace70616 --- /dev/null +++ b/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/BusinessProcesses/Согласование.xml @@ -0,0 +1,264 @@ + + + + + + UUID-002 + UUID-003 + + + UUID-004 + UUID-005 + + + UUID-006 + UUID-007 + + + UUID-008 + UUID-009 + + + UUID-010 + UUID-011 + + + UUID-012 + UUID-013 + + + + Согласование + + + ru + Согласование + + + + true + InDialog + + BusinessProcess.Согласование.StandardAttribute.Number + + DontUse + Begin + Directly + DontUse + + + + + + + Auto + String + 11 + Variable + true + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + true + + Nonperiodical + + true + + Managed + false + Use + + + + + + DontUse + false + false + + + + \ No newline at end of file diff --git a/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/BusinessProcesses/Согласование/Ext/Flowchart.xml b/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/BusinessProcesses/Согласование/Ext/Flowchart.xml new file mode 100644 index 00000000..ca7a2f53 --- /dev/null +++ b/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/BusinessProcesses/Согласование/Ext/Flowchart.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/BusinessProcesses/Согласование/Ext/ObjectModule.bsl b/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/BusinessProcesses/Согласование/Ext/ObjectModule.bsl new file mode 100644 index 00000000..e69de29b diff --git a/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/CalculationRegisters/Начисления.xml b/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/CalculationRegisters/Начисления.xml new file mode 100644 index 00000000..de054e94 --- /dev/null +++ b/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/CalculationRegisters/Начисления.xml @@ -0,0 +1,391 @@ + + + + + + UUID-002 + UUID-003 + + + UUID-004 + UUID-005 + + + UUID-006 + UUID-007 + + + UUID-008 + UUID-009 + + + UUID-010 + UUID-011 + + + UUID-012 + UUID-013 + + + UUID-014 + UUID-015 + + + + Начисления + + + ru + Начисления + + + + true + + + Month + false + false + + + + ChartOfCalculationTypes.ОсновныеНачисления + false + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + Managed + Use + + + + + + + + Результат + + + ru + Результат + + + + + xs:decimal + + 15 + 2 + Any + + + false + + + + false + + false + false + + + DontCheck + Items + + + Auto + Auto + + + Auto + Use + + + + + \ No newline at end of file diff --git a/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/CalculationRegisters/Начисления/Ext/RecordSetModule.bsl b/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/CalculationRegisters/Начисления/Ext/RecordSetModule.bsl new file mode 100644 index 00000000..e69de29b diff --git a/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/ChartsOfAccounts/Хозрасчетный.xml b/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/ChartsOfAccounts/Хозрасчетный.xml new file mode 100644 index 00000000..b9dc8324 --- /dev/null +++ b/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/ChartsOfAccounts/Хозрасчетный.xml @@ -0,0 +1,209 @@ + + + + + + UUID-002 + UUID-003 + + + UUID-004 + UUID-005 + + + UUID-006 + UUID-007 + + + UUID-008 + UUID-009 + + + UUID-010 + UUID-011 + + + UUID-012 + UUID-013 + + + UUID-014 + UUID-015 + + + + Хозрасчетный + + + ru + Хозрасчетный + + + + true + false + + ChartOfCharacteristicTypes.ВидыСубконто + 3 + + 9 + 25 + WholeChartOfAccounts + true + AsCode + + + + + + + Виды субконто + + + + + DontCheck + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + ShowError + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + + Auto + InDialog + false + BothWays + + ChartOfAccounts.Хозрасчетный.StandardAttribute.Description + ChartOfAccounts.Хозрасчетный.StandardAttribute.Code + + Begin + DontUse + Directly + DontUse + Auto + + + + + + + true + 9 + + Managed + Use + DontUse + false + false + + + + + + + + + \ No newline at end of file diff --git a/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/ChartsOfAccounts/Хозрасчетный/Ext/ObjectModule.bsl b/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/ChartsOfAccounts/Хозрасчетный/Ext/ObjectModule.bsl new file mode 100644 index 00000000..e69de29b diff --git a/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/ChartsOfCalculationTypes/ОсновныеНачисления.xml b/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/ChartsOfCalculationTypes/ОсновныеНачисления.xml new file mode 100644 index 00000000..396f37c0 --- /dev/null +++ b/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/ChartsOfCalculationTypes/ОсновныеНачисления.xml @@ -0,0 +1,379 @@ + + + + + + UUID-002 + UUID-003 + + + UUID-004 + UUID-005 + + + UUID-006 + UUID-007 + + + UUID-008 + UUID-009 + + + UUID-010 + UUID-011 + + + UUID-012 + UUID-013 + + + UUID-014 + UUID-015 + + + UUID-016 + UUID-017 + + + UUID-018 + UUID-019 + + + UUID-020 + UUID-021 + + + UUID-022 + UUID-023 + + + + ОсновныеНачисления + + + ru + Основные начисления + + + + true + 5 + 100 + String + Variable + AsDescription + InDialog + false + BothWays + + ChartOfCalculationTypes.ОсновныеНачисления.StandardAttribute.Description + ChartOfCalculationTypes.ОсновныеНачисления.StandardAttribute.Code + + Begin + DontUse + Directly + DontUse + Auto + + + + + + + + DontUse + + false + + + + + + + Ведущие виды расчета + + + + + DontCheck + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + ShowError + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + + + + + Вытесняющие виды расчета + + + + + DontCheck + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + ShowError + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + + + + + Базовые виды расчета + + + + + DontCheck + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + ShowError + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + + Auto + false + + Managed + Use + + + + + + DontUse + false + false + + + + \ No newline at end of file diff --git a/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/ChartsOfCalculationTypes/ОсновныеНачисления/Ext/ObjectModule.bsl b/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/ChartsOfCalculationTypes/ОсновныеНачисления/Ext/ObjectModule.bsl new file mode 100644 index 00000000..e69de29b diff --git a/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/ChartsOfCharacteristicTypes/ВидыСубконто.xml b/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/ChartsOfCharacteristicTypes/ВидыСубконто.xml new file mode 100644 index 00000000..8ec9363f --- /dev/null +++ b/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/ChartsOfCharacteristicTypes/ВидыСубконто.xml @@ -0,0 +1,97 @@ + + + + + + UUID-002 + UUID-003 + + + UUID-004 + UUID-005 + + + UUID-006 + UUID-007 + + + UUID-008 + UUID-009 + + + UUID-010 + UUID-011 + + + UUID-012 + UUID-013 + + + + ВидыСубконто + + + ru + Виды субконто + + + + true + false + + + xs:string + + 50 + Variable + + + false + true + 9 + Variable + 100 + WholeCharacteristicKind + true + true + AsDescription + + Auto + InDialog + false + BothWays + + ChartOfCharacteristicTypes.ВидыСубконто.StandardAttribute.Description + ChartOfCharacteristicTypes.ВидыСубконто.StandardAttribute.Code + + DontUse + Begin + Directly + DontUse + Auto + + + + + + + + + + + + + Managed + Use + + + + + + DontUse + false + false + + + + \ No newline at end of file diff --git a/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/ChartsOfCharacteristicTypes/ВидыСубконто/Ext/ObjectModule.bsl b/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/ChartsOfCharacteristicTypes/ВидыСубконто/Ext/ObjectModule.bsl new file mode 100644 index 00000000..e69de29b diff --git a/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/Configuration.xml b/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/Configuration.xml new file mode 100644 index 00000000..a0ab6a04 --- /dev/null +++ b/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/Configuration.xml @@ -0,0 +1,257 @@ + + + + + + UUID-002 + UUID-003 + + + UUID-004 + UUID-005 + + + UUID-006 + UUID-007 + + + UUID-008 + UUID-009 + + + UUID-010 + UUID-011 + + + UUID-012 + UUID-013 + + + UUID-014 + UUID-015 + + + + TestConfig + + + ru + TestConfig + + + + + Version8_3_24 + ManagedApplication + + PlatformApplication + + Russian + + + + + false + false + false + + + + + + + + + + + + + + + + + + + + + + Biometrics + true + + + Location + false + + + BackgroundLocation + false + + + BluetoothPrinters + false + + + WiFiPrinters + false + + + Contacts + false + + + Calendars + false + + + PushNotifications + false + + + LocalNotifications + false + + + InAppPurchases + false + + + PersonalComputerFileExchange + false + + + Ads + false + + + NumberDialing + false + + + CallProcessing + false + + + CallLog + false + + + AutoSendSMS + false + + + ReceiveSMS + false + + + SMSLog + false + + + Camera + false + + + Microphone + false + + + MusicLibrary + false + + + PictureAndVideoLibraries + false + + + AudioPlaybackAndVibration + false + + + BackgroundAudioPlaybackAndVibration + false + + + InstallPackages + false + + + OSBackup + true + + + ApplicationUsageStatistics + false + + + BarcodeScanning + false + + + BackgroundAudioRecording + false + + + AllFilesAccess + false + + + Videoconferences + false + + + NFC + false + + + DocumentScanning + false + + + SpeechToText + false + + + Geofences + false + + + IncomingShareRequests + false + + + AllIncomingShareRequestsTypesProcessing + false + + + + + + Normal + + + Language.Русский + + + + + + Managed + NotAutoFree + DontUse + DontUse + TaxiEnableVersion8_2 + DontUse + Version8_3_24 + + + + Русский + ВидыСубконто + Хозрасчетный + ОсновныеНачисления + Хозрасчетный + Начисления + Согласование + + + \ No newline at end of file diff --git a/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/Ext/AccountingRegisters/Хозрасчетный.xml b/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/Ext/AccountingRegisters/Хозрасчетный.xml new file mode 100644 index 00000000..f7f8fc22 --- /dev/null +++ b/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/Ext/AccountingRegisters/Хозрасчетный.xml @@ -0,0 +1,42 @@ + + + + + + UUID-002 + UUID-003 + + + UUID-004 + UUID-005 + + + UUID-006 + UUID-007 + + + UUID-008 + UUID-009 + + + UUID-010 + UUID-011 + + + UUID-012 + UUID-013 + + + UUID-014 + UUID-015 + + + + Adopted + Хозрасчетный + + UUID-016 + + + + \ No newline at end of file diff --git a/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/Ext/BusinessProcesses/Согласование.xml b/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/Ext/BusinessProcesses/Согласование.xml new file mode 100644 index 00000000..8a3a1da0 --- /dev/null +++ b/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/Ext/BusinessProcesses/Согласование.xml @@ -0,0 +1,38 @@ + + + + + + UUID-002 + UUID-003 + + + UUID-004 + UUID-005 + + + UUID-006 + UUID-007 + + + UUID-008 + UUID-009 + + + UUID-010 + UUID-011 + + + UUID-012 + UUID-013 + + + + Adopted + Согласование + + UUID-014 + + + + \ No newline at end of file diff --git a/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/Ext/CalculationRegisters/Начисления.xml b/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/Ext/CalculationRegisters/Начисления.xml new file mode 100644 index 00000000..60405b37 --- /dev/null +++ b/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/Ext/CalculationRegisters/Начисления.xml @@ -0,0 +1,42 @@ + + + + + + UUID-002 + UUID-003 + + + UUID-004 + UUID-005 + + + UUID-006 + UUID-007 + + + UUID-008 + UUID-009 + + + UUID-010 + UUID-011 + + + UUID-012 + UUID-013 + + + UUID-014 + UUID-015 + + + + Adopted + Начисления + + UUID-016 + + + + \ No newline at end of file diff --git a/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/Ext/ChartsOfAccounts/Хозрасчетный.xml b/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/Ext/ChartsOfAccounts/Хозрасчетный.xml new file mode 100644 index 00000000..531f31f3 --- /dev/null +++ b/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/Ext/ChartsOfAccounts/Хозрасчетный.xml @@ -0,0 +1,42 @@ + + + + + + UUID-002 + UUID-003 + + + UUID-004 + UUID-005 + + + UUID-006 + UUID-007 + + + UUID-008 + UUID-009 + + + UUID-010 + UUID-011 + + + UUID-012 + UUID-013 + + + UUID-014 + UUID-015 + + + + Adopted + Хозрасчетный + + UUID-016 + + + + \ No newline at end of file diff --git a/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/Ext/ChartsOfCalculationTypes/ОсновныеНачисления.xml b/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/Ext/ChartsOfCalculationTypes/ОсновныеНачисления.xml new file mode 100644 index 00000000..19d22cfe --- /dev/null +++ b/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/Ext/ChartsOfCalculationTypes/ОсновныеНачисления.xml @@ -0,0 +1,58 @@ + + + + + + UUID-002 + UUID-003 + + + UUID-004 + UUID-005 + + + UUID-006 + UUID-007 + + + UUID-008 + UUID-009 + + + UUID-010 + UUID-011 + + + UUID-012 + UUID-013 + + + UUID-014 + UUID-015 + + + UUID-016 + UUID-017 + + + UUID-018 + UUID-019 + + + UUID-020 + UUID-021 + + + UUID-022 + UUID-023 + + + + Adopted + ОсновныеНачисления + + UUID-024 + + + + \ No newline at end of file diff --git a/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/Ext/ChartsOfCharacteristicTypes/ВидыСубконто.xml b/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/Ext/ChartsOfCharacteristicTypes/ВидыСубконто.xml new file mode 100644 index 00000000..f5650f30 --- /dev/null +++ b/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/Ext/ChartsOfCharacteristicTypes/ВидыСубконто.xml @@ -0,0 +1,38 @@ + + + + + + UUID-002 + UUID-003 + + + UUID-004 + UUID-005 + + + UUID-006 + UUID-007 + + + UUID-008 + UUID-009 + + + UUID-010 + UUID-011 + + + UUID-012 + UUID-013 + + + + Adopted + ВидыСубконто + + UUID-014 + + + + \ No newline at end of file diff --git a/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/Ext/ClientApplicationInterface.xml b/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/Ext/ClientApplicationInterface.xml new file mode 100644 index 00000000..3c1161b2 --- /dev/null +++ b/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/Ext/ClientApplicationInterface.xml @@ -0,0 +1,18 @@ + + + + + UUID-002 + + + + + UUID-004 + + + + + + + + \ No newline at end of file diff --git a/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/Ext/Configuration.xml b/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/Ext/Configuration.xml new file mode 100644 index 00000000..070445d1 --- /dev/null +++ b/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/Ext/Configuration.xml @@ -0,0 +1,77 @@ + + + + + + UUID-002 + UUID-003 + + + UUID-004 + UUID-005 + + + UUID-006 + UUID-007 + + + UUID-008 + UUID-009 + + + UUID-010 + UUID-011 + + + UUID-012 + UUID-013 + + + UUID-014 + UUID-015 + + + + Adopted + Тест + + + ru + Тест + + + + Customization + true + Тест_ + Version8_3_24 + ManagedApplication + + PlatformApplication + + Russian + + Role.Тест_ОсновнаяРоль + + + + Language.Русский + + + + + + TaxiEnableVersion8_2 + + + Русский + Тест_ОсновнаяРоль + ВидыСубконто + Хозрасчетный + Хозрасчетный + ОсновныеНачисления + Начисления + Согласование + + + \ No newline at end of file diff --git a/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/Ext/Languages/Русский.xml b/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/Ext/Languages/Русский.xml new file mode 100644 index 00000000..c21624f5 --- /dev/null +++ b/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/Ext/Languages/Русский.xml @@ -0,0 +1,13 @@ + + + + + + Adopted + Русский + + UUID-002 + ru + + + \ No newline at end of file diff --git a/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/Ext/Roles/Тест_ОсновнаяРоль.xml b/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/Ext/Roles/Тест_ОсновнаяРоль.xml new file mode 100644 index 00000000..ec9dfbaf --- /dev/null +++ b/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/Ext/Roles/Тест_ОсновнаяРоль.xml @@ -0,0 +1,10 @@ + + + + + Тест_ОсновнаяРоль + + + + + \ No newline at end of file diff --git a/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/Languages/Русский.xml b/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/Languages/Русский.xml new file mode 100644 index 00000000..37c60d78 --- /dev/null +++ b/tests/skills/cases/cfe-borrow/snapshots/gentypes-full/Languages/Русский.xml @@ -0,0 +1,16 @@ + + + + + Русский + + + ru + Русский + + + + ru + + + \ No newline at end of file diff --git a/tests/skills/check-type-maps.mjs b/tests/skills/check-type-maps.mjs index 035e87c4..ac4cf824 100644 --- a/tests/skills/check-type-maps.mjs +++ b/tests/skills/check-type-maps.mjs @@ -26,6 +26,8 @@ const SPEC = join(ROOT, 'docs', '1c-configuration-spec.md'); // 'order' — список типов: порядок обязан совпадать с порядком таблицы // 'keys' — ключи обязаны быть каноническими именами (значения свои) // 'alias' — значения обязаны быть каноническими именами (ключи — вокабуляр навыка) +// 'gentypes' — тип → набор GeneratedType (префикс+категория), сверка с таблицей §2.5 +// 'gencats' — то же, но карта хранит только категории (префиксов в ней нет) // exclude: { Тип: 'причина' } — тип, которого в карте нет намеренно. Без причины → WARN. // extraTargets — не-ChildObjects имена, законные для alias-карты (вложенные сущности и т. п.) @@ -69,6 +71,31 @@ const MAPS = [ { skill: 'cfe-borrow', file: 'cfe-borrow', kind: 'alias', py: 'SYNONYM_MAP', ps1: '$synonymMap' }, { skill: 'cfe-patch-method', file: 'cfe-patch-method', kind: 'alias', py: 'DIR_TO_TYPE', ps1: '$script:dirToType' }, + // наборы GeneratedType (эталон — таблица §2.5). Ишью 64: у cfe-borrow молча не хватало + // категории Characteristic у ПВХ — платформа отвергала заимствованную оболочку, а сверять + // было не с чем: карта категорий живёт в трёх навыках, и две из них были правы. + { + skill: 'cfe-borrow', file: 'cfe-borrow', kind: 'gentypes', + py: 'GENERATED_TYPES', ps1: '$script:generatedTypes', + }, + { + skill: 'meta-compile', file: 'meta-compile', kind: 'gentypes', + py: 'generated_types', ps1: '$script:generatedTypes', + exclude: { + IntegrationService: '', + }, + }, + { + skill: 'meta-validate', file: 'meta-validate', kind: 'gencats', + py: 'generated_type_categories', ps1: '$generatedTypeCategories', + exclude: { + IntegrationService: '', + Sequence: 'в $structuralOnlyTypes — навык проверяет такие объекты только структурно (root/uuid/Name)', + FilterCriterion: 'в $structuralOnlyTypes — только структурная проверка', + SettingsStorage: 'в $structuralOnlyTypes — только структурная проверка', + WSReference: 'в $structuralOnlyTypes — только структурная проверка', + }, + }, { // Частичная карта тип→каталог: перехватывать метод можно только у объектов с модулями, // поэтому полнота не требуется. Плюс прощающий ввод — ключом принимается и имя каталога @@ -91,7 +118,23 @@ function readSpec() { order.push(type); dirOf.set(type, r[3].replace(/\/$/, '')); } - return { order, dirOf }; + return { order, dirOf, genTypes: readGenTypes(text) }; +} + +// Таблица §2.5 «InternalInfo объектов — наборы GeneratedType»: строка вида +// | `Catalog` | `CatalogObject`/Object, `CatalogRef`/Ref, … | +// Сокращение `…X` в префиксе разворачивается в `<Тип>X` (так записано в самой таблице). +function readGenTypes(text) { + const section = text.slice(text.indexOf('### 2.5.'), text.indexOf('## 3. ConfigDumpInfo')); + const genTypes = new Map(); + for (const row of section.matchAll(/^\|\s*`(\w+)`\s*\|\s*(`[^|]+)\|/gm)) { + const type = row[1]; + const pairs = [...row[2].matchAll(/`([\w…]+)`\/(\w+)/g)] + .map(([, prefix, category]) => [prefix.replace('…', type), category]); + if (pairs.length) genTypes.set(type, pairs); + } + if (genTypes.size < 20) throw new Error(`Таблица GeneratedType не распознана в ${SPEC} (типов: ${genTypes.size})`); + return genTypes; } // ─── Извлечение карт ──────────────────────────────────────────────────────── @@ -133,6 +176,46 @@ function extractPs1(text, name, kind) { return [...body.matchAll(/"([^"]+)"\s*=\s*"([^"]*)"/g)].map((x) => [x[1], x[2]]); } +// Карты GeneratedType вложены на два уровня (тип → список пар), поэтому плоские extractPy/extractPs1 +// к ним не применимы: нужен разбор по блокам типа. Возвращаем Map<тип, [[префикс, категория], …]>; +// для 'gencats' префикс неизвестен и остаётся null. +function extractGen(text, name, kind, lang) { + const isPs1 = lang === 'ps1'; + const head = isPs1 + ? new RegExp(`^\\s*${name.replace(/[$]/g, '\\$')}\\s*=\\s*@\\{`, 'm') + : new RegExp(`^\\s*${name}\\s*=\\s*\\{`, 'm'); + const m = head.exec(text); + if (!m) return null; + const body = sliceBlock(text, m.index + m[0].length - 1, isPs1 ? '{' : '{', '}'); + if (body === null) return null; + + // .py-порты навыков расходятся стилем кавычек (meta-compile — одинарные, cfe-borrow — двойные), + // поэтому в py-ветке принимаем оба. + const typeHead = isPs1 ? /^\s*"(\w+)"\s*=\s*@\(/ : /^\s*['"](\w+)['"]\s*:\s*\[/; + const pairRe = isPs1 + ? /prefix\s*=\s*"(\w+)";\s*category\s*=\s*"(\w+)"/ + : /['"]prefix['"]:\s*['"](\w+)['"],\s*['"]category['"]:\s*['"](\w+)['"]/; + + const out = new Map(); + let cur = null; + for (const line of body.split('\n')) { + const h = typeHead.exec(line); + if (h) { + cur = h[1]; + out.set(cur, []); + if (kind === 'gencats') { + // категории лежат в той же строке: "Catalog" = @("Object","Ref",…) + for (const c of line.slice(h[0].length).matchAll(/"(\w+)"/g)) out.get(cur).push([null, c[1]]); + } + continue; + } + if (!cur || kind === 'gencats') continue; + const p = pairRe.exec(line); + if (p) out.get(cur).push([p[1], p[2]]); + } + return out; +} + function readSkill(skill, file, ext) { const p = join(SKILLS, skill, 'scripts', `${file}.${ext}`); if (!existsSync(p)) return null; @@ -153,6 +236,12 @@ for (const entry of MAPS) { if (!name) continue; const text = readSkill(entry.skill, entry.file, lang === 'py' ? 'py' : 'ps1'); if (text === null) continue; + + if (entry.kind === 'gentypes' || entry.kind === 'gencats') { + checkGenTypes(entry, lang, text, name); + continue; + } + const data = lang === 'py' ? extractPy(text, name, entry.kind) : extractPs1(text, name, entry.kind); if (data === null) { errors.push(`${entry.skill}.${name} [${lang}]: карта не найдена — реестр протух`); @@ -221,6 +310,51 @@ for (const entry of MAPS) { } } +// Сверка набора GeneratedType с таблицей §2.5. Сравниваем СОСТАВ, не порядок: порядок в типовых +// выгрузках стабилен, но на загрузку не влияет (ишью 64: вставка Characteristic в середину набора +// заимствованной оболочки принята платформой), а карты навыков исторически расходятся порядком. +function checkGenTypes(entry, lang, text, name) { + const tag = `${entry.skill}.${name} [${lang}]`; + const data = extractGen(text, name, entry.kind, lang); + if (data === null) { + errors.push(`${tag}: карта не найдена — реестр протух`); + return; + } + if (data.size === 0) { + errors.push(`${tag}: карта извлеклась пустой — сломан разбор формата`); + return; + } + seen.push({ tag, count: data.size }); + + const withPrefix = entry.kind === 'gentypes'; + const key = ([prefix, category]) => (withPrefix ? `${prefix}/${category}` : category); + + for (const [type, pairs] of data) { + const want = spec.genTypes.get(type); + if (!want) { + errors.push(`${tag}: тип '${type}' отсутствует в таблице GeneratedType спецификации`); + continue; + } + const have = new Set(pairs.map(key)); + for (const w of want.map(key)) { + if (!have.has(w)) errors.push(`${tag}: у '${type}' нет '${w}' — в таблице он есть`); + } + for (const h of have) { + if (!want.map(key).includes(h)) errors.push(`${tag}: у '${type}' лишний '${h}' — в таблице его нет`); + } + } + + const exclude = entry.exclude || {}; + for (const type of spec.genTypes.keys()) { + if (data.has(type)) continue; + if (Object.prototype.hasOwnProperty.call(exclude, type)) { + if (!exclude[type]) warns.push(`${tag}: тип '${type}' исключён без причины`); + continue; + } + errors.push(`${tag}: тип '${type}' есть в таблице GeneratedType, но отсутствует в карте`); + } +} + function checkMissing(tag, present, exclude) { for (const type of spec.order) { if (present.has(type)) continue;