mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-09-18 15:45:52 +03:00
feat(meta-compile): голые метатипы-категории реквизита → TypeSet (v1.30)
Остаток Attribute>TypeSet после v1.21. Голый метатип без имени объекта (CatalogRef/DocumentRef/EnumRef/9 *Ref + AnyRef/AnyIBRef) означает «любой объект категории» и в XML — <v8:TypeSet>cfg:X</v8:TypeSet>, а компилятор писал <v8:Type>X</v8:Type> (fallback: регексы TypeSet/ref ждали ".имя", голое имя проваливалось). Напр. реквизит типа «любой документ» (DocumentRef) или «любая ссылка» (AnyRef) разворачивался в конкретный Type. Фикс: ветка голых метатипов перед concrete-ref match (ps1+py). Декомпилятор уже отдавал голое имя (Strip-NsPrefix у TypeSet) → не менялся (v0.20). В составном типе — каждый через "+": "DocumentRef + CatalogRef". Корпус (частота голых TypeSet): DocumentRef 25, AnyIBRef 17, AnyRef 13, ExchangePlanRef 10, CatalogRef 9, … Роундтрип 120: match 95→96, TOTAL 158→138 (−20), Attribute>TypeSet=0, новых diff нет. Регресс 46/46 ps1+py, ps1↔py identical. spec §3.2, кейс catalog-attr-typeset-linkbytype (+AnyRef/AnyIBRef/композит DocumentRef+CatalogRef). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
1212cbd9ed
commit
562f4617bc
@@ -1,4 +1,4 @@
|
|||||||
# meta-compile v1.29 — Compile 1C metadata object from JSON
|
# meta-compile v1.30 — Compile 1C metadata object from JSON
|
||||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||||
param(
|
param(
|
||||||
[Parameter(Mandatory)]
|
[Parameter(Mandatory)]
|
||||||
@@ -566,6 +566,12 @@ function Emit-TypeContent {
|
|||||||
X "$indent<v8:TypeSet>cfg:$typeStr</v8:TypeSet>"
|
X "$indent<v8:TypeSet>cfg:$typeStr</v8:TypeSet>"
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
# Голый метатип-категория (CatalogRef/DocumentRef/…/AnyRef/AnyIBRef без имени объекта) — множество
|
||||||
|
# «любой объект категории» → TypeSet (а не конкретный Type с именем).
|
||||||
|
if ($typeStr -match '^(CatalogRef|DocumentRef|EnumRef|ChartOfAccountsRef|ChartOfCharacteristicTypesRef|ChartOfCalculationTypesRef|ExchangePlanRef|BusinessProcessRef|TaskRef|AnyRef|AnyIBRef)$') {
|
||||||
|
X "$indent<v8:TypeSet>cfg:$typeStr</v8:TypeSet>"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
# ValueStorage (ХранилищеЗначения) — канон v8:ValueStorage (не xs:base64Binary, хоть 1С и принимает оба).
|
# ValueStorage (ХранилищеЗначения) — канон v8:ValueStorage (не xs:base64Binary, хоть 1С и принимает оба).
|
||||||
if ($typeStr -eq "ValueStorage") {
|
if ($typeStr -eq "ValueStorage") {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
# meta-compile v1.29 — Compile 1C metadata object from JSON
|
# meta-compile v1.30 — Compile 1C metadata object from JSON
|
||||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
@@ -600,6 +600,11 @@ def emit_type_content(indent, type_str):
|
|||||||
if re.match(r'^(DefinedType|Characteristic)\.(.+)$', type_str):
|
if re.match(r'^(DefinedType|Characteristic)\.(.+)$', type_str):
|
||||||
X(f'{indent}<v8:TypeSet>cfg:{type_str}</v8:TypeSet>')
|
X(f'{indent}<v8:TypeSet>cfg:{type_str}</v8:TypeSet>')
|
||||||
return
|
return
|
||||||
|
# Голый метатип-категория (CatalogRef/DocumentRef/…/AnyRef/AnyIBRef без имени объекта) — множество
|
||||||
|
# «любой объект категории» → TypeSet (а не конкретный Type с именем).
|
||||||
|
if re.match(r'^(CatalogRef|DocumentRef|EnumRef|ChartOfAccountsRef|ChartOfCharacteristicTypesRef|ChartOfCalculationTypesRef|ExchangePlanRef|BusinessProcessRef|TaskRef|AnyRef|AnyIBRef)$', type_str):
|
||||||
|
X(f'{indent}<v8:TypeSet>cfg:{type_str}</v8:TypeSet>')
|
||||||
|
return
|
||||||
# ValueStorage (ХранилищеЗначения) — канон v8:ValueStorage (не xs:base64Binary).
|
# ValueStorage (ХранилищеЗначения) — канон v8:ValueStorage (не xs:base64Binary).
|
||||||
if type_str == 'ValueStorage':
|
if type_str == 'ValueStorage':
|
||||||
X(f'{indent}<v8:Type>v8:ValueStorage</v8:Type>')
|
X(f'{indent}<v8:Type>v8:ValueStorage</v8:Type>')
|
||||||
|
|||||||
@@ -83,10 +83,16 @@ JSON DSL для описания объектов метаданных конф
|
|||||||
| `TaskRef.Xxx` | `cfg:TaskRef.Xxx` |
|
| `TaskRef.Xxx` | `cfg:TaskRef.Xxx` |
|
||||||
| `DefinedType.Xxx` | `cfg:DefinedType.Xxx` (через `v8:TypeSet`) |
|
| `DefinedType.Xxx` | `cfg:DefinedType.Xxx` (через `v8:TypeSet`) |
|
||||||
| `Characteristic.Xxx` | `cfg:Characteristic.Xxx` (через `v8:TypeSet`) |
|
| `Characteristic.Xxx` | `cfg:Characteristic.Xxx` (через `v8:TypeSet`) |
|
||||||
|
| `CatalogRef` / `DocumentRef` / … / `AnyRef` / `AnyIBRef` (голый, без имени) | `cfg:<метатип>` (через `v8:TypeSet`) |
|
||||||
|
|
||||||
**Тип-множество (`v8:TypeSet`)** — тип, подразумевающий набор типов: `DefinedType.Xxx` (Определяемый тип) и
|
**Тип-множество (`v8:TypeSet`)** — тип, подразумевающий набор типов:
|
||||||
`Characteristic.Xxx` (значение Характеристики из ПВХ — «Вид субконто»/доп.реквизит). У реквизита-значения
|
- `DefinedType.Xxx` (Определяемый тип) и `Characteristic.Xxx` (значение Характеристики из ПВХ — «Вид субконто»/
|
||||||
Характеристики тип значения обычно определяется другим реквизитом-Видом — см. `linkByType` (§4.2).
|
доп.реквизит). У реквизита-значения Характеристики тип обычно определяется другим реквизитом-Видом — см. `linkByType` (§4.2).
|
||||||
|
- **Голый метатип-категория** без имени объекта — «любой объект категории»: `CatalogRef` (любой справочник),
|
||||||
|
`DocumentRef`, `EnumRef`, `ChartOfAccountsRef`, `ChartOfCharacteristicTypesRef`, `ChartOfCalculationTypesRef`,
|
||||||
|
`ExchangePlanRef`, `BusinessProcessRef`, `TaskRef`, а также `AnyRef` (любая ссылка) и `AnyIBRef` (любая ссылка ИБ).
|
||||||
|
Отличается от именованного `CatalogRef.Xxx` (конкретный тип через `v8:Type`) отсутствием точки. В составном типе —
|
||||||
|
каждый через `+`: `DocumentRef + CatalogRef`.
|
||||||
|
|
||||||
### 3.3 Русские синонимы типов
|
### 3.3 Русские синонимы типов
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,10 @@
|
|||||||
"linkByType": { "dataPath": "Свойство", "linkItem": 1 } },
|
"linkByType": { "dataPath": "Свойство", "linkItem": 1 } },
|
||||||
{ "name": "ЗначениеОпредТип", "type": "DefinedType.Сумма" },
|
{ "name": "ЗначениеОпредТип", "type": "DefinedType.Сумма" },
|
||||||
{ "name": "СвязьСтрокой", "type": "Characteristic.ВидыСубконто",
|
{ "name": "СвязьСтрокой", "type": "Characteristic.ВидыСубконто",
|
||||||
"linkByType": "Свойство" }
|
"linkByType": "Свойство" },
|
||||||
|
{ "name": "ЛюбаяСсылка", "type": "AnyRef" },
|
||||||
|
{ "name": "ЛюбаяСсылкаИБ", "type": "AnyIBRef" },
|
||||||
|
{ "name": "Основание", "type": "DocumentRef + CatalogRef" }
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"validatePath": "Catalogs/ТестХарактеристик",
|
"validatePath": "Catalogs/ТестХарактеристик",
|
||||||
|
|||||||
+121
@@ -253,6 +253,127 @@
|
|||||||
<DataHistory>Use</DataHistory>
|
<DataHistory>Use</DataHistory>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Attribute>
|
</Attribute>
|
||||||
|
<Attribute uuid="UUID-016">
|
||||||
|
<Properties>
|
||||||
|
<Name>ЛюбаяСсылка</Name>
|
||||||
|
<Synonym>
|
||||||
|
<v8:item>
|
||||||
|
<v8:lang>ru</v8:lang>
|
||||||
|
<v8:content>Любая ссылка</v8:content>
|
||||||
|
</v8:item>
|
||||||
|
</Synonym>
|
||||||
|
<Comment/>
|
||||||
|
<Type>
|
||||||
|
<v8:TypeSet>cfg:AnyRef</v8:TypeSet>
|
||||||
|
</Type>
|
||||||
|
<PasswordMode>false</PasswordMode>
|
||||||
|
<Format/>
|
||||||
|
<EditFormat/>
|
||||||
|
<ToolTip/>
|
||||||
|
<MarkNegatives>false</MarkNegatives>
|
||||||
|
<Mask/>
|
||||||
|
<MultiLine>false</MultiLine>
|
||||||
|
<ExtendedEdit>false</ExtendedEdit>
|
||||||
|
<MinValue xsi:nil="true"/>
|
||||||
|
<MaxValue xsi:nil="true"/>
|
||||||
|
<FillFromFillingValue>false</FillFromFillingValue>
|
||||||
|
<FillValue xsi:nil="true"/>
|
||||||
|
<FillChecking>DontCheck</FillChecking>
|
||||||
|
<ChoiceFoldersAndItems>Items</ChoiceFoldersAndItems>
|
||||||
|
<ChoiceParameterLinks/>
|
||||||
|
<ChoiceParameters/>
|
||||||
|
<QuickChoice>Auto</QuickChoice>
|
||||||
|
<CreateOnInput>Auto</CreateOnInput>
|
||||||
|
<ChoiceForm/>
|
||||||
|
<LinkByType/>
|
||||||
|
<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
|
||||||
|
<Use>ForItem</Use>
|
||||||
|
<Indexing>DontIndex</Indexing>
|
||||||
|
<FullTextSearch>Use</FullTextSearch>
|
||||||
|
<DataHistory>Use</DataHistory>
|
||||||
|
</Properties>
|
||||||
|
</Attribute>
|
||||||
|
<Attribute uuid="UUID-017">
|
||||||
|
<Properties>
|
||||||
|
<Name>ЛюбаяСсылкаИБ</Name>
|
||||||
|
<Synonym>
|
||||||
|
<v8:item>
|
||||||
|
<v8:lang>ru</v8:lang>
|
||||||
|
<v8:content>Любая ссылка иб</v8:content>
|
||||||
|
</v8:item>
|
||||||
|
</Synonym>
|
||||||
|
<Comment/>
|
||||||
|
<Type>
|
||||||
|
<v8:TypeSet>cfg:AnyIBRef</v8:TypeSet>
|
||||||
|
</Type>
|
||||||
|
<PasswordMode>false</PasswordMode>
|
||||||
|
<Format/>
|
||||||
|
<EditFormat/>
|
||||||
|
<ToolTip/>
|
||||||
|
<MarkNegatives>false</MarkNegatives>
|
||||||
|
<Mask/>
|
||||||
|
<MultiLine>false</MultiLine>
|
||||||
|
<ExtendedEdit>false</ExtendedEdit>
|
||||||
|
<MinValue xsi:nil="true"/>
|
||||||
|
<MaxValue xsi:nil="true"/>
|
||||||
|
<FillFromFillingValue>false</FillFromFillingValue>
|
||||||
|
<FillValue xsi:nil="true"/>
|
||||||
|
<FillChecking>DontCheck</FillChecking>
|
||||||
|
<ChoiceFoldersAndItems>Items</ChoiceFoldersAndItems>
|
||||||
|
<ChoiceParameterLinks/>
|
||||||
|
<ChoiceParameters/>
|
||||||
|
<QuickChoice>Auto</QuickChoice>
|
||||||
|
<CreateOnInput>Auto</CreateOnInput>
|
||||||
|
<ChoiceForm/>
|
||||||
|
<LinkByType/>
|
||||||
|
<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
|
||||||
|
<Use>ForItem</Use>
|
||||||
|
<Indexing>DontIndex</Indexing>
|
||||||
|
<FullTextSearch>Use</FullTextSearch>
|
||||||
|
<DataHistory>Use</DataHistory>
|
||||||
|
</Properties>
|
||||||
|
</Attribute>
|
||||||
|
<Attribute uuid="UUID-018">
|
||||||
|
<Properties>
|
||||||
|
<Name>Основание</Name>
|
||||||
|
<Synonym>
|
||||||
|
<v8:item>
|
||||||
|
<v8:lang>ru</v8:lang>
|
||||||
|
<v8:content>Основание</v8:content>
|
||||||
|
</v8:item>
|
||||||
|
</Synonym>
|
||||||
|
<Comment/>
|
||||||
|
<Type>
|
||||||
|
<v8:TypeSet>cfg:DocumentRef</v8:TypeSet>
|
||||||
|
<v8:TypeSet>cfg:CatalogRef</v8:TypeSet>
|
||||||
|
</Type>
|
||||||
|
<PasswordMode>false</PasswordMode>
|
||||||
|
<Format/>
|
||||||
|
<EditFormat/>
|
||||||
|
<ToolTip/>
|
||||||
|
<MarkNegatives>false</MarkNegatives>
|
||||||
|
<Mask/>
|
||||||
|
<MultiLine>false</MultiLine>
|
||||||
|
<ExtendedEdit>false</ExtendedEdit>
|
||||||
|
<MinValue xsi:nil="true"/>
|
||||||
|
<MaxValue xsi:nil="true"/>
|
||||||
|
<FillFromFillingValue>false</FillFromFillingValue>
|
||||||
|
<FillValue xsi:nil="true"/>
|
||||||
|
<FillChecking>DontCheck</FillChecking>
|
||||||
|
<ChoiceFoldersAndItems>Items</ChoiceFoldersAndItems>
|
||||||
|
<ChoiceParameterLinks/>
|
||||||
|
<ChoiceParameters/>
|
||||||
|
<QuickChoice>Auto</QuickChoice>
|
||||||
|
<CreateOnInput>Auto</CreateOnInput>
|
||||||
|
<ChoiceForm/>
|
||||||
|
<LinkByType/>
|
||||||
|
<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
|
||||||
|
<Use>ForItem</Use>
|
||||||
|
<Indexing>DontIndex</Indexing>
|
||||||
|
<FullTextSearch>Use</FullTextSearch>
|
||||||
|
<DataHistory>Use</DataHistory>
|
||||||
|
</Properties>
|
||||||
|
</Attribute>
|
||||||
</ChildObjects>
|
</ChildObjects>
|
||||||
</Catalog>
|
</Catalog>
|
||||||
</MetaDataObject>
|
</MetaDataObject>
|
||||||
|
|||||||
Reference in New Issue
Block a user