mcpField
M
mxl-compile

mxl-compile

github.com/nikolay-shirokovドキュメント74153 回インストール今日更新
リポジトリ

mxl-compile について

mxl-compileは、簡潔なJSONレイアウト定義から1Cの表計算ドキュメント用Template.xmlを生成します。領域、セル、スタイル、列幅、結合などを設定でき、生成後はmxl-validateで検査できます。

主な機能

  1. 01JSON DSLからTemplate.xmlを生成
  2. 02領域、行、セルの定義
  3. 03フォントとスタイルの設定
  4. 04列幅とセル結合の指定
  5. 05印刷と図形の設定

活用シーン

  1. 01JSONから1C表計算レイアウトを作成
  2. 02印刷ドキュメントのレイアウト生成
  3. 03検証用のレイアウト定義を作成

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/nikolay-shirokov/cc-1c-skills --skill mxl-compile

インストール後、Claude Code で/mxl-compileを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

reference/
drawings.md
groups.md
input-cells.md
layout.md
notes.md
print.md
style-properties.md
scripts/
mxl-compile.ps1
mxl-compile.py

README(原文)English

プロジェクトの README より

この README の日本語訳はまだありません。以下は英語の原文です。日本語の紹介はページ上部をご覧ください。

/mxl-compile — Компилятор макета из DSL

Принимает компактное JSON-определение макета (области, параметры, стили) → генерирует Template.xml табличного документа 1С: палитры, индексы, объединения, namespace.

Использование

/mxl-compile <JsonPath> <OutputPath>

Параметры

ПараметрОбязательныйОписание
JsonPathдаПуть к JSON-определению макета
OutputPathдаПуть для генерации Template.xml

Команда

powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/mxl-compile.ps1" -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, columnSetreference/layout.md
Колонтитулы, ориентация, поля, масштабheader, footer, printSettingsreference/print.md
Картинка, фигура или надпись поверх сетки; картинка в ячейкеpictures, drawings, pictureParameterreference/drawings.md
Ячейки для ввода данных пользователемvalueType, controlType, valuereference/input-cells.md
Сворачиваемые группы строк или колонокrowGroups, columnGroupsreference/groups.md
Всплывающая подсказка у ячейкиnotereference/notes.md

Пример

{
  "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
`""`
nullПропуск колонки
{ … }Обычная ячейка без col — когда нужны style, detail, template
"rows": [
  ["Вид", "Остаток", ">", "Итог"],
  ["|",   "начало",  "конец", "|"],
  ["{Вид}", "{Нач}", "{Кон}", "{Итог}"]
]

Здесь «Вид» и «Итог» объединены по вертикали, «Остаток» — по горизонтали на две колонки.

Позиционный список — это форма записи ЯЧЕЕК, а не строки. Если у строки нет своих свойств, он и есть строка (как в примере выше). Если нужны height, hidden или rowStyle — тот же список кладётся в cells:

{ "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
horizontalAlignmentLeft, Center, Right, Justify, Auto
verticalAlignmentTop, 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:Имя. Несуществующее имя платформа отвергнет при загрузке.

"styles": {
  "шапка":  { "font": "жирный", "horizontalAlignment": "Center", "backColor": "#EBEBEB" },
  "рамка":  { "border": { "style": "Solid", "width": 2 } },
  "снизу":  { "bottomBorder": "Dotted" }
}

コメント