mcpField
S
skd-compile

skd-compile

github.com/nikolay-shirokov开发74154 次安装今天更新
代码仓库

关于 skd-compile

skd-compile 是面向 1C 开发者的技能,可将描述数据编排方案的 JSON DSL 编译为 Template.xml。它涵盖数据集、字段、参数、筛选、结构和输出模板等定义。

主要功能

  1. 01从 JSON 文件或字符串读取定义
  2. 02生成 DataCompositionSchema 的 Template.xml
  3. 03支持查询、对象和联合数据集
  4. 04定义字段、参数、筛选及分组结构
  5. 05通过紧凑 DSL 描述输出模板

适用场景

  1. 01将报告方案定义编译为 XML
  2. 02从外部 SQL 文件构建数据集查询
  3. 03为报告配置字段、筛选和分组
  4. 04生成带表格布局的输出模板

安装

复制下面的命令,在终端中运行。

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

安装后在 Claude Code 中输入/skd-compile确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

examples/
skd-styles.json
scripts/
skd-compile.ps1
skd-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 — проверка варианта настроек

评论

支持 Markdown