mcpField
S
skd-compile

skd-compile

github.com/nikolay-shirokov開発74154 回インストール今日更新
リポジトリ

skd-compile について

skd-compile は、データコンポジションスキーマを記述した JSON DSL を Template.xml にコンパイルする 1C 開発スキルです。データセット、フィールド、パラメーター、フィルター、構造、出力テンプレートを定義できます。

主な機能

  1. 01JSON ファイルまたは文字列から定義を読み込み
  2. 02DataCompositionSchema の 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>", ТЗ), ...) の 2 番目のパラメーターとして渡します。

{ "name": "ЖурналОшибок", "objectName": "ЖурналОшибок", "fields": [
  { "field": "ТекстСообщения", "title": "Текст сообщения", "type": "string(150)" },
  { "field": "Расшифровка",   "title": "Описание",       "type": "CatalogRef.СтруктураПредприятия" }
]}

name はスキーマ内のデータセット名、objectName はデータを渡す構造体内のキーです。

フィールド — 短縮形式とオブジェクト形式
"Наименование"                              — просто имя
"Количество: decimal(15,2)"                  — имя + тип
"Организация: CatalogRef.Организации @dimension"  — + роль
"Служебное: string #noFilter #noOrder"       — + ограничения

title やその他のプロパティが必要な場合は、オブジェクト形式を使用します:

{ "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。参照型は inline namespace 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 — проверка варианта настроек

コメント