diff --git a/.claude/skills/mxl-validate/scripts/mxl-validate.ps1 b/.claude/skills/mxl-validate/scripts/mxl-validate.ps1 index 635eb05a..1d4365c1 100644 --- a/.claude/skills/mxl-validate/scripts/mxl-validate.ps1 +++ b/.claude/skills/mxl-validate/scripts/mxl-validate.ps1 @@ -434,6 +434,19 @@ for ($i = 0; $i -lt $formatNodes.Count; $i++) { if ($ctl -and ($controlGuids -notcontains $ctl.InnerText.Trim().ToLowerInvariant())) { Report-Warn "Format ${num}: unknown controlType $($ctl.InnerText.Trim())" } + # Флажок Конфигуратор предлагает только для булева и числа. Движок принимает его на любом + # типе (проверено сборкой EPF и обратной выгрузкой), поэтому это предупреждение, а не ошибка: + # собрать такую ячейку в Конфигураторе нельзя, и почти наверняка это описка. + if ($ctl -and $ctl.InnerText.Trim().ToLowerInvariant() -ceq $controlGuids[1] -and $vt) { + $kinds = @() + foreach ($child in $vt.ChildNodes) { + if ($child.NodeType -ne [System.Xml.XmlNodeType]::Element) { continue } + if ($child.get_LocalName() -ceq 'Type') { $kinds += $child.InnerText.Trim() } + } + if (-not (($kinds.Count -eq 1) -and ($kinds[0] -ceq 'xs:boolean' -or $kinds[0] -ceq 'xs:decimal'))) { + Report-Warn "Format ${num}: checkbox control on a type other than Boolean or Number" + } + } } if ($valueFormatIdx.Count -gt 0) { diff --git a/.claude/skills/mxl-validate/scripts/mxl-validate.py b/.claude/skills/mxl-validate/scripts/mxl-validate.py index 390731a1..0217f8a1 100644 --- a/.claude/skills/mxl-validate/scripts/mxl-validate.py +++ b/.claude/skills/mxl-validate/scripts/mxl-validate.py @@ -422,6 +422,13 @@ def main(): ctl = fmt.find(f'{{{NS_D}}}controlType') if ctl is not None and (ctl.text or '').strip().lower() not in control_guids: r.warn(f'Format {i}: unknown controlType {(ctl.text or "").strip()}') + # Флажок Конфигуратор предлагает только для булева и числа. Движок принимает его на + # любом типе (проверено сборкой EPF и обратной выгрузкой), поэтому это предупреждение, + # а не ошибка: собрать такую ячейку в Конфигураторе нельзя, и почти наверняка это описка. + if ctl is not None and (ctl.text or '').strip().lower() == control_guids[1] and vt is not None: + kinds = [(t.text or '').strip() for t in vt if t.tag.endswith('}Type')] + if kinds != ['xs:boolean'] and kinds != ['xs:decimal']: + r.warn(f'Format {i}: checkbox control on a type other than Boolean or Number') if value_format_idx: for ri in root.findall(f'{{{NS_D}}}rowsItem'): diff --git a/docs/1c-spreadsheet-spec.md b/docs/1c-spreadsheet-spec.md index 58300992..a4f270cb 100644 --- a/docs/1c-spreadsheet-spec.md +++ b/docs/1c-spreadsheet-spec.md @@ -557,6 +557,10 @@ pictureSizeMode · picHorizontalAlignment · picVerticalAlignment · textPositio У 90 форматов (22 макета регламентированной отчётности, явно машинно-сгенерированных) тега `` нет вовсе. +Флажок Конфигуратор предлагает **только для Булево и Числа**. Ограничение при этом чисто +интерфейсное: макет с флажком у строки и у даты платформа принимает и возвращает GUID дословно +(проверено сборкой EPF и обратной выгрузкой через базу — ни отказа, ни нормализации). + **Структура ``** — то же описание типов, что в метаданных: сначала все `` и `` в порядке источника, затем блоки квалификаторов в порядке Number → String → Date. Голая категория без имени объекта (`CatalogRef`, `AnyRef`) — это ``, а не ``. diff --git a/tests/skills/cases/mxl-validate/snapshots/warn-checkbox-on-string/Template.xml b/tests/skills/cases/mxl-validate/snapshots/warn-checkbox-on-string/Template.xml new file mode 100644 index 00000000..52f33fc0 --- /dev/null +++ b/tests/skills/cases/mxl-validate/snapshots/warn-checkbox-on-string/Template.xml @@ -0,0 +1,82 @@ + + + + ru + ru + + ru + Русский + Русский + + + + 3 + + + 0 + + + + 1 + + + + + 2 + + + + + 3 + + + + + true + 4 + 1 + 1 + + Проверка + + Rows + 0 + 0 + -1 + -1 + + + + true + + xs:boolean + + 35af3d93-d7c7-4a2e-a8eb-bac87a1a3f26 + + + true + + xs:decimal + + 10 + 2 + Any + + + 35af3d93-d7c7-4a2e-a8eb-bac87a1a3f26 + + + true + + xs:string + + 10 + Variable + + + 35af3d93-d7c7-4a2e-a8eb-bac87a1a3f26 + + + 10 + + \ No newline at end of file diff --git a/tests/skills/cases/mxl-validate/warn-checkbox-on-string.json b/tests/skills/cases/mxl-validate/warn-checkbox-on-string.json new file mode 100644 index 00000000..d55e6276 --- /dev/null +++ b/tests/skills/cases/mxl-validate/warn-checkbox-on-string.json @@ -0,0 +1,28 @@ +{ + "name": "Предупреждение: флажок у типа, отличного от булева и числа", + "preRun": [ + { + "script": "mxl-compile/scripts/mxl-compile", + "input": { + "columns": 3, + "areas": [ + { + "name": "Проверка", + "rows": [ + { "cells": [ + { "col": 1, "valueType": "Boolean", "controlType": "checkbox" }, + { "col": 2, "valueType": "Number(10,2)", "controlType": "checkbox" }, + { "col": 3, "valueType": "String(10)", "controlType": "checkbox" } + ]} + ] + } + ] + }, + "args": { "-JsonPath": "{inputFile}", "-OutputPath": "Template.xml" }, + "cwd": "{workDir}" + } + ], + "params": { "templatePath": "Template.xml" }, + "args_extra": ["-Detailed"], + "expect": { "stdoutContains": "checkbox control on a type other than Boolean or Number" } +}