mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-08-21 02:29:42 +03:00
Auto-build: copilot (python) from 97f1a0d
This commit is contained in:
@@ -0,0 +1,229 @@
|
||||
---
|
||||
name: mxl-compile
|
||||
description: Компиляция табличного документа (MXL) из JSON-определения. Используй когда нужно создать макет печатной формы
|
||||
argument-hint: <JsonPath> <OutputPath>
|
||||
allowed-tools:
|
||||
- Bash
|
||||
- Read
|
||||
- Write
|
||||
- Glob
|
||||
---
|
||||
|
||||
# /mxl-compile — Компилятор макета из DSL
|
||||
|
||||
Принимает компактное JSON-определение макета (области, параметры, стили) → генерирует Template.xml табличного документа 1С: палитры, индексы, объединения, namespace.
|
||||
|
||||
## Использование
|
||||
|
||||
```
|
||||
/mxl-compile <JsonPath> <OutputPath>
|
||||
```
|
||||
|
||||
## Параметры
|
||||
|
||||
| Параметр | Обязательный | Описание |
|
||||
|------------|:------------:|------------------------------------|
|
||||
| JsonPath | да | Путь к JSON-определению макета |
|
||||
| OutputPath | да | Путь для генерации Template.xml |
|
||||
|
||||
## Команда
|
||||
|
||||
```powershell
|
||||
python ".github/skills/mxl-compile/scripts/mxl-compile.py" -JsonPath "<путь>.json" -OutputPath "<путь>/Template.xml"
|
||||
```
|
||||
|
||||
## Рабочий процесс
|
||||
|
||||
1. Написать JSON-определение (Write tool) → файл `.json`
|
||||
2. Вызвать `/mxl-compile` для генерации Template.xml
|
||||
3. Вызвать `/mxl-validate` для проверки корректности
|
||||
4. Вызвать `/mxl-info` для верификации структуры
|
||||
|
||||
**Если макет создаётся по изображению** (скриншот, скан печатной формы) — сначала вызвать `/img-grid` для наложения сетки, по ней определить границы колонок и пропорции, затем использовать `"Nx"` ширины + `"page"` для автоматического расчёта размеров.
|
||||
|
||||
## Что читать под задачу
|
||||
|
||||
Ниже — всё, что нужно для типового макета. Остальное лежит по файлу на задачу, читать нужно
|
||||
только свой:
|
||||
|
||||
| Задача | Ключи | Файл |
|
||||
|---|---|---|
|
||||
| Свойство стиля вне частых: отступ, защита, узор, маска, поведение при выводе | — | `reference/style-properties.md` |
|
||||
| Область, не описываемая диапазоном строк; свои ширины колонок у части документа | `namedAreas`, `columnSets`, `columnSet` | `reference/layout.md` |
|
||||
| Колонтитулы, ориентация, поля, масштаб | `header`, `footer`, `printSettings` | `reference/print.md` |
|
||||
| Картинка, фигура или надпись поверх сетки; картинка в ячейке | `pictures`, `drawings`, `pictureParameter` | `reference/drawings.md` |
|
||||
| Ячейки для ввода данных пользователем | `valueType`, `controlType`, `value` | `reference/input-cells.md` |
|
||||
| Сворачиваемые группы строк или колонок | `rowGroups`, `columnGroups` | `reference/groups.md` |
|
||||
| Всплывающая подсказка у ячейки | `note` | `reference/notes.md` |
|
||||
|
||||
## Пример
|
||||
|
||||
```json
|
||||
{
|
||||
"columns": 5,
|
||||
"columnWidths": { "1": 5, "2": 40, "3-5": 12 },
|
||||
"fonts": { "жирный": { "face": "Arial", "size": 10, "bold": true } },
|
||||
"styles": {
|
||||
"шапка": { "font": "жирный", "horizontalAlignment": "Center", "textPlacement": "Wrap", "border": "Solid" },
|
||||
"клетка": { "border": "Solid" },
|
||||
"число": { "border": "Solid", "horizontalAlignment": "Right", "format": "ЧЦ=15; ЧДЦ=2" },
|
||||
"итог": { "font": "жирный", "horizontalAlignment": "Right", "topBorder": "Solid" }
|
||||
},
|
||||
"areas": [
|
||||
{ "name": "Заголовок", "rows": [
|
||||
{ "height": 20, "cells": [{ "col": 1, "span": 5, "style": "шапка", "param": "ЗаголовокОтчёта" }] },
|
||||
{}
|
||||
]},
|
||||
{ "name": "ШапкаТаблицы", "rows": [
|
||||
{ "rowStyle": "шапка", "cells": ["№", "Номенклатура", "Количество", "Цена", "Сумма"] }
|
||||
]},
|
||||
{ "name": "Строка", "rows": [
|
||||
{ "rowStyle": "клетка", "cells": [
|
||||
{ "col": 1, "param": "НомерСтроки" },
|
||||
{ "col": 2, "param": "Товар", "detail": "Номенклатура" },
|
||||
{ "col": 3, "style": "число", "param": "Количество" },
|
||||
{ "col": 4, "style": "число", "param": "Цена" },
|
||||
{ "col": 5, "style": "число", "param": "Сумма" }
|
||||
]}
|
||||
]},
|
||||
{ "name": "Итого", "rows": [
|
||||
{ "rowStyle": "итог", "cells": [null, null, null, "Итого:", "{Всего}"] }
|
||||
]}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
Шапка таблицы и итог записаны позиционно — позиция берётся из порядка, `col` не нужен;
|
||||
строка таблицы записана ячейками с `col`, потому что у них разные стили и расшифровка.
|
||||
|
||||
## Структура DSL
|
||||
|
||||
```
|
||||
{ columns, page, defaultWidth, columnWidths, columnStyles, textLanguages,
|
||||
fonts: { имя: { face, size, bold, italic, underline, strikeout } | { ref } },
|
||||
styles: { имя: { font, horizontalAlignment, verticalAlignment, textPlacement,
|
||||
border, leftBorder, topBorder, rightBorder, bottomBorder,
|
||||
borderColor, backColor, textColor, format } },
|
||||
areas: [{ name, columnSet, rows: [
|
||||
{ height, hidden, rowStyle, empty, cells: [
|
||||
{ col, span, rowspan, style, param, detail, text, template, note,
|
||||
valueType, controlType, value, pictureParameter } ] } ] }],
|
||||
namedAreas, columnSets, rowGroups, columnGroups, header, footer, printSettings,
|
||||
pictures, drawings
|
||||
}
|
||||
```
|
||||
|
||||
Верхний уровень: `columns` обязателен, остальное по необходимости.
|
||||
|
||||
| Ключ | Описание |
|
||||
|---|---|
|
||||
| `columns` | Количество колонок раскладки по умолчанию |
|
||||
| `page` | Формат страницы: `"A4-landscape"` (780), `"A4-portrait"` (540) или число. Сам вычисляет `defaultWidth` из суммы пропорций `"Nx"` |
|
||||
| `defaultWidth` | Ширина колонок по умолчанию (10) |
|
||||
| `columnWidths` | Ширины: ключи 1-based (`"1"`, `"3-14"`, `"5,7,9"`), значение — число или `"2x"` (доля от `defaultWidth`) |
|
||||
| `columnStyles` | Стиль на колонку целиком: те же ключи диапазонов, значение — имя стиля |
|
||||
| `textLanguages` | Языки, на которые разворачивается текст, заданный строкой (по умолчанию `["ru"]`) |
|
||||
| `areas` | Области — диапазоны подряд идущих строк, в порядке документа |
|
||||
|
||||
## Области, строки, ячейки
|
||||
|
||||
**Область** (`areas[]`) — диапазон подряд идущих строк: `name` (необязательно; с именем область
|
||||
доступна как `Макет.ПолучитьОбласть("Имя")`) и `rows`. Область без имени — просто кусок сетки.
|
||||
|
||||
**Строка** (`rows[]`): `height`, `hidden`, `rowStyle`, `cells`. Пустая строка — `{}`,
|
||||
а `{ "empty": 3 }` заменяет три подряд. `height` и `hidden` — свойства самой строки, у ячейки
|
||||
таких нет.
|
||||
|
||||
**Ячейка** (`cells[]`):
|
||||
|
||||
| Ключ | Описание |
|
||||
|---|---|
|
||||
| `col` | Позиция колонки, 1-based |
|
||||
| `span` / `rowspan` | Объединение вправо / вниз |
|
||||
| `style` | Имя стиля; перекрывает `rowStyle` для этой ячейки |
|
||||
| `param` | Параметр заполнения — `Область.Параметры.Имя = …` |
|
||||
| `text` | Статический текст: строка или объект «язык → текст» |
|
||||
| `template` | Текст со вставками `[Параметр]` |
|
||||
| `detail` | Параметр расшифровки; ставится и без `param` |
|
||||
|
||||
Содержимое задаётся ровно одним ключом из `param` / `text` / `template`; ячейка без них —
|
||||
пустая (нужна, например, ради рамки). Пустая строка `"text": ""` — это тоже текст, а не
|
||||
отсутствие текста.
|
||||
|
||||
### Короткая форма: список ячеек позиционно
|
||||
|
||||
Позиция берётся из порядка, `col` не нужен:
|
||||
|
||||
| Элемент | Значение |
|
||||
|---|---|
|
||||
| `"текст"` | Статический текст |
|
||||
| `{ "ru": "…", "en": "…" }` | Тот же текст на нескольких языках |
|
||||
| `"{Имя}"` | Параметр заполнения |
|
||||
| `">"` | Продолжение ячейки слева — увеличивает её `span` |
|
||||
| `"|"` | Продолжение ячейки сверху — увеличивает её `rowspan` |
|
||||
| `null` | Пропуск колонки |
|
||||
| `{ … }` | Обычная ячейка без `col` — когда нужны `style`, `detail`, `template` |
|
||||
|
||||
```json
|
||||
"rows": [
|
||||
["Вид", "Остаток", ">", "Итог"],
|
||||
["|", "начало", "конец", "|"],
|
||||
["{Вид}", "{Нач}", "{Кон}", "{Итог}"]
|
||||
]
|
||||
```
|
||||
|
||||
Здесь «Вид» и «Итог» объединены по вертикали, «Остаток» — по горизонтали на две колонки.
|
||||
|
||||
Позиционный список — это форма записи ЯЧЕЕК, а не строки. Если у строки нет своих свойств, он
|
||||
и есть строка (как в примере выше). Если нужны `height`, `hidden` или `rowStyle` — тот же
|
||||
список кладётся в `cells`:
|
||||
|
||||
```json
|
||||
{ "rowStyle": "итог", "cells": [null, null, null, "Итого:", "{Всего}"] }
|
||||
```
|
||||
|
||||
### `rowStyle` — оформление строки
|
||||
|
||||
Стиль ложится на ВСЮ ширину строки: колонки без явных ячеек получают его тоже — так выходят
|
||||
сплошные рамки в табличной части. Он же становится оформлением самой строки. Ячейки с `rowspan`
|
||||
из предыдущих строк при этом пропускаются.
|
||||
|
||||
## Оформление
|
||||
|
||||
Ячейка, строка и колонка ссылаются на один и тот же именованный стиль: ячейка — ключом `style`,
|
||||
строка — `rowStyle`, колонка — через `columnStyles`.
|
||||
|
||||
**Шрифт** (`fonts.<имя>`): `face` (Arial), `size` (10), `bold`, `italic`, `underline`,
|
||||
`strikeout`. Либо ссылка вместо описания: `{ "ref": "style:TextFont" }`,
|
||||
`{ "ref": "sys:DefaultGUIFont" }`. Шрифт `"default"` берётся, когда стиль не указал свой.
|
||||
|
||||
**Частые ключи стиля** — имя ключа совпадает с именем свойства в выгрузке, значения перечислений
|
||||
регистр не различают:
|
||||
|
||||
| Ключ | Значение |
|
||||
|---|---|
|
||||
| `font` | Имя из `fonts` |
|
||||
| `horizontalAlignment` | `Left`, `Center`, `Right`, `Justify`, `Auto` |
|
||||
| `verticalAlignment` | `Top`, `Center`, `Bottom` |
|
||||
| `textPlacement` | Длинный текст: `Wrap` (перенос), `Cut` (обрезать), `Block`, `Auto` |
|
||||
| `border` | Рамка со всех сторон |
|
||||
| `leftBorder`, `topBorder`, `rightBorder`, `bottomBorder` | Отдельная сторона |
|
||||
| `borderColor` | Цвет рамки |
|
||||
| `backColor`, `textColor` | Цвет фона и текста |
|
||||
| `format` | Формат данных 1С: `"ЧЦ=15; ЧДЦ=2"`, `"ДФ=dd.MM.yyyy"` |
|
||||
|
||||
**Рамка**: `"Solid"` (ширина 1) либо `{ "style": "Solid", "width": 2 }`. Стили линии: `None`,
|
||||
`Solid`, `Dotted`, `Dashed`, `DashDotted`, `DashDottedDotted`, `ThinDashed`, `LargeDashed`,
|
||||
`ThickDashed`, `Double`. Стороны можно задавать по отдельности всегда: совпавшие четыре
|
||||
компилятор свернёт сам.
|
||||
|
||||
**Цвет** — нотация платформы: `#RRGGBB`, `style:ИмяСтиля` (элемент стиля конфигурации),
|
||||
`web:Имя`, `win:Имя`. Несуществующее имя платформа отвергнет при загрузке.
|
||||
|
||||
```json
|
||||
"styles": {
|
||||
"шапка": { "font": "жирный", "horizontalAlignment": "Center", "backColor": "#EBEBEB" },
|
||||
"рамка": { "border": { "style": "Solid", "width": 2 } },
|
||||
"снизу": { "bottomBorder": "Dotted" }
|
||||
}
|
||||
```
|
||||
Reference in New Issue
Block a user