framework_eng/skills/tool-usage/platform-data/xml-generation/mxl-dsl/SKILL.md
Use for generating and refining 1С print forms (MXL) through JSON DSL. Helps describe areas, cells, and static styles for xml-gen mxl compile/decompile/info/validate.
npx skillsauth add steelmorgan/1c-agent-based-dev-framework mxl-dslInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Compact JSON format for describing 1С tabular documents (SpreadsheetDocument). Claude describes what (areas, cells, styles, parameters), while the CLI guarantees XML correctness (palettes, indices, merges, namespace).
The canon is taken from Shirokov's specification (cc-1c-skills) and extended with the --format designer|edt flag for two output formats.
| Trigger | Action |
|---------|----------|
| Create a print form from scratch | mxl compile + JSON DSL → references/dsl-spec.md |
| Refine an existing layout | mxl decompile → edit JSON → mxl compile |
| Validate MXL tool behavior against canon XML | xml-gen oracle mxl --mode dsl|cli|both |
| Understand the structure of someone else's layout (areas, parameters, drill-downs) | mxl info → references/info-modes.md |
| Check the correctness of the assembled Template.xml | xml-gen validate --type mxl → references/validate-classes.md |
| Reverse-engineer print output from a sample (screenshot/scan) | mxl decompile or build from scratch on a grid — define page + "Nx" widths |
The DSL covers static cell formatting — font/align/valign/border/wrap/format through the styles map. It intentionally does NOT generate runtime-conditional formatting: cell coloring/styling based on the displayed value. This is done programmatically when filling the tabular document — Область.ТекстЦвет = …, Область.ЦветФона = … on the populated area. The absence is a design choice, not a tool defect; see rule no-manual-xml-edit.md § "What is done in code, and NOT through xml-gen".
# Компиляция JSON → Template.xml
xml-gen mxl compile [--format designer|edt] <input.json> <output.xml>
# Декомпиляция Template.xml → JSON DSL
xml-gen mxl decompile <Template.xml> <output.json>
# Анализ структуры (области, параметры, расшифровки, текст)
xml-gen mxl info <Template.xml> [--with-text] [--limit N] [--offset N] [--format text|json]
# Валидация
xml-gen validate --type mxl <Template.xml> [--detailed] [--max-errors N]
# Поведенческий оракул по реальному канону
xml-gen oracle mxl --source <Template.xml|src/xml> --out build/oracle --mode dsl|cli|both [--include-all]
output.xml for compile is the path to the layout in EPF/ERF: .../Templates/<Name>/Ext/Template.xml.
--format (compile only):
designer - configuration designer format (Template.xml in Ext/)edt - EDT format (XML inside the .mxl folder of the EDT project){
"columns": 4,
"areas": [
{
"name": "Заголовок",
"rows": [
{ "cells": [
{ "col": 1, "span": 4, "text": "Накладная" }
]}
]
}
]
}
| Was (old) | Became (canon) |
|--------------|---------------|
| {"text": "[Parameter]"} - parameter in brackets in the text | {"param": "Parameter"} - separate cell type |
| {"text": "Inv. No. [Number]"} - parameter in the template in brackets | {"template": "Inv. No. [Number]"} - separate type |
| span without col (sequential filling) | col 1-based + span (explicit positioning) |
| Column widths were not specified | columns + columnWidths + page + "Nx" |
| Solid row borders - every cell is explicit | rowStyle - automatic filling of gaps |
| Only horizontal merging | rowspan (vertical) + rowStyle takes occupied cells into account |
| Drill-down was not described | detail - drill-down parameter next to param |
| Row height was not specified | height on the row |
| N empty rows - N {} objects | { "empty": N } |
The full field specification (top level, fonts, styles, areas, rows, cells, fillType detection, rowStyle with rowspan, "Nx" proportions, 1С formats ЧДЦ=/ДФ=) - references/dsl-spec.md.
Area names from the DSL (name) and parameter names (param) are what BSL uses to address the layout:
ТД = ЭтотОбъект.ПолучитьМакет("ПечатнаяФорма");
ТабДок = Новый ТабличныйДокумент;
ОбластьШапка = ТД.ПолучитьОбласть("Заголовок");
ОбластьШапка.Параметры.ТекстЗаголовка = "Накладная № 1";
ТабДок.Вывести(ОбластьШапка);
Для Каждого Стр Из ТЧ Цикл
Строка = ТД.ПолучитьОбласть("Строка");
Строка.Параметры.Товар = Стр.Товар; // detail = Номенклатура подставит ссылку для расшифровки
Строка.Параметры.Количество = Стр.Количество;
Строка.Параметры.Сумма = Стр.Сумма;
ТабДок.Вывести(Строка);
КонецЦикла;
For intersections (Rows area + Columns area, for example labels/price tags), access via |:
Область = ТД.ПолучитьОбласть("ВысотаЭтикетки|ШиринаЭтикетки");
default, bold, header, bordered, bordered-right, bold-right, border-top, etc.) based on property combinations - they do not have to match the original.rowStyle, and the empty cells are removed from the output.[Name] in text) are extracted into separate template cells.xml-gen oracle mxl validates two independent modes:
--mode dsl decompiles canon Template.xml to JSON DSL, compiles a new sandbox Template.xml, and compares it with the canon. The canon file is never overwritten.--mode cli decompiles canon into a CommandPlan of public commands: epf init, epf add-template --type SpreadsheetDocument, mxl compile, validate. The result inside the temporary EPF sandbox is compared with the canon separately from DSL mode.--mode both runs both and reports separate dsl and cli summaries.src/xml source, the default corpus is the _Демо pilot. Use --include-all only for a broad audit of all MXL Template.xml files.Use oracle for regression detection and coverage reports. Use normal mxl compile/decompile/info/validate for day-to-day generation and editing.
page: "A4-landscape" + "Nx" widths.Write).mxl compile → Template.xml.xml-gen validate --type mxl → if there are errors, see references/validate-classes.md.mxl info → inspect the structure of areas and parameters with the agent's eyes.mxl decompile → edit → compile.xml-gen oracle mxl --source src/xml --out build/oracle --mode both.// ❌ статический текст и параметр свалены в одну ячейку через скобки
{ "col": 2, "text": "Инв № [Номер]" }
// ✅ это шаблон с подстановкой → template
{ "col": 2, "template": "Инв № [Номер]" }
// ❌ сплошные рамки строки — каждая пустая ячейка прописана вручную
{ "cells": [
{ "col": 1, "style": "bordered", "param": "А" },
{ "col": 2, "style": "bordered" },
{ "col": 3, "style": "bordered" },
{ "col": 4, "style": "bordered", "param": "Б" }
]}
// ✅ rowStyle автозаполняет пустоты
{ "rowStyle": "bordered", "cells": [
{ "col": 1, "param": "А" },
{ "col": 4, "param": "Б" }
]}
references/dsl-spec.md - full DSL field specificationreferences/info-modes.md - how to read mxl info output (area types, intersections, [tpl] parameters, detail)references/validate-classes.md - validator error classes../role-dsl/, ../form-dsl/testing
MUST use BEFORE making a judgment about the cause of a conflict, a test failure, or an artifact dispute. Defines the end-to-end verification method L1→L6 and the classification of the first broken link.
development
MUST use AFTER a work cycle with ≥2 iterations (wrote → error → fixed → success). Provides the retrospective procedure and the format for recording practice/anti-patterns in references/learned-patterns.md or {project}/.context/learned-patterns.md.
tools
MUST use WHEN you are writing reusable knowledge into RLM (pattern / architectural decision / stable domain fact) OR reading it before a non-trivial task/solution in the domain. Provides the breakdown of native-push vs RLM-pull, tools for writing and reading RLM, H-MEM levels, and hygiene.
testing
MUST use WHEN the task is classified as simple (< 20 lines, 1 file, no new metadata objects, no architectural decisions). Provides a short cycle of 3 steps with a guard on the self path and mandatory verify.