mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-06-10 16:14:54 +03:00
044bc18974
- New skill /img-grid: overlays numbered grid on images to help
determine column proportions for MXL template generation
- Add "page" field to MXL DSL ("A4-landscape", "A4-portrait", or
number) that auto-calculates defaultWidth from column proportions
- Update DSL spec, mxl-compile SKILL.md, MXL guide, README
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
161 lines
7.6 KiB
Markdown
161 lines
7.6 KiB
Markdown
# Спецификация MXL DSL — JSON-формат описания табличного документа
|
||
|
||
Компактный JSON-формат для описания макетов табличных документов 1С (SpreadsheetDocument). Используется навыками `/mxl-compile` (JSON → XML) и `/mxl-decompile` (XML → JSON).
|
||
|
||
## Пример
|
||
|
||
```json
|
||
{
|
||
"columns": 10,
|
||
"defaultWidth": 30,
|
||
"columnWidths": { "1": 15, "2-8": 40, "9-10": 50 },
|
||
|
||
"fonts": {
|
||
"default": { "face": "Arial", "size": 10 },
|
||
"bold": { "face": "Arial", "size": 10, "bold": true },
|
||
"header": { "face": "Arial", "size": 14, "bold": true }
|
||
},
|
||
|
||
"styles": {
|
||
"default": {},
|
||
"header": { "font": "header", "align": "center" },
|
||
"label": { "font": "bold" },
|
||
"bordered": { "border": "all" },
|
||
"bordered-right": { "border": "all", "align": "right" },
|
||
"total-right": { "font": "bold", "border": "top", "align": "right" }
|
||
},
|
||
|
||
"areas": [
|
||
{
|
||
"name": "Заголовок",
|
||
"rows": [
|
||
{ "height": 20, "cells": [
|
||
{ "col": 1, "span": 10, "style": "header", "param": "ТекстЗаголовка" }
|
||
]}
|
||
]
|
||
},
|
||
{
|
||
"name": "ШапкаТаблицы",
|
||
"rows": [
|
||
{ "rowStyle": "bordered", "cells": [
|
||
{ "col": 1, "text": "№" },
|
||
{ "col": 2, "span": 6, "text": "Наименование" },
|
||
{ "col": 9, "text": "Кол-во" },
|
||
{ "col": 10, "text": "Сумма" }
|
||
]}
|
||
]
|
||
},
|
||
{
|
||
"name": "Строка",
|
||
"rows": [
|
||
{ "rowStyle": "bordered", "cells": [
|
||
{ "col": 1, "param": "НомерСтроки" },
|
||
{ "col": 2, "span": 6, "param": "Товар", "detail": "Номенклатура" },
|
||
{ "col": 9, "style": "bordered-right", "param": "Количество" },
|
||
{ "col": 10, "style": "bordered-right", "param": "Сумма" }
|
||
]}
|
||
]
|
||
},
|
||
{
|
||
"name": "Итого",
|
||
"rows": [
|
||
{ "cells": [
|
||
{ "col": 8, "span": 2, "style": "total-right", "text": "Итого:" },
|
||
{ "col": 10, "style": "total-right", "param": "Всего" }
|
||
]}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
## Верхний уровень
|
||
|
||
| Поле | Обяз. | По умолч. | Описание |
|
||
|------|:-----:|-----------|----------|
|
||
| `columns` | да | — | Количество колонок |
|
||
| `page` | нет | — | Формат страницы: `"A4-landscape"` (780), `"A4-portrait"` (540) или число. Автоматически вычисляет `defaultWidth` из суммы пропорций `"Nx"` |
|
||
| `defaultWidth` | нет | 10 | Ширина колонок по умолчанию. Игнорируется если задан `page` и все колонки используют `"Nx"` |
|
||
| `columnWidths` | нет | `{}` | Ширины колонок. Ключи 1-based: `"1"`, `"3-14"`, `"5,7,9"`. Значения: число (абсолют) или `"Nx"` (множитель от defaultWidth, напр. `"2x"`, `"0.5x"`) |
|
||
| `fonts` | нет | — | Именованные шрифты (если не задано, создаётся Arial 10) |
|
||
| `styles` | нет | `{}` | Именованные стили |
|
||
| `areas` | да | — | Массив именованных областей (порядок = порядок в документе) |
|
||
|
||
## Шрифты (`fonts.<name>`)
|
||
|
||
| Поле | По умолч. | Описание |
|
||
|------|-----------|----------|
|
||
| `face` | `"Arial"` | Имя шрифта |
|
||
| `size` | `10` | Размер |
|
||
| `bold` | `false` | Жирный |
|
||
| `italic` | `false` | Курсив |
|
||
| `underline` | `false` | Подчёркнутый |
|
||
| `strikeout` | `false` | Зачёркнутый |
|
||
|
||
Шрифт `"default"` используется когда стиль не указывает шрифт явно. Если не определён, создаётся автоматически (Arial 10).
|
||
|
||
## Стили (`styles.<name>`)
|
||
|
||
| Поле | По умолч. | Описание |
|
||
|------|-----------|----------|
|
||
| `font` | `"default"` | Ссылка на имя шрифта |
|
||
| `align` | — | `left`, `center`, `right` |
|
||
| `valign` | — | `top`, `center` |
|
||
| `border` | — | Стороны рамки: `all`, `top`, `bottom`, `left`, `right`, `none`. Через запятую: `"top,bottom"` |
|
||
| `borderWidth` | `"thin"` | Толщина рамки: `thin` (1px) или `thick` (2px) |
|
||
| `wrap` | `false` | Перенос текста |
|
||
| `format` | — | Формат данных 1С: `"ЧЦ=15; ЧДЦ=2"`, `"ДФ=dd.MM.yyyy"` и т.д. |
|
||
|
||
## Области (`areas[]`)
|
||
|
||
| Поле | Обяз. | Описание |
|
||
|------|:-----:|----------|
|
||
| `name` | да | Имя области для `Макет.ПолучитьОбласть("Имя")` |
|
||
| `rows` | да | Массив строк |
|
||
|
||
## Строки (`rows[]`)
|
||
|
||
| Поле | По умолч. | Описание |
|
||
|------|-----------|----------|
|
||
| `height` | — | Высота строки (если не задана, используется авто) |
|
||
| `rowStyle` | — | Стиль для ВСЕХ колонок (заполняет пустоты рамками) |
|
||
| `cells` | `[]` | Массив ячеек |
|
||
| `empty` | — | Количество подряд идущих пустых строк (заменяет N отдельных `{}`) |
|
||
|
||
Строка без `cells` и `rowStyle` → пустая строка. `{ "empty": 3 }` эквивалентно трём `{}`.
|
||
|
||
## Ячейки (`cells[]`)
|
||
|
||
| Поле | Обяз. | По умолч. | Описание |
|
||
|------|:-----:|-----------|----------|
|
||
| `col` | да | — | Позиция колонки (1-based) |
|
||
| `span` | нет | `1` | Объединение по горизонтали (количество колонок) |
|
||
| `rowspan` | нет | `1` | Объединение по вертикали (количество строк) |
|
||
| `style` | нет | rowStyle | Стиль ячейки (переопределяет rowStyle) |
|
||
| `param` | нет | — | Параметр заполнения |
|
||
| `detail` | нет | — | Параметр расшифровки (только с `param`) |
|
||
| `text` | нет | — | Статический текст |
|
||
| `template` | нет | — | Шаблонный текст с `[Параметр]` |
|
||
|
||
### Тип заполнения
|
||
|
||
Определяется автоматически по содержимому ячейки:
|
||
- `param` → fillType=Parameter
|
||
- `template` → fillType=Template
|
||
- `text` → fillType=Text
|
||
- ничего → без fillType (пустая ячейка или рамка)
|
||
|
||
## `rowStyle` — автозаполнение
|
||
|
||
Когда задан `rowStyle`, компилятор создаёт ячейки для ВСЕХ колонок строки. Позиции без явных ячеек заполняются пустыми ячейками с указанным стилем. Это обеспечивает сплошные рамки в табличных строках.
|
||
|
||
Если в предыдущих строках той же области есть ячейки с `rowspan`, их колонки при автозаполнении пропускаются.
|
||
|
||
## Ограничения
|
||
|
||
Текущая версия не поддерживает:
|
||
- Множественные наборы колонок (`columnsID`)
|
||
- Области типа Columns / Rectangle
|
||
- Рисунки (штрихкоды, картинки)
|
||
- Фон ячеек
|