diff --git a/.claude/skills/mxl-compile/scripts/mxl-compile.ps1 b/.claude/skills/mxl-compile/scripts/mxl-compile.ps1
index a917a5ed..bcc1de1a 100644
--- a/.claude/skills/mxl-compile/scripts/mxl-compile.ps1
+++ b/.claude/skills/mxl-compile/scripts/mxl-compile.ps1
@@ -1,4 +1,4 @@
-# mxl-compile v1.30 — Compile 1C spreadsheet from JSON
+# mxl-compile v1.31 — Compile 1C spreadsheet from JSON
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
param(
[Parameter(Mandatory)]
@@ -389,7 +389,11 @@ function Build-ColStyleMap {
$map = @{}
if ($styles) {
foreach ($prop in $styles.PSObject.Properties) {
- foreach ($c in (Parse-ColumnSpec $prop.Name)) { $map[$c] = "$($prop.Value)" }
+ # Пустое значение = колонка перечислена, формата у неё нет. Записи для авторинга
+ # в этом смысла нет, поэтому в описании DSL её не показываем — она нужна
+ # декомпилятору, чтобы раундтрип не терял байты.
+ $v = if ($null -eq $prop.Value) { $null } else { "$($prop.Value)" }
+ foreach ($c in (Parse-ColumnSpec $prop.Name)) { $map[$c] = $v }
}
}
return $map
@@ -701,11 +705,18 @@ foreach ($layout in $columnLayouts) {
$cols = @($layout.Widths.Keys) + @($layout.Styles.Keys) | ForEach-Object { [int]$_ } |
Select-Object -Unique | Sort-Object
foreach ($col in $cols) {
+ $styleName = if ($layout.Styles.ContainsKey($col)) { $layout.Styles[$col] } else { $null }
+ # Колонка перечислена без формата вовсе (0): в корпусе так
+ # бывает у 4% макетов. Ноль — не индекс записи, а «формата нет».
+ if (-not $layout.Widths.ContainsKey($col) -and [string]::IsNullOrEmpty($styleName)) {
+ $map[$col] = 0
+ continue
+ }
$props = @{}
- if ($layout.Styles.ContainsKey($col)) {
+ if ($styleName) {
# Шрифт по умолчанию колонке не навязываем: формат колонки без оформления —
# это ровно , как пишет платформа.
- $props = Resolve-Style -styleName $layout.Styles[$col] -fillType "" -noDefaultFont
+ $props = Resolve-Style -styleName $styleName -fillType "" -noDefaultFont
}
if ($layout.Widths.ContainsKey($col)) { $props['width'] = $layout.Widths[$col] }
$map[$col] = Register-Format $props
diff --git a/.claude/skills/mxl-compile/scripts/mxl-compile.py b/.claude/skills/mxl-compile/scripts/mxl-compile.py
index 3bb31b7f..baf1b430 100644
--- a/.claude/skills/mxl-compile/scripts/mxl-compile.py
+++ b/.claude/skills/mxl-compile/scripts/mxl-compile.py
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
-# mxl-compile v1.30 — Compile 1C spreadsheet from JSON
+# mxl-compile v1.31 — Compile 1C spreadsheet from JSON
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
import hashlib
@@ -601,8 +601,12 @@ def main():
out = {}
if styles:
for prop_name, prop_value in styles.items():
+ # Пустое значение = колонка перечислена, формата у неё нет. Записи для
+ # авторинга в этом смысла нет, поэтому в описании DSL её не показываем —
+ # она нужна декомпилятору, чтобы раундтрип не терял байты.
+ v = None if prop_value is None else str(prop_value)
for c in parse_column_spec(prop_name):
- out[c] = str(prop_value)
+ out[c] = v
return out
col_style_map = build_col_style_map(defn.get('columnStyles'))
@@ -778,11 +782,17 @@ def main():
for layout in column_layouts:
fmap = {} # 1-based col -> format index
for col in sorted({int(c) for c in list(layout['Widths']) + list(layout['Styles'])}):
+ style_name = layout['Styles'].get(col)
+ # Колонка перечислена без формата вовсе (0): в корпусе
+ # так бывает у 4% макетов. Ноль — не индекс записи, а «формата нет».
+ if col not in layout['Widths'] and not style_name:
+ fmap[col] = 0
+ continue
props = {}
- if col in layout['Styles']:
+ if style_name:
# Шрифт по умолчанию колонке не навязываем: формат колонки без оформления —
# это ровно , как пишет платформа.
- props = resolve_style(layout['Styles'][col], '', no_default_font=True)
+ props = resolve_style(style_name, '', no_default_font=True)
if col in layout['Widths']:
props['width'] = layout['Widths'][col]
fmap[col] = register_format(props)
diff --git a/.claude/skills/mxl-decompile/scripts/mxl-decompile.ps1 b/.claude/skills/mxl-decompile/scripts/mxl-decompile.ps1
index a1df39bb..b782e59d 100644
--- a/.claude/skills/mxl-decompile/scripts/mxl-decompile.ps1
+++ b/.claude/skills/mxl-decompile/scripts/mxl-decompile.ps1
@@ -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)
diff --git a/.claude/skills/mxl-decompile/scripts/mxl-decompile.py b/.claude/skills/mxl-decompile/scripts/mxl-decompile.py
index 39733cd0..3069322c 100644
--- a/.claude/skills/mxl-decompile/scripts/mxl-decompile.py
+++ b/.claude/skills/mxl-decompile/scripts/mxl-decompile.py
@@ -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)