diff --git a/.claude/skills/form-compile/scripts/form-compile.ps1 b/.claude/skills/form-compile/scripts/form-compile.ps1 index 84011099..d4a95cbd 100644 --- a/.claude/skills/form-compile/scripts/form-compile.ps1 +++ b/.claude/skills/form-compile/scripts/form-compile.ps1 @@ -1,4 +1,4 @@ -# form-compile v1.121 — Compile 1C managed form from JSON or object metadata +# form-compile v1.122 — Compile 1C managed form from JSON or object metadata # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [string]$JsonPath, @@ -1742,6 +1742,11 @@ function Emit-FilterItem { X "$indent`t`t$(Esc-Xml $variant)" if ($hasDate) { X "$indent`t`t$(Esc-Xml $dateV)" } X "$indent`t" + } elseif ("$($item.value)" -eq '_') { + # "_" — маркер пустого значения: платформа эмитит пустой self-closing + # (напр. — сравнение с незаданным полем). + $vt = if ($item.valueType) { "$($item.valueType)" } else { 'xs:string' } + X "$indent`t" } elseif ($null -ne $item.value) { $vt = if ($item.valueType) { "$($item.valueType)" } else { "" } if (-not $vt) { diff --git a/.claude/skills/form-compile/scripts/form-compile.py b/.claude/skills/form-compile/scripts/form-compile.py index 635120e9..82489d99 100644 --- a/.claude/skills/form-compile/scripts/form-compile.py +++ b/.claude/skills/form-compile/scripts/form-compile.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# form-compile v1.121 — Compile 1C managed form from JSON or object metadata +# form-compile v1.122 — Compile 1C managed form from JSON or object metadata # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import copy @@ -1483,6 +1483,11 @@ def emit_filter_item(lines, item, indent): if date_v is not None: lines.append(f'{indent}\t\t{esc_xml(str(date_v))}') lines.append(f'{indent}\t') + elif str(val) == '_': + # "_" — маркер пустого значения: платформа эмитит пустой self-closing + # (напр. — сравнение с незаданным полем). + vt = str(item['valueType']) if item.get('valueType') else 'xs:string' + lines.append(f'{indent}\t') elif val is not None: vt = _value_type_for(val, item.get('valueType')) v_str = str(val).lower() if isinstance(val, bool) else esc_xml(str(val)) diff --git a/tests/skills/cases/form-compile/input-fields.json b/tests/skills/cases/form-compile/input-fields.json index 606274bf..9b9ce1fa 100644 --- a/tests/skills/cases/form-compile/input-fields.json +++ b/tests/skills/cases/form-compile/input-fields.json @@ -77,7 +77,8 @@ { "filter": ["ЧисловоеПоле = 1"], "appearance": { "Текст": { "field": "ОбычноеПоле" } } }, { "filter": [{ "field": "ДатаПоля", "op": "=", "value": "3999-12-31T23:59:59" }], "appearance": { "ЦветТекста": "web:Gray" } }, { "filter": ["ДатаПоля > 2020-01-01T00:00:00"], "appearance": { "ЦветТекста": "web:Olive" } }, - { "filter": [{ "field": "ДатаПоля", "op": ">=", "value": "BeginningOfThisDay", "valueType": "v8:StandardBeginningDate" }], "appearance": { "ЦветТекста": "web:Silver" } } + { "filter": [{ "field": "ДатаПоля", "op": ">=", "value": "BeginningOfThisDay", "valueType": "v8:StandardBeginningDate" }], "appearance": { "ЦветТекста": "web:Silver" } }, + { "filter": [{ "field": "ОбычноеПоле", "op": "=", "value": "_", "valueType": "dcscor:Field" }], "appearance": { "ЦветТекста": "web:Maroon" } } ] } } diff --git a/tests/skills/cases/form-compile/snapshots/input-fields/DataProcessors/ПоляВвода/Forms/Форма/Ext/Form.xml b/tests/skills/cases/form-compile/snapshots/input-fields/DataProcessors/ПоляВвода/Forms/Форма/Ext/Form.xml index 05b50d80..737594da 100644 --- a/tests/skills/cases/form-compile/snapshots/input-fields/DataProcessors/ПоляВвода/Forms/Форма/Ext/Form.xml +++ b/tests/skills/cases/form-compile/snapshots/input-fields/DataProcessors/ПоляВвода/Forms/Форма/Ext/Form.xml @@ -776,6 +776,22 @@ + + + + + ОбычноеПоле + Equal + + + + + + ЦветТекста + web:Maroon + + +