From 2ab1b5bc1444e61d1824bd5139b3b9717a047c33 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Thu, 11 Jun 2026 21:02:17 +0300 Subject: [PATCH] =?UTF-8?q?feat(form-compile):=20=D0=BF=D1=83=D1=81=D1=82?= =?UTF-8?q?=D0=BE=D0=B5=20=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=20=D1=84=D0=B8=D0=BB=D1=8C=D1=82=D1=80=D0=B0=20"=5F"=20?= =?UTF-8?q?=E2=86=92=20self-closing=20=20(=D0=B0=20=D0=BD?= =?UTF-8?q?=D0=B5=20=D0=BB=D0=B8=D1=82=D0=B5=D1=80=D0=B0=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D1=8B=D0=B9=20=5F)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Маркер пустого значения "_" (Get-FilterValue для пустого ) эмитился компилятором как литеральный `_` (_) в объектной форме фильтра (когда форсится valueType/userSettingPresentation). Платформа хранит self-closing пустой тег (напр. сравнение с незаданным полем dcscor:Field, или пустой xs:string). Фикс: value=="_" → (vt из valueType или xs:string). Зеркало py. Формы ОтправкиОтчетности/ФормаЭлемента (dcscor:Field) → match; чинит и Новости (xs:string пустой в object-форме). Кейс input-fields (+CA фильтр с пустым dcscor:Field) сертифицирован в 1С. Регресс 43/43 (ps1+py). Co-Authored-By: Claude Opus 4.8 (1M context) --- .../skills/form-compile/scripts/form-compile.ps1 | 7 ++++++- .../skills/form-compile/scripts/form-compile.py | 7 ++++++- .../skills/cases/form-compile/input-fields.json | 3 ++- .../ПоляВвода/Forms/Форма/Ext/Form.xml | 16 ++++++++++++++++ 4 files changed, 30 insertions(+), 3 deletions(-) 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 + + +