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
+
+
+