From c6384ff753cd071727628ffb17b9179ce2f62faa Mon Sep 17 00:00:00 2001 From: Mikhail Date: Fri, 14 Aug 2026 13:02:01 +0300 Subject: [PATCH] Decode SCD grouping nodes --- plugins/1c/connector/adapter_1c_server.py | 2 +- plugins/1c/parser/scd_payload.py | 3 ++- tests/1c/test_payload_codec.py | 5 ++++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/plugins/1c/connector/adapter_1c_server.py b/plugins/1c/connector/adapter_1c_server.py index ed4b683..adcbd1f 100644 --- a/plugins/1c/connector/adapter_1c_server.py +++ b/plugins/1c/connector/adapter_1c_server.py @@ -36113,7 +36113,7 @@ def scd_inspect(payload: dict[str, Any]) -> dict[str, Any]: if not report: return invalid_argument(method, "report", "report is required as a public 1C report name.") schema_name = str(payload.get("schema") or "").strip() - requested_sections = payload.get("sections") or ["data_sources", "parameters", "datasets", "fields", "calculated_fields", "resources", "settings", "variants", "total_fields"] + requested_sections = payload.get("sections") or ["data_sources", "parameters", "datasets", "fields", "calculated_fields", "resources", "groupings", "settings", "variants", "total_fields"] if not isinstance(requested_sections, list) or not all(isinstance(item, str) for item in requested_sections): return invalid_argument(method, "sections", "sections must be an array of strings.") resolve_metadata, resolve_metadata_error = strict_bool_argument(payload, "resolve_metadata", method=method, default=True) diff --git a/plugins/1c/parser/scd_payload.py b/plugins/1c/parser/scd_payload.py index c4a1a04..c12330a 100644 --- a/plugins/1c/parser/scd_payload.py +++ b/plugins/1c/parser/scd_payload.py @@ -175,7 +175,7 @@ def inspect_scd_payload(data: bytes, *, sections: list[str] | None = None) -> di synthesized from report code or form attributes. """ - requested = sections or ["data_sources", "parameters", "datasets", "fields", "calculated_fields", "resources", "settings", "variants", "total_fields"] + requested = sections or ["data_sources", "parameters", "datasets", "fields", "calculated_fields", "resources", "groupings", "settings", "variants", "total_fields"] root, container = xml_from_scd_payload(data) if root is None: return {"status": "partial", "container": container, "sections": {name: [] for name in requested}} @@ -208,6 +208,7 @@ def inspect_scd_payload(data: bytes, *, sections: list[str] | None = None) -> di "fields": {"field"}, "calculated_fields": {"calculatedField"}, "resources": {"resource"}, + "groupings": {"group"}, "settings": {"settings", "Settings"}, "variants": {"settingsVariant", "variant"}, "total_fields": {"totalField"}, diff --git a/tests/1c/test_payload_codec.py b/tests/1c/test_payload_codec.py index 260a325..de03188 100644 --- a/tests/1c/test_payload_codec.py +++ b/tests/1c/test_payload_codec.py @@ -219,6 +219,7 @@ def test_scd_payload_decoder_reads_xml_after_platform_prefix() -> None: Сумма СуммаСНалогомСумма * 1.2 СуммаСумма + Период Сумма Основной """ @@ -232,6 +233,7 @@ def test_scd_payload_decoder_reads_xml_after_platform_prefix() -> None: assert result["sections"]["parameters"] == [{"name": "Период", "source": {"kind": "scd_xml", "path": "/dataCompositionSchema[1]/parameter"}, "value_type": "xs:dateTime"}] assert result["sections"]["datasets"][0]["query"] == "ВЫБРАТЬ &Период КАК Период // &Скрытый КАК Скрытый" assert result["sections"]["calculated_fields"][0]["expression"] == "Сумма * 1.2" + assert result["sections"]["groupings"] == [{"name": "Период", "source": {"kind": "scd_xml", "path": "/dataCompositionSchema[1]/group"}}] assert result["sections"]["variants"][0]["name"] == "Основной" assert result["analysis"]["query_parameter_references"] == [{"dataset": "ОсновнойНабор", "parameters": ["Период"]}] assert result["analysis"]["schema_outline"] == { @@ -241,12 +243,13 @@ def test_scd_payload_decoder_reads_xml_after_platform_prefix() -> None: {"tag": "dataSet", "count": 1, "paths": ["/dataCompositionSchema[1]/dataSet"]}, {"tag": "dataSource", "count": 1, "paths": ["/dataCompositionSchema[1]/dataSource"]}, {"tag": "field", "count": 2, "paths": ["/dataCompositionSchema[1]/field", "/dataCompositionSchema[1]/field[2]"]}, + {"tag": "group", "count": 1, "paths": ["/dataCompositionSchema[1]/group"]}, {"tag": "parameter", "count": 1, "paths": ["/dataCompositionSchema[1]/parameter"]}, {"tag": "resource", "count": 1, "paths": ["/dataCompositionSchema[1]/resource"]}, {"tag": "settingsVariant", "count": 1, "paths": ["/dataCompositionSchema[1]/settingsVariant"]}, {"tag": "totalField", "count": 1, "paths": ["/dataCompositionSchema[1]/totalField"]}, ], - "all_tag_counts": {"calculatedField": 1, "dataCompositionSchema": 1, "dataPath": 2, "dataSet": 1, "dataSource": 1, "dataSourceType": 1, "expression": 2, "field": 2, "name": 6, "parameter": 1, "query": 1, "resource": 1, "settingsVariant": 1, "totalField": 1, "valueType": 1}, + "all_tag_counts": {"calculatedField": 1, "dataCompositionSchema": 1, "dataPath": 2, "dataSet": 1, "dataSource": 1, "dataSourceType": 1, "expression": 2, "field": 2, "group": 1, "name": 6, "parameter": 1, "query": 1, "resource": 1, "settingsVariant": 1, "totalField": 1, "valueType": 1}, } assert result["analysis"]["referenced_not_declared_in_schema"] == [] assert result["analysis"]["total_field_references"] == {"fields": ["Сумма"], "missing_from_declared_fields": [], "status": "checked"}