diff --git a/.claude/skills/mxl-compile/SKILL.md b/.claude/skills/mxl-compile/SKILL.md
index ce2d473f..adc1486f 100644
--- a/.claude/skills/mxl-compile/SKILL.md
+++ b/.claude/skills/mxl-compile/SKILL.md
@@ -55,7 +55,7 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/mxl-compile.ps1" -J
```
{ columns, page, defaultWidth, columnWidths, columnStyles,
- fonts: { name: { face, size, bold, italic, underline, strikeout } },
+ fonts: { name: { face, size, bold, italic, underline, strikeout } | { ref } },
styles: { name: { font, horizontalAlignment, verticalAlignment, textPlacement,
backColor, textColor, border, borderColor, format, hidden } },
areas: [{ name, columnSet, rows: [{ height, hidden, rowStyle, cells: [
diff --git a/.claude/skills/mxl-compile/reference/dsl-spec.md b/.claude/skills/mxl-compile/reference/dsl-spec.md
index 670fe81f..ef379cf3 100644
--- a/.claude/skills/mxl-compile/reference/dsl-spec.md
+++ b/.claude/skills/mxl-compile/reference/dsl-spec.md
@@ -230,9 +230,12 @@ XML не возвращается.
- объединения, не привязанные к ячейке (по всей высоте или ширине документа);
- рисунки и картинки, в том числе штрихкоды, и примечания к ячейкам;
- группировки строк и колонок;
-- колонтитулы, параметры печати, область печати;
-- объявление языков макета: список языков и текущий язык всегда описываются как русский —
- сами надписи при этом сохраняются на всех языках.
+- колонтитулы, параметры печати, область печати.
Пересборка макета из DSL — это полная перегенерация, а не точечная правка XML, поэтому
diff после round-trip обычно шире фактической доработки.
+
+Отдельно про побайтовое совпадение. В макетах, которые долго правили в Конфигураторе,
+встречаются следы прежних состояний: формат ячейки может нести ширину колонки, которая с тех
+пор изменилась. Такие значения не описывают итоговый документ и из него не выводятся, поэтому
+собранный XML совпадёт с исходным не всегда — при полностью сохранённом содержании.
diff --git a/docs/1c-spreadsheet-spec.md b/docs/1c-spreadsheet-spec.md
index 1a199688..dd471e61 100644
--- a/docs/1c-spreadsheet-spec.md
+++ b/docs/1c-spreadsheet-spec.md
@@ -63,6 +63,18 @@
```
+Языков бывает несколько, и объявленный набор НЕ выводится из того, на каких языках лежит
+текст ячеек: на корпусе ERP объявлен один `ru` у 10 753 макетов, при том что текст в них
+лежит и под `ru`, и под `en`. Наборы: `[ru]` — 10 753, `[ru,en]` — 148, `[en,ru]` — 20.
+
+`id` и `code` всегда со значением; `description` бывает пустым и тогда пишется
+самозакрывающимся тегом `` (77 записей из 11 094). Из `id` эти поля не
+выводятся: у `en` описание бывает «Английский», пустым и «English».
+
+`currentLanguage` иногда отсутствует вовсе (3 макета), иногда указывает на необъявленный
+язык (8 макетов с `en` при объявленном одном `ru`). `defaultLanguage` во всех четырёх
+русских типовых равен `ru`, но это свойство конфигурации, а не формата.
+
## Колонки
### Основной набор
@@ -169,6 +181,16 @@
На корпусе ERP из 1 212 023 записанных номеров ни один не избыточен (счётчик начинается с −1,
поэтому у ячейки в колонке 0 номера тоже нет).
+У текста ячейки ТРИ состояния, а не два:
+
+| запись | смысл |
+|---|---|
+| `` отсутствует | текста нет |
+| `` с элементами | текст по элементу на язык (содержимое бывает пустым) |
+| `` | тег есть, языков в нём нет |
+
+Третье — не редкость: 38 075 ячеек на 1200 макетов, встречается в 57% макетов корпуса.
+
`0` означает, что формата у ячейки **нет вовсе** — это не индекс записи. Так записана
ячейка без собственного оформления: 170 710 таких ячеек против 50 635, ссылающихся на формат
по умолчанию; `0` встречается в 71% макетов.
@@ -365,10 +387,38 @@
-
+
+
+
+
```
+`kind` выводится из префикса ссылки: `style:` → `StyleItem`, `sys:` → `WindowsFont`.
+На корпусе ERP таких шрифтов 272 в 213 макетах из 10 924 (StyleItem 209, WindowsFont 63).
+
+Шрифт, на который не ссылается ни один формат, в палитру не попадает: у макета без
+оформления элемента `` нет вовсе.
+
+## Устройство палитр
+
+Три правила, общие для всех палитр. Все проверены на корпусе ERP (10 924 макета) и на
+макетах, собранных вручную в Конфигураторе.
+
+**Порядок — документный.** Записи идут в том порядке, в каком встречаются при обходе
+документа сверху вниз: сначала форматы колонок (в порядке колонок), затем форматы строк и
+ячеек. Порядок НЕ зависит от того, в какой последовательности автор оформлял макет:
+контрольный опыт с оформлением снизу вверх дал палитру в порядке строк.
+
+**Формат по умолчанию — последняя запись.** На корпусе он последний в 8285 макетах из 10 863,
+первым — в 25.
+
+**Палитра форматов дедуплицирована по содержимому:** двух одинаковых записей в ней нет
+(10 804 макета из 10 924). Остальные 120 — накопленный мусор редактирования, там доходит до
+583 записей при 130 уникальных.
+
## Форматы
Палитра форматов — центральный элемент. **Индексация 1-based** (индекс 0 = формат не задан).
diff --git a/docs/mxl-dsl-spec.md b/docs/mxl-dsl-spec.md
index 00142e3e..5be9fe46 100644
--- a/docs/mxl-dsl-spec.md
+++ b/docs/mxl-dsl-spec.md
@@ -230,9 +230,12 @@ XML не возвращается.
- объединения, не привязанные к ячейке (по всей высоте или ширине документа);
- рисунки и картинки, в том числе штрихкоды, и примечания к ячейкам;
- группировки строк и колонок;
-- колонтитулы, параметры печати, область печати;
-- объявление языков макета: список языков и текущий язык всегда описываются как русский —
- сами надписи при этом сохраняются на всех языках.
+- колонтитулы, параметры печати, область печати.
Пересборка макета из DSL — это полная перегенерация, а не точечная правка XML, поэтому
diff после round-trip обычно шире фактической доработки.
+
+Отдельно про побайтовое совпадение. В макетах, которые долго правили в Конфигураторе,
+встречаются следы прежних состояний: формат ячейки может нести ширину колонки, которая с тех
+пор изменилась. Такие значения не описывают итоговый документ и из него не выводятся, поэтому
+собранный XML совпадёт с исходным не всегда — при полностью сохранённом содержании.