fix(mxl-compile): у неоформленной ячейки формата нет вовсе

Ячейка без собственного оформления ссылалась на формат по умолчанию. Платформа
в этом случае пишет <f>0</f>, где ноль — не индекс записи, а «формата нет»:
на корпусе так у 170 710 ячеек против 50 635, ссылающихся на умолчание, и
<f>0</f> встречается в 71% макетов.

Подтверждено контролируемым стендом: в макете, где колонкам заданы ширины, а
ячейки ничем не оформлены, платформа пишет ячейкам ноль.

На пилоте верхняя категория row[].cell[].fmt упала с 63 900 до 55 855 фактов,
совпадение строк документа выросло с 16.7% до 17.5%.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-08-11 17:32:56 +03:00
co-authored by Claude Opus 5
parent 08503c72e9
commit ccbd488d63
24 changed files with 73 additions and 75 deletions
@@ -1,4 +1,4 @@
# mxl-compile v1.31 — Compile 1C spreadsheet from JSON
# mxl-compile v1.32 — Compile 1C spreadsheet from JSON
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
param(
[Parameter(Mandatory)]
@@ -787,12 +787,11 @@ function Get-FillType {
function Register-CellFormat {
param($styleName, [string]$fillType)
$resolved = Resolve-Style -styleName $styleName -fillType $fillType
# Ячейка без собственного оформления ссылается на формат ПО УМОЛЧАНИЮ — так делает
# платформа: в её палитре у неоформленного макета один формат (ширина колонки), и все
# ячейки указывают на него. Мы же заводили каждой свой формат с <font>0</font>, где ноль
# означает «шрифт не задан», то есть формат был пуст по смыслу.
# У ячейки без собственного оформления формата НЕТ вовсе: <f>0</f>, где ноль — не индекс
# записи, а «формата нет». В корпусе так у 170 710 ячеек против 50 635, ссылающихся на
# формат по умолчанию; <f>0</f> встречается в 71% макетов.
if ($resolved.Count -eq 1 -and $resolved['font'] -eq $fontMap["default"]) {
return $script:defaultFormatIndex
return 0
}
return Register-Format $resolved
}
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
# mxl-compile v1.31 — Compile 1C spreadsheet from JSON
# mxl-compile v1.32 — Compile 1C spreadsheet from JSON
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
import hashlib
@@ -834,12 +834,11 @@ def main():
# Helper: register a cell format and return its index
def register_cell_format(style_name, fill_type):
resolved = resolve_style(style_name, fill_type)
# Ячейка без собственного оформления ссылается на формат ПО УМОЛЧАНИЮ — так делает
# платформа: в её палитре у неоформленного макета один формат (ширина колонки), и все
# ячейки указывают на него. Мы же заводили каждой свой формат с <font>0</font>, где ноль
# означает «шрифт не задан», то есть формат был пуст по смыслу.
# У ячейки без собственного оформления формата НЕТ вовсе: <f>0</f>, где ноль — не
# индекс записи, а «формата нет». В корпусе так у 170 710 ячеек против 50 635,
# ссылающихся на формат по умолчанию; <f>0</f> встречается в 71% макетов.
if len(resolved) == 1 and resolved.get('font') == font_map.get('default', 0):
return default_format_index
return 0
return register_format(resolved)
# --- 5.5. Шорткат строк: строка-массив ячеек ---
@@ -57,7 +57,7 @@
<row>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -68,7 +68,7 @@
</c>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -79,7 +79,7 @@
</c>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -63,7 +63,7 @@
<row>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -17,7 +17,7 @@
<row>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -17,7 +17,7 @@
<row>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -28,7 +28,7 @@
</c>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -39,7 +39,7 @@
</c>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -55,7 +55,7 @@
<row>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -66,7 +66,7 @@
</c>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -77,7 +77,7 @@
</c>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -94,7 +94,7 @@
<c>
<i>1</i>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -105,7 +105,7 @@
</c>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -121,7 +121,7 @@
<row>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -133,7 +133,7 @@
<c>
<i>2</i>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -17,7 +17,7 @@
<row>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -28,7 +28,7 @@
</c>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -39,7 +39,7 @@
</c>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -17,7 +17,7 @@
<row>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -17,7 +17,7 @@
<row>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -28,7 +28,7 @@
</c>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -39,7 +39,7 @@
</c>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -50,7 +50,7 @@
</c>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -17,7 +17,7 @@
<row>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -17,7 +17,7 @@
<row>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -28,7 +28,7 @@
</c>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -40,7 +40,7 @@
<c>
<i>3</i>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -57,7 +57,7 @@
<c>
<i>1</i>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -68,7 +68,7 @@
</c>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -17,7 +17,7 @@
<row>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -28,7 +28,7 @@
</c>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -39,7 +39,7 @@
</c>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -50,7 +50,7 @@
</c>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -17,7 +17,7 @@
<row>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -28,7 +28,7 @@
</c>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -39,7 +39,7 @@
</c>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -17,7 +17,7 @@
<row>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -32,7 +32,7 @@
</c>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -17,7 +17,7 @@
<row>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -28,7 +28,7 @@
</c>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -17,7 +17,7 @@
<row>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -28,7 +28,7 @@
</c>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -39,7 +39,7 @@
</c>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -55,7 +55,7 @@
<row>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -17,7 +17,7 @@
<row>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -28,7 +28,7 @@
</c>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -17,7 +17,7 @@
<row>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -17,7 +17,7 @@
<row>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -32,7 +32,7 @@
</c>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -17,7 +17,7 @@
<row>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -28,7 +28,7 @@
</c>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -39,7 +39,7 @@
</c>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -28,7 +28,7 @@
<row>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -17,7 +17,7 @@
<row>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -28,7 +28,7 @@
</c>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -39,7 +39,7 @@
</c>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -17,7 +17,7 @@
<row>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -44,7 +44,7 @@
<row>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -55,7 +55,7 @@
</c>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -66,7 +66,7 @@
</c>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -17,7 +17,7 @@
<row>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -28,7 +28,7 @@
</c>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -39,7 +39,7 @@
</c>
<c>
<c>
<f>1</f>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>