mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-07-19 17:19:42 +03:00
fix(skd-compile): DataSetUnion inner items оборачиваются как <item>
Платформенный 1С пишет вложенные dataSets внутри DataSetUnion как <item xsi:type="DataSetQuery">, а наш compile эмитил <dataSet xsi:type=...>. Это вело к двум проблемам: - сгенерированный XML отличался от платформенного (косметика для bit-perfect) - skd-decompile симметрично искал <dataSet> и пропускал inner items при чтении реальных схем — теряя все вложенные fields/titles Эталон: upload/erf/ПроверкаЭкранирования/.../Templates/СКД_Объединение показывает что Designer всегда пишет <item xsi:type="..."> внутри Union. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
# skd-compile v1.38 — Compile 1C DCS from JSON
|
# skd-compile v1.39 — Compile 1C DCS from JSON
|
||||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||||
param(
|
param(
|
||||||
[string]$DefinitionFile,
|
[string]$DefinitionFile,
|
||||||
@@ -989,7 +989,7 @@ function Emit-Field {
|
|||||||
|
|
||||||
# === DataSets ===
|
# === DataSets ===
|
||||||
function Emit-DataSet {
|
function Emit-DataSet {
|
||||||
param($ds, [string]$indent)
|
param($ds, [string]$indent, [string]$tagName = "dataSet")
|
||||||
|
|
||||||
# Determine type
|
# Determine type
|
||||||
if ($ds.items) {
|
if ($ds.items) {
|
||||||
@@ -1000,7 +1000,7 @@ function Emit-DataSet {
|
|||||||
$dsType = "DataSetQuery"
|
$dsType = "DataSetQuery"
|
||||||
}
|
}
|
||||||
|
|
||||||
X "$indent<dataSet xsi:type=`"$dsType`">"
|
X "$indent<$tagName xsi:type=`"$dsType`">"
|
||||||
X "$indent`t<name>$(Esc-Xml "$($ds.name)")</name>"
|
X "$indent`t<name>$(Esc-Xml "$($ds.name)")</name>"
|
||||||
|
|
||||||
# Fields
|
# Fields
|
||||||
@@ -1027,12 +1027,12 @@ function Emit-DataSet {
|
|||||||
X "$indent`t<objectName>$(Esc-Xml "$($ds.objectName)")</objectName>"
|
X "$indent`t<objectName>$(Esc-Xml "$($ds.objectName)")</objectName>"
|
||||||
} elseif ($dsType -eq "DataSetUnion") {
|
} elseif ($dsType -eq "DataSetUnion") {
|
||||||
foreach ($item in $ds.items) {
|
foreach ($item in $ds.items) {
|
||||||
# Union items are nested dataSets
|
# Union inner items are wrapped as <item xsi:type="...">
|
||||||
Emit-DataSet -ds $item -indent "$indent`t" | Out-Null
|
Emit-DataSet -ds $item -indent "$indent`t" -tagName "item" | Out-Null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
X "$indent</dataSet>"
|
X "$indent</$tagName>"
|
||||||
}
|
}
|
||||||
|
|
||||||
function Emit-DataSets {
|
function Emit-DataSets {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
# skd-compile v1.38 — Compile 1C DCS from JSON
|
# skd-compile v1.39 — Compile 1C DCS from JSON
|
||||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||||
import argparse
|
import argparse
|
||||||
import json
|
import json
|
||||||
@@ -759,7 +759,7 @@ def emit_field(lines, field_def, indent):
|
|||||||
|
|
||||||
# === DataSets ===
|
# === DataSets ===
|
||||||
|
|
||||||
def emit_data_set(lines, ds, indent, default_source):
|
def emit_data_set(lines, ds, indent, default_source, tag_name='dataSet'):
|
||||||
# Determine type
|
# Determine type
|
||||||
if ds.get('items'):
|
if ds.get('items'):
|
||||||
ds_type = 'DataSetUnion'
|
ds_type = 'DataSetUnion'
|
||||||
@@ -768,7 +768,7 @@ def emit_data_set(lines, ds, indent, default_source):
|
|||||||
else:
|
else:
|
||||||
ds_type = 'DataSetQuery'
|
ds_type = 'DataSetQuery'
|
||||||
|
|
||||||
lines.append(f'{indent}<dataSet xsi:type="{ds_type}">')
|
lines.append(f'{indent}<{tag_name} xsi:type="{ds_type}">')
|
||||||
lines.append(f'{indent}\t<name>{esc_xml(str(ds.get("name", "")))}</name>')
|
lines.append(f'{indent}\t<name>{esc_xml(str(ds.get("name", "")))}</name>')
|
||||||
|
|
||||||
# Fields
|
# Fields
|
||||||
@@ -791,9 +791,10 @@ def emit_data_set(lines, ds, indent, default_source):
|
|||||||
lines.append(f'{indent}\t<objectName>{esc_xml(str(ds["objectName"]))}</objectName>')
|
lines.append(f'{indent}\t<objectName>{esc_xml(str(ds["objectName"]))}</objectName>')
|
||||||
elif ds_type == 'DataSetUnion':
|
elif ds_type == 'DataSetUnion':
|
||||||
for item in ds['items']:
|
for item in ds['items']:
|
||||||
emit_data_set(lines, item, f'{indent}\t', default_source)
|
# Union inner items are wrapped as <item xsi:type="...">
|
||||||
|
emit_data_set(lines, item, f'{indent}\t', default_source, tag_name='item')
|
||||||
|
|
||||||
lines.append(f'{indent}</dataSet>')
|
lines.append(f'{indent}</{tag_name}>')
|
||||||
|
|
||||||
|
|
||||||
def emit_data_sets(lines, defn, default_source):
|
def emit_data_sets(lines, defn, default_source):
|
||||||
|
|||||||
@@ -56,7 +56,7 @@
|
|||||||
</dataSet>
|
</dataSet>
|
||||||
<dataSet xsi:type="DataSetUnion">
|
<dataSet xsi:type="DataSetUnion">
|
||||||
<name>Объединение</name>
|
<name>Объединение</name>
|
||||||
<dataSet xsi:type="DataSetQuery">
|
<item xsi:type="DataSetQuery">
|
||||||
<name>Часть1</name>
|
<name>Часть1</name>
|
||||||
<field xsi:type="DataSetFieldField">
|
<field xsi:type="DataSetFieldField">
|
||||||
<dataPath>Поле</dataPath>
|
<dataPath>Поле</dataPath>
|
||||||
@@ -72,8 +72,8 @@
|
|||||||
</field>
|
</field>
|
||||||
<dataSource>ИсточникДанных1</dataSource>
|
<dataSource>ИсточникДанных1</dataSource>
|
||||||
<query>ВЫБРАТЬ 1 КАК Поле</query>
|
<query>ВЫБРАТЬ 1 КАК Поле</query>
|
||||||
</dataSet>
|
</item>
|
||||||
<dataSet xsi:type="DataSetQuery">
|
<item xsi:type="DataSetQuery">
|
||||||
<name>Часть2</name>
|
<name>Часть2</name>
|
||||||
<field xsi:type="DataSetFieldField">
|
<field xsi:type="DataSetFieldField">
|
||||||
<dataPath>Поле</dataPath>
|
<dataPath>Поле</dataPath>
|
||||||
@@ -89,7 +89,7 @@
|
|||||||
</field>
|
</field>
|
||||||
<dataSource>ИсточникДанных1</dataSource>
|
<dataSource>ИсточникДанных1</dataSource>
|
||||||
<query>ВЫБРАТЬ 2 КАК Поле</query>
|
<query>ВЫБРАТЬ 2 КАК Поле</query>
|
||||||
</dataSet>
|
</item>
|
||||||
</dataSet>
|
</dataSet>
|
||||||
<settingsVariant>
|
<settingsVariant>
|
||||||
<dcsset:name>Основной</dcsset:name>
|
<dcsset:name>Основной</dcsset:name>
|
||||||
|
|||||||
@@ -49,16 +49,16 @@
|
|||||||
<v8:Type xmlns:d5p1="http://v8.1c.ru/8.1/data/enterprise/current-config">d5p1:CatalogRef.Подразделения</v8:Type>
|
<v8:Type xmlns:d5p1="http://v8.1c.ru/8.1/data/enterprise/current-config">d5p1:CatalogRef.Подразделения</v8:Type>
|
||||||
</valueType>
|
</valueType>
|
||||||
</field>
|
</field>
|
||||||
<dataSet xsi:type="DataSetObject">
|
<item xsi:type="DataSetObject">
|
||||||
<name>Часть1</name>
|
<name>Часть1</name>
|
||||||
<dataSource>ИсточникДанных1</dataSource>
|
<dataSource>ИсточникДанных1</dataSource>
|
||||||
<objectName>ДанныеЧасть1</objectName>
|
<objectName>ДанныеЧасть1</objectName>
|
||||||
</dataSet>
|
</item>
|
||||||
<dataSet xsi:type="DataSetObject">
|
<item xsi:type="DataSetObject">
|
||||||
<name>Часть2</name>
|
<name>Часть2</name>
|
||||||
<dataSource>ИсточникДанных1</dataSource>
|
<dataSource>ИсточникДанных1</dataSource>
|
||||||
<objectName>ДанныеЧасть2</objectName>
|
<objectName>ДанныеЧасть2</objectName>
|
||||||
</dataSet>
|
</item>
|
||||||
</dataSet>
|
</dataSet>
|
||||||
<settingsVariant>
|
<settingsVariant>
|
||||||
<dcsset:name>Основной</dcsset:name>
|
<dcsset:name>Основной</dcsset:name>
|
||||||
|
|||||||
Reference in New Issue
Block a user