关于 skd-compile
skd-compile 是面向 1C 开发者的技能,可将描述数据编排方案的 JSON DSL 编译为 Template.xml。它涵盖数据集、字段、参数、筛选、结构和输出模板等定义。
主要功能
- 01从 JSON 文件或字符串读取定义
- 02生成 DataCompositionSchema 的 Template.xml
- 03支持查询、对象和联合数据集
- 04定义字段、参数、筛选及分组结构
- 05通过紧凑 DSL 描述输出模板
适用场景
- 01将报告方案定义编译为 XML
- 02从外部 SQL 文件构建数据集查询
- 03为报告配置字段、筛选和分组
- 04生成带表格布局的输出模板
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ nikolay-shirokov/ cc-1c-skills --skill skd-compile安装后在 Claude Code 中输入/skd-compile确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
examples/skd-styles.jsonscripts/skd-compile.ps1skd-compile.py详细介绍
/skd-compile — 根据 JSON DSL 生成 СКД
接收 JSON 数据布局架构定义 → 生成 Template.xml(DataCompositionSchema)。
参数和命令
| 参数 | 说明 |
|---|---|
DefinitionFile | 包含 СКД 定义的 JSON 文件路径(与 Value 互斥) |
Value | 包含 СКД 定义的 JSON 字符串(与 DefinitionFile 互斥) |
OutputPath | 输出 Template.xml 的路径 |
# Из файла
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/skd-compile.ps1" -DefinitionFile "<json>" -OutputPath "<Template.xml>"
# Из строки (без промежуточного файла)
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/skd-compile.ps1" -Value '<json-string>' -OutputPath "<Template.xml>"
JSON DSL — 简明参考
参考如下。所有示例均可直接编译。
根结构
{
"dataSets": [...],
"calculatedFields": [...],
"totalFields": [...],
"parameters": [...],
"templates": [...],
"groupTemplates": [...],
"dataSetLinks": [...],
"settingsVariants": [...]
}
默认值:dataSources → 自动生成 ИсточникДанных1/Local;settingsVariants → 自动生成带详细信息的“Основной”。
数据集
根据键确定类型:query → DataSetQuery,objectName → DataSetObject,items → DataSetUnion。
{ "name": "Продажи", "query": "ВЫБРАТЬ ...", "fields": [...] }
查询支持 @file,可引用外部 .sql 文件代替内嵌文本:"query": "@queries/sales.sql"。路径先相对于 JSON 文件解析,然后相对于 CWD 解析。
DataSetObject — 外部数据集(没有查询源)。字段需显式描述;数据通过第二个参数传入 ПроцессорКомпоновкиДанных.Инициализировать(Макет, Новый Структура("<objectName>", ТЗ), ...)。
{ "name": "ЖурналОшибок", "objectName": "ЖурналОшибок", "fields": [
{ "field": "ТекстСообщения", "title": "Текст сообщения", "type": "string(150)" },
{ "field": "Расшифровка", "title": "Описание", "type": "CatalogRef.СтруктураПредприятия" }
]}
name — 架构中的数据集名称,objectName — 数据传递结构中的键。
字段 — 简写和对象形式
"Наименование" — просто имя
"Количество: decimal(15,2)" — имя + тип
"Организация: CatalogRef.Организации @dimension" — + роль
"Служебное: string #noFilter #noOrder" — + ограничения
需要标题或其他属性时,使用对象形式:
{ "field": "ОстатокНаНачалоПериода", "title": "Остаток на начало периода" }
如果未显式指定 dataPath,将自动从 field 获取。
多语言标题:"title": { "ru": "...", "en": "..." }。所有接受 title/presentation 的位置均适用(字段、calculatedFields、parameters、settingsVariants、availableValues 等)。字符串等同于 { "ru": "..." }。
类型:string、string(N)、decimal、decimal(D)、decimal(D,F)、boolean、date、dateTime、CatalogRef.X、DocumentRef.X、EnumRef.X、StandardPeriod。引用类型会以内联命名空间 d5p1:(http://v8.1c.ru/8.1/data/enterprise/current-config)发出。包含引用类型的 EPF 需要使用具有相应配置的数据库进行构建。
不带括号的 decimal = 10,2(默认货币);decimal(N) = N,0(整数);在括号末尾添加 ,nonneg → AllowedSign=Nonnegative。
复合类型(多个值类型)— 对象形式中的数组:"type": ["CatalogRef.A", "CatalogRef.B"]。限定符((N)、(D,F))会应用于每个元素。
角色(简写或对象):
@标志:@dimension、@account、@balance、@period、@required、@autoOrder、@ignoreNullValues- KV:
balanceGroupName、balanceType(OpeningBalance/ClosingBalance)、parentDimension、accountTypeExpression、expression、orderType(Asc/Desc)、periodNumber、periodType
"Сумма: decimal(15,2) @balance balanceGroupName=Сумма balanceType=OpeningBalance"
限制:#noField、#noFilter、#noGroup、#noOrder。
对象形式中:"useRestriction": { "field": true, "condition": true, "group": true, "order": true } 或 "restrict": ["noField", "noFilter"]。
对象形式的其他键:
"presentationExpression": "<выражение>"— 用于替代字段值进行显示的内容。原始值仍会在后台保留,以供跳转/明细查看。"appearance": { "<параметр>": "<значение>" }— 列的默认样式(应用于所有设置变体)。键为平台参数(ГоризонтальноеПоложение、МинимальнаяШирина、Формат、Текст等)。"orderExpression": { "expression": "<выражение>", "orderType": "Asc"/"Desc", "autoOrder": true/false }— 按表达式对字段排序(例如ЕстьNULL(Поле.Порядок, 10000))。
{ "field": "Сумма", "title": "Сумма продажи", "type": "decimal(15,2)",
"appearance": { "ГоризонтальноеПоложение": "Right", "МинимальнаяШирина": "80" } }
计算字段(calculatedFields)
简写:"Имя [Заголовок]: тип = Выражение #noField #noFilter #noGroup #noOrder" — 除名称外,所有部分均为可选。
"calculatedFields": [
"Маржа = Цена - Закупка",
"Наценка [Наценка, %]: decimal(10,2) = Маржа / Закупка * 100",
"Служебное: string = \"\" #noField #noFilter #noGroup #noOrder"
]
需要 appearance 时,使用对象形式:
{ "name": "Маржа", "title": "Маржа", "expression": "Цена - Закупка", "type": "decimal(15,2)", "useRestriction": "#noField #noFilter" }
合计(简写)
"totalFields": ["Количество: Сумма", "Стоимость: Сумма(Кол * Цена)"]
Параметры (shorthand + @autoDates)
"parameters": [
"Период [Отчетный период]: StandardPeriod = LastMonth @autoDates"
]
Shorthand: "Имя [Заголовок]: тип = значение @флаги". [Заголовок] опциональный — добавляет <title> (LocalStringType).
Флаги shorthand:
@autoDates— добавляет к параметру StandardPeriod пару датНачалоПериода/КонецПериода, вычисляемых из него. Используй их в тексте запроса как&НачалоПериода/&КонецПериода; пользователь выбирает только сам период. По умолчанию сам параметр получаетuse=AlwaysиdenyIncompleteValues=true(чтобы производные даты всегда были заполнены); в объектной форме можно явно переопределить.@valueList—<valueListAllowed>true</valueListAllowed>— разрешает передавать список значений (при значении-списке ниже подразумевается автоматически)@hidden— скрытый параметр:availableAsField=false+ исключается из"dataParameters": "auto"
Объектная форма: title, hidden: true, valueListAllowed: true, availableAsField: false, denyIncompleteValues: true, use: "Always".
Значение-список: несколько значений по умолчанию через запятую в значение (для запятой внутри значения — кавычки '...'). В объектной форме — массив в value.
"parameters": [
"Виды: ChartOfCharacteristicTypesRef.ВидыСубконтоХозрасчетные = ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты, ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.Договоры"
]
Если значения по умолчанию нет — пропусти = в shorthand или укажи "value": null в объектной форме.
Список допустимых значений (availableValues):
{
"name": "ПорядокОкругления",
"type": "EnumRef.Округления",
"value": "Перечисление.Округления.Окр1_00",
"use": "Always",
"denyIncompleteValues": true,
"availableValues": [
{"value": "Перечисление.Округления.Окр1_00", "presentation": "руб. коп"},
{"value": "Перечисление.Округления.Окр1", "presentation": "руб."},
{"value": "Перечисление.Округления.Окр1000", "presentation": "тыс. руб"}
]
}
availableValues в той же форме принимают поля набора данных и вычисляемые поля (объектная форма). "value": null — пустое значение.
В варианте настроек "dataParameters": "auto" выводит все не-hidden параметры с userSettingID. Значения по умолчанию наследуются и остаются активными; параметры без значения по умолчанию отключаются (пользователь включит их в настройках).
Фильтры — shorthand
"filter": [
"Организация = _ @off @user",
"Дата >= 2024-01-01T00:00:00",
"Статус filled"
]
Формат: "Поле оператор значение @флаги". Значение _ = пустое (placeholder). Флаги: @off (use=false), @user (userSettingID=auto), @quickAccess, @normal, @inaccessible.
В объектной форме доступны: viewMode, userSettingID, userSettingPresentation. Значение-период — объектом: { "field": "Дата", "op": "<", "value": { "variant": "BeginningOfThisMonth" } }, своя дата — { "variant": "Custom", "date": "2024-01-01T00:00:00" }.
Группы фильтров (Or/And/Not):
{ "group": "Or", "items": [
{ "group": "And", "items": [
{ "field": "Статус", "op": "=", "value": "Активен" },
{ "field": "Сумма", "op": ">", "value": 1000 }
]},
{ "field": "Количество", "op": "filled" }
]}
Параметры данных — shorthand
"dataParameters": [
"Период = LastMonth @user",
"Организация @off @user",
"Статусы = Перечисление.СтатусыЗаказов.Новый, Перечисление.СтатусыЗаказов.ВРаботе @user"
]
Формат: "Имя [= значение] @флаги". Для StandardPeriod варианты (LastMonth, ThisYear и т.д.) распознаются автоматически. Несколько значений через запятую — список (кавычки — как у значения параметра). В объектной форме — массив value: { "parameter": "Суммы", "value": [100, 200] }.
Структура — string shorthand
"structure": "Организация > details"
"structure": "Организация > Номенклатура > details"
> разделяет уровни группировки. details (или детали) = детальные записи. selection и order по умолчанию ["Auto"] на каждом уровне.
Объектная форма — для сложных случаев (именованные группировки, selection/filter на уровне группировки, таблицы, диаграммы):
"structure": [
{
"name": "ПоОрганизациям",
"groupFields": ["Организация"],
"selection": ["Организация", "Сумма", "Auto"],
"children": [{ "groupFields": [] }]
}
]
type по умолчанию "group" (можно не указывать). groupFields — алиас для groupBy. Поддержка name, selection, order, filter, outputParameters, рекурсивных children.
Варианты настроек
"settingsVariants": [{
"name": "Основной",
"title": "Продажи по организациям",
"settings": {
"selection": ["Номенклатура", "Количество", "Auto"],
"filter": ["Организация = _ @off @user"],
"order": ["Количество desc", "Auto"],
"conditionalAppearance": [
{
"filter": ["Просрочено = true"],
"appearance": { "ЦветТекста": "style:ПросроченныеДанныеЦвет" },
"presentation": "Выделять просроченные",
"viewMode": "Normal",
"userSettingID": "auto"
}
],
"outputParameters": { "Заголовок": "Мой отчёт" },
"dataParameters": ["Период = LastMonth @user"],
"structure": "Организация > details"
}
}]
Условное оформление (conditionalAppearance)
"conditionalAppearance": [
{
"selection": ["Поле1"],
"filter": ["Поле1 notFilled"],
"appearance": { "Текст": "Не указано", "ЦветТекста": "style:XXX" },
"presentation": "Описание",
"viewMode": "Normal",
"userSettingID": "auto"
}
]
Типы значений appearance: style:XXX/web:XXX/win:XXX → Color, true/false → Boolean, параметр Формат/Текст/Заголовок → LocalStringType, прочее → String.
Типы значений фильтра: Перечисление.*/Справочник.*/ПланСчетов.*/Документ.* → DesignTimeValue (автодетект).
OrGroup в фильтре: {"group": "Or", "items": ["условие1", "условие2"]}.
Folder в selection: {"folder": "Поступление", "items": ["ПолеА", "ПолеБ"]} → SelectedItemFolder с lwsTitle и placement=Auto.
Итоги с привязкой к группировкам
"totalFields": [
{ "dataPath": "Кол", "expression": "Сумма(Кол)", "group": ["Группа1", "Группа1 Иерархия", "ОбщийИтог"] }
]
Шаблоны вывода — компактный DSL
Вместо raw XML (template) — табличное описание через rows + именованный стиль style:
"templates": [
{
"name": "Макет1",
"style": "header",
"widths": [36, 33, 16, 17],
"minHeight": 24.75,
"rows": [
["Виды кассы", "Валюта", "Остаток на начало\nпериода", "Остаток на\nконец периода"],
["|", "|", "|", "|"],
["К1", "К2", "К3", "К4"]
]
},
{
"name": "Макет2",
"style": "data",
"widths": [36, 33, 16, 17],
"rows": [["{ВидКассы}", "{Валюта}", "{Остаток}", "{ОстатокКонец}"]],
"parameters": [
{ "name": "ВидКассы", "expression": "Представление(Счет)" },
{ "name": "Остаток", "expression": "ОстатокНаНачалоПериода" }
]
}
]
Синтаксис ячеек: "текст" — статика, "{Имя}" — параметр, "|" — объединение с ячейкой выше, ">" — объединение с ячейкой слева, null — пустая.
Двухуровневая шапка с горизонтальным объединением:
"rows": [
["Вид актива", "Остаток начало", "Поступление", ">", ">", ">", "Выбытие", ">", ">", "Остаток конец"],
["|", "|", "из произв.", "из п/ф", "со сч.40", "прочее", "Реализ.", "отгруж.", "прочее", "|"],
["К1", "К2", "К3", "К4", "К5", "К6", "К7", "К8", "К9", "К10"]
]
Встроенные стили: header (фон, центр, перенос), data (фон группы), subheader (без фона, центр), total (без фона). Все — Arial 10, рамки Solid 1px, цвета через стили платформы.
Пользовательские стили: файл skd-styles.json рядом с JSON-определением, в текущей директории, или в presets/skills/skd/skd-styles.json (поиск вверх от OutputPath). Первый найденный файл побеждает. Все допустимые ключи и формат цветов — в examples/skd-styles.json.
Raw XML ("template": "<...>") остаётся как fallback. Детект: если есть rows — DSL, иначе — raw.
Расшифровка (drilldown) в параметрах шаблона
Ключ drilldown в параметре шаблона автоматически генерирует DetailsAreaTemplateParameter и привязку Расшифровка в appearance ячеек:
"parameters": [
{ "name": "Сырье", "expression": "ПоступлениеСырья", "drilldown": "ПоступлениеСырья" }
]
Генерирует: ExpressionAreaTemplateParameter (обычный) + DetailsAreaTemplateParameter с именем Расшифровка_ПоступлениеСырья, fieldExpression по полю ИмяРесурса, mainAction=DrillDown. Ячейки {Сырье} автоматически получают appearance Расшифровка = Расшифровка_ПоступлениеСырья.
Привязки макетов к группировкам
"groupTemplates": [
{ "groupName": "ДанныеОтчета", "templateType": "GroupHeader", "template": "Макет1" },
{ "groupField": "Счет", "templateType": "Header", "template": "Макет2" },
{ "groupField": "Счет", "templateType": "OverallHeader", "template": "Макет3" }
]
groupField — привязка к полю группировки, groupName — к именованной группировке в структуре варианта.
templateType: Header (строки данных) → <groupTemplate>, OverallHeader (итоги) → <groupTemplate>, GroupHeader (шапка) → <groupHeaderTemplate>.
Примеры
Минимальный
{
"dataSets": [{
"query": "ВЫБРАТЬ Номенклатура.Наименование КАК Наименование ИЗ Справочник.Номенклатура КАК Номенклатура",
"fields": ["Наименование"]
}]
}
С запросом из внешнего файла (@file)
{
"dataSets": [{
"query": "@queries/sales.sql",
"fields": ["Номенклатура: СправочникСсылка.Номенклатура @dimension", "Количество: число(15,3)", "Сумма: число(15,2)"]
}]
}
С ресурсами, параметрами и @autoDates
{
"dataSets": [{
"query": "ВЫБРАТЬ Продажи.Организация, Продажи.Номенклатура, Продажи.КоличествоОборот КАК Количество, Продажи.СуммаОборот КАК Сумма ИЗ РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода) КАК Продажи",
"fields": [
"Организация: СправочникСсылка.Организации @dimension",
"Номенклатура: СправочникСсылка.Номенклатура @dimension",
"Количество: число(15,3)",
"Сумма: число(15,2)"
]
}],
"totalFields": ["Количество: Сумма", "Сумма: Сумма"],
"parameters": ["Период: СтандартныйПериод = LastMonth @autoDates"],
"settingsVariants": [{
"name": "Основной",
"settings": {
"selection": ["Организация", "Номенклатура", "Количество", "Сумма"],
"filter": ["Организация = _ @off @user"],
"dataParameters": "auto",
"structure": "Организация > details"
}
}]
}
Верификация
/skd-validate <OutputPath> — валидация структуры XML
/skd-info <OutputPath> — визуальная сводка
/skd-info <OutputPath> -Mode variant -Name 1 — проверка варианта настроек