fix(form-compile): MobileDeviceCommandBarContent с пустым значением (PS array-unwrap + self-closing)

12 форм корпуса несут MobileDeviceCommandBarContent с одним ПУСТЫМ item
(<xr:Value xsi:type="xs:string"/>, не имя). Декомпилятор захватывал
mobileCommandBarContent: [""], но компилятор не эмитил блок:

(1) PS-ловушка: гейт `if ($def.mobileCommandBarContent -and ...)` — одноэлементный
массив @("") в boolean-контексте разворачивается в "" → falsy → блок пропущен.
Фикс: $null-проверка вместо truthy ($null -ne ... -and Count -gt 0).
(2) Пустое значение → самозакрывающийся <xr:Value xsi:type="xs:string"/> (зеркало платформы).

Python не имел unwrap-ловушки ([""] truthy), но self-closing добавлен для байт-паритета
(+ is not None гейт для единообразия).

Выборка 9 форм (РасширенныйВводКонтактнойИнформации, ХранилищеВариантовОтчетов×3,
ФормаНастроекОтчета, ИнтерфейсДокументовЭДО, ПользовательскиеМакетыПечати, …):
match 0→9, TOTAL→0. Регресс 43/43 (ps1+py). Блок именованных значений (148 форм) уже
был сертифицирован; пустой — тот же блок с пустым значением (формат платформы).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-06-13 12:12:51 +03:00
parent a41a6d822b
commit dc56ef6899
2 changed files with 15 additions and 6 deletions
@@ -1,4 +1,4 @@
# form-compile v1.149 — Compile 1C managed form from JSON or object metadata
# form-compile v1.150 — Compile 1C managed form from JSON or object metadata
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
param(
[string]$JsonPath,
@@ -6269,13 +6269,17 @@ if ($def.excludedCommands -and $def.excludedCommands.Count -gt 0) {
# 12c2. MobileDeviceCommandBarContent — форменный список имён командных панелей/кнопок
# (Presentation пустой, CheckState=0, тип xs:string — константы; варьируется только имя-Value).
if ($def.mobileCommandBarContent -and @($def.mobileCommandBarContent).Count -gt 0) {
# $null-проверка (не truthy): одноэлементный массив с пустой строкой @("") разворачивается
# в boolean-контексте в "" → falsy; 12 форм корпуса несут один пустой item (Value="").
if ($null -ne $def.mobileCommandBarContent -and @($def.mobileCommandBarContent).Count -gt 0) {
X "`t<MobileDeviceCommandBarContent>"
foreach ($nm in @($def.mobileCommandBarContent)) {
X "`t`t<xr:Item>"
X "`t`t`t<xr:Presentation/>"
X "`t`t`t<xr:CheckState>0</xr:CheckState>"
X "`t`t`t<xr:Value xsi:type=`"xs:string`">$(Esc-Xml "$nm")</xr:Value>"
# пустое значение → самозакрывающийся тег (зеркало платформы)
if ([string]::IsNullOrEmpty("$nm")) { X "`t`t`t<xr:Value xsi:type=`"xs:string`"/>" }
else { X "`t`t`t<xr:Value xsi:type=`"xs:string`">$(Esc-Xml "$nm")</xr:Value>" }
X "`t`t</xr:Item>"
}
X "`t</MobileDeviceCommandBarContent>"
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
# form-compile v1.149 — Compile 1C managed form from JSON or object metadata
# form-compile v1.150 — Compile 1C managed form from JSON or object metadata
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
import copy
@@ -6163,13 +6163,18 @@ def main():
# MobileDeviceCommandBarContent — форменный список имён командных панелей/кнопок
# (Presentation пустой, CheckState=0, тип xs:string — константы; варьируется только имя-Value).
if defn.get('mobileCommandBarContent') and len(defn['mobileCommandBarContent']) > 0:
# 12 форм корпуса несут один пустой item (Value="") — список присутствует, но не пуст по len.
if defn.get('mobileCommandBarContent') is not None and len(defn['mobileCommandBarContent']) > 0:
lines.append('\t<MobileDeviceCommandBarContent>')
for nm in defn['mobileCommandBarContent']:
lines.append('\t\t<xr:Item>')
lines.append('\t\t\t<xr:Presentation/>')
lines.append('\t\t\t<xr:CheckState>0</xr:CheckState>')
lines.append(f'\t\t\t<xr:Value xsi:type="xs:string">{esc_xml(str(nm))}</xr:Value>')
# пустое значение → самозакрывающийся тег (зеркало платформы)
if not str(nm):
lines.append('\t\t\t<xr:Value xsi:type="xs:string"/>')
else:
lines.append(f'\t\t\t<xr:Value xsi:type="xs:string">{esc_xml(str(nm))}</xr:Value>')
lines.append('\t\t</xr:Item>')
lines.append('\t</MobileDeviceCommandBarContent>')