feat(mxl-compile,mxl-decompile,mxl-validate): примечания к ячейкам

Ключ ячейки note описывает всплывающую подсказку: строкой, объектом
языков или полной формой с оформлением, признаком авторазмера и
геометрией окошка.

Из четырнадцати тегов, которые платформа пишет в примечание, настоящей
информации несут пять. drawingType, pictureSize и id — константы на всём
корпусе. Якорь конца это координаты самой ячейки (1087 примечаний из
1087), якорь начала — 1/1 (1085 из 1087, три исключения в одном макете
берёт раундтрип-ключ anchor). Остаётся текст, стиль, autoSize и четыре
смещения, причём autoSize описывает не наличие геометрии, а пересчёт
размера: при true координаты всё равно записаны и осмысленны.

Стиль примечания — обычная запись палитры; без своего стиля пишем тот,
что даёт Конфигуратор (926 примечаний корпуса из 1087). Формат
примечания добавлен в сбор именованных стилей декомпилятора и в перечень
владельцев формата: иначе стиль подсказки вырезался как неиспользуемый и
ссылка оставалась висячей.

mxl-validate: индекс формата примечания проверяется наравне с ячейкой,
строкой и колонкой.

Стенд СПримечанием собирается байт в байт обоими портами и добавлен в
платформенные фикстуры.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-08-15 14:47:23 +03:00
co-authored by Claude Opus 5
parent faa8ab7659
commit 4005f36cce
17 changed files with 1071 additions and 14 deletions
+37
View File
@@ -601,6 +601,43 @@ current-config не объявляет, поэтому вынести объяв
обратные, ячейки продолжают ссылаться на записи со старыми ширинами. Из итогового XML это
значение не выводится — воспроизводить его не нужно.
## Примечание к ячейке
```xml
<note>
<drawingType>Comment</drawingType>
<id>0</id>
<formatIndex>1</formatIndex>
<text><v8:item><v8:lang>ru</v8:lang><v8:content>тест</v8:content></v8:item></text>
<beginRow>1</beginRow> <beginRowOffset>-21</beginRowOffset>
<endRow>0</endRow> <endRowOffset>51</endRowOffset>
<beginColumn>1</beginColumn> <beginColumnOffset>21</beginColumnOffset>
<endColumn>0</endColumn> <endColumnOffset>408</endColumnOffset>
<autoSize>true</autoSize>
<pictureSize>Stretch</pictureSize>
</note>
```
Конструкция редкая (188 макетов, 1 087 примечаний), но структура жёсткая: все четырнадцать тегов
присутствуют у всех 1 087, порядок один и тот же, опциональных нет. Информации при этом меньше,
чем тегов:
| Тег | Наблюдение |
|---|---|
| `drawingType`, `pictureSize`, `id` | константы: `Comment`, `Stretch`, `0` |
| `beginRow`, `beginColumn` | всегда `1`/`1` — 1085 и 1086 из 1087; три исключения в одном макете |
| `endRow`, `endColumn` | **координаты самой ячейки** — 1087 из 1087 |
| четыре смещения | авторские: сдвиг окошка меняет `begin*Offset`, растяжение — `end*Offset` |
| `autoSize` | `true` у 1036 из 1087 |
`autoSize` описывает не наличие геометрии, а пересчёт размера: при `true` окошко всё равно несёт
координаты, и они осмысленны — 306 различных пар `(endRowOffset, endColumnOffset)` против
12 различных пар положения.
Формат примечания — обычная запись палитры, на корпусе их всего 7 различных: 926 — стиль
подсказки (`verticalAlignment: Top` + `style:ToolTipTextColor` + `style:ToolTipBackColor`),
105 — он же с заливкой `#FFFAD9`.
## Ресурсы картинок
```xml
+31 -1
View File
@@ -188,6 +188,7 @@
| `controlType` | нет | `input` | Элемент управления поля ввода: `input` или `checkbox`. Только вместе с `valueType` |
| `value` | нет | — | Значение в поле ввода. Только вместе с `valueType` |
| `control` | нет | — | Настройки элемента управления в записи платформы (base64). Раундтрип, не для ручного авторинга |
| `note` | нет | — | Примечание к ячейке (см. ниже) |
### Содержимое ячейки
@@ -270,6 +271,35 @@
включая `Boolean`. Флажок задаётся явно. Значение `"none"` (тега элемента управления нет вовсе) —
форма раундтрипа, для ручного авторинга не нужна.
## Примечание к ячейке
Всплывающая подсказка, которую платформа показывает при наведении. Задаётся ключом `note`
строкой, объектом «язык → текст» или полной формой:
```json
{ "col": 1, "text": "Итого", "note": "Сумма без НДС" }
{ "col": 2, "note": { "ru": "на дату документа", "en": "as of the document date" } }
{ "col": 3, "note": { "text": "не более 20%", "style": "жёлтая-подсказка" } }
{ "col": 4, "note": { "text": "…", "autoSize": false,
"box": { "top": 58, "left": -175, "bottom": 362, "right": 478 } } }
```
Объект трактуется по ключам — так же, как текст ячейки в короткой форме строки: есть ключ
примечания (`text`, `style`, `box`, `autoSize`, `anchor`) → это описание примечания, иначе ключи
считаются идентификаторами языков.
| Поле | По умолч. | Описание |
|------|-----------|----------|
| `text` | — | Текст подсказки: строка или объект «язык → текст» |
| `style` | стиль подсказки | Имя стиля из `styles`; без него — оформление, которое даёт Конфигуратор |
| `autoSize` | `true` | Подгонять ли размер окошка под текст |
| `box` | канонический | Смещения окошка: `top`, `left` — положение, `bottom`, `right` — размер |
| `anchor` | `{ row: 1, col: 1 }` | Якорь начала окошка. Раундтрип, не для ручного авторинга |
Координаты ячейки в примечании не задаются — платформа привязывает конец окошка к самой ячейке,
и компилятор проставляет это сам. `autoSize` и `box` независимы: при автоподгоне размера
положение окошка всё равно хранится.
## `rowStyle` — оформление строки
Стиль применяется ко ВСЕЙ ширине строки: позиции без явных ячеек получают тот же стиль. Так в табличных строках получаются сплошные рамки. Он же становится оформлением самой строки — именно так платформа хранит строку, оформленную целиком.
@@ -285,7 +315,7 @@ round-trip** (`/mxl-decompile` → `/mxl-compile`): в JSON оно не попа
XML не возвращается.
- объединения, не привязанные к ячейке (по всей высоте или ширине документа);
- рисунки и картинки, в том числе штрихкоды, и примечания к ячейкам;
- рисунки и картинки, в том числе штрихкоды;
- группировки строк и колонок;
- колонтитулы, параметры печати, область печати.