fix(mxl-compile,mxl-decompile): не терять колонку, объявленную без формата

Платформа иногда перечисляет колонку в раскладке с <formatIndex>0</formatIndex> —
колонка объявлена, формата у неё нет (4% макетов корпуса). Компилятор такие
опускал, декомпилятор их не видел, и элемент терялся целиком.

Выражается пустым значением в columnStyles. Для авторинга это бесполезно —
ни одна задача не звучит как «объяви колонку без свойств», — поэтому в описании
DSL записи нет: она нужна только чтобы раундтрип не терял байты.

На пилоте потери в категории colset[].col[].formatIndex упали с 39 до 35.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-08-11 17:08:03 +03:00
co-authored by Claude Opus 5
parent 4e389d0ef1
commit 3c7f7345bb
4 changed files with 45 additions and 11 deletions
@@ -1,4 +1,4 @@
# mxl-decompile v1.11 — Decompile 1C spreadsheet to JSON
# mxl-decompile v1.12 — Decompile 1C spreadsheet to JSON
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
param(
[Parameter(Mandatory)]
@@ -585,6 +585,12 @@ function Get-ColumnStyles {
$out = [ordered]@{}
foreach ($col in $cs.FmtIdx.Keys) {
$fi = $cs.FmtIdx[$col]
if ($fi -eq 0) {
# Колонка перечислена, формата у неё нет. Для авторинга бесполезно, но без
# этого раундтрип теряет элемент целиком.
$out[$col] = $null
continue
}
$fmt = Get-Format $fi
if ($fmt -and (Get-StyleProps $fmt).Count -gt 0) { $out[$col] = Get-StyleName $fi }
}
@@ -938,7 +944,9 @@ foreach ($a in $dslAreas) {
}
# Стиль бывает не только у ячейки и строки: колонка — третий владелец формата.
foreach ($cs in $columnSets) {
foreach ($name in (Get-ColumnStyles $cs).Values) { $usedStyles[$name] = $true }
foreach ($name in (Get-ColumnStyles $cs).Values) {
if ($name) { $usedStyles[$name] = $true }
}
}
$toRemove = @($styleDefs.Keys | Where-Object { -not $usedStyles.ContainsKey($_) })
foreach ($s in $toRemove) { $styleDefs.Remove($s)
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
# mxl-decompile v1.11 — Decompile 1C spreadsheet to JSON
# mxl-decompile v1.12 — Decompile 1C spreadsheet to JSON
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
@@ -747,6 +747,11 @@ def main():
"""Колонки раскладки, у которых формат несёт не только ширину, — «колонка → стиль»."""
out = OrderedDict()
for col, fi in cs["FmtIdx"].items():
if fi == 0:
# Колонка перечислена, формата у неё нет. Для авторинга бесполезно, но без
# этого раундтрип теряет элемент целиком.
out[col] = None
continue
fmt = get_format(fi)
if fmt and style_props(fmt):
out[col] = get_style_name(fi)