Files
cc-1c-skills/.claude/skills/skd-compile/SKILL.md
T
Nick ShirokovandClaude Opus 4.6 42df4cd6b1 feat(skd-compile): compact AreaTemplate DSL, fix dataPath and presentation fallback
- Fix empty dataPath when field is specified as object { field, title }
- Add title to presentation fallback chain: presentation → title → name
- Add compact DSL for AreaTemplate: rows/widths/style instead of raw XML
- Built-in style presets: header, data, subheader, total
- User-defined presets via skd-styles.json (project-level overrides)
- Support vertical merge ("|"), parameters ("{Name}"), static text, null cells
- Update SKILL.md, skd-dsl-spec.md, skd-guide.md with template DSL docs
- Add examples/skd-styles.json with all supported keys
- Bump version v1.1 → v1.2

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 20:38:04 +03:00

12 KiB
Raw Blame History

name, description, argument-hint, allowed-tools
name description argument-hint allowed-tools
skd-compile Компиляция схемы компоновки данных 1С (СКД) из компактного JSON-определения. Используй когда нужно создать СКД с нуля [-DefinitionFile <json> | -Value <json-string>] -OutputPath <Template.xml>
Bash
Read
Write
Glob

/skd-compile — генерация СКД из JSON DSL

Принимает JSON-определение схемы компоновки данных → генерирует Template.xml (DataCompositionSchema).

Параметры и команда

Параметр Описание
DefinitionFile Путь к JSON-файлу с определением СКД (взаимоисключающий с Value)
Value JSON-строка с определением СКД (взаимоисключающий с DefinitionFile)
OutputPath Путь к выходному Template.xml
# Из файла
powershell.exe -NoProfile -File .claude/skills/skd-compile/scripts/skd-compile.ps1 -DefinitionFile "<json>" -OutputPath "<Template.xml>"

# Из строки (без промежуточного файла)
powershell.exe -NoProfile -File .claude/skills/skd-compile/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 файл вместо inline-текста: "query": "@queries/sales.sql". Путь разрешается относительно JSON-файла, затем CWD.

Поля — shorthand и объектная форма

"Наименование"                              — просто имя
"Количество: decimal(15,2)"                  — имя + тип
"Организация: CatalogRef.Организации @dimension"  — + роль
"Служебное: string #noFilter #noOrder"       — + ограничения

Объектная форма — когда нужен title или другие свойства:

{ "field": "ОстатокНаНачалоПериода", "title": "Остаток на начало периода" }

dataPath автоматически берётся из field, если не указан явно.

Типы: string, string(N), 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, строка = string, булево = boolean, дата = date, датаВремя = dateTime, СтандартныйПериод = StandardPeriod, СправочникСсылка.X = CatalogRef.X, ДокументСсылка.X = DocumentRef.X, int/number = decimal, bool = boolean. Регистронезависимые.

Роли: @dimension, @account, @balance, @period.

Ограничения: #noField, #noFilter, #noGroup, #noOrder.

Итоги (shorthand)

"totalFields": ["Количество: Сумма", "Стоимость: Сумма(Кол * Цена)"]

Параметры (shorthand + @autoDates)

"parameters": [
  "Период: StandardPeriod = LastMonth @autoDates"
]

@autoDates — автоматически генерирует параметры ДатаНачала и ДатаОкончания с выражениями &Период.ДатаНачала / &Период.ДатаОкончания и availableAsField=false. Заменяет 5 строк на 1.

Фильтры — shorthand

"filter": [
  "Организация = _ @off @user",
  "Дата >= 2024-01-01T00:00:00",
  "Статус filled"
]

Формат: "Поле оператор значение @флаги". Значение _ = пустое (placeholder). Флаги: @off (use=false), @user (userSettingID=auto), @quickAccess, @normal, @inaccessible.

В объектной форме доступны: viewMode, userSettingID, userSettingPresentation.

Группы фильтров (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"
]

Формат: "Имя [= значение] @флаги". Для StandardPeriod варианты (LastMonth, ThisYear и т.д.) распознаются автоматически.

Структура — string shorthand

"structure": "Организация > details"
"structure": "Организация > Номенклатура > details"

> разделяет уровни группировки. details (или детали) = детальные записи. selection и order по умолчанию ["Auto"] на каждом уровне.

Для сложных случаев (таблицы, диаграммы, фильтры на уровне группировки) используется объектная форма.

Варианты настроек

"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.

Итоги с привязкой к группировкам

"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 — пустая.

Встроенные стили: header (фон, центр, перенос), data (фон группы), subheader (без фона, центр), total (без фона). Все — Arial 10, рамки Solid 1px, цвета через стили платформы.

Пользовательские стили: файл skd-styles.json рядом с JSON или в корне проекта. Все допустимые ключи и формат цветов — в examples/skd-styles.json.

Raw XML ("template": "<...>") остаётся как fallback. Детект: если есть rows — DSL, иначе — raw.

Привязки макетов к группировкам

"groupTemplates": [
  { "groupField": "Счет", "templateType": "GroupHeader", "template": "Макет1" },
  { "groupField": "Счет", "templateType": "Header", "template": "Макет2" }
]

Примеры

Минимальный

{
  "dataSets": [{
    "query": "ВЫБРАТЬ Номенклатура.Наименование КАК Наименование ИЗ Справочник.Номенклатура КАК Номенклатура",
    "fields": ["Наименование"]
  }]
}

С запросом из внешнего файла (@file)

{
  "dataSets": [{
    "query": "@queries/sales.sql",
    "fields": ["Номенклатура: СправочникСсылка.Номенклатура @dimension", "Количество: число(15,3)", "Сумма: число(15,2)"]
  }]
}

С ресурсами, параметрами и @autoDates

{
  "dataSets": [{
    "query": "ВЫБРАТЬ Продажи.Номенклатура, Продажи.Количество, Продажи.Сумма ИЗ РегистрНакопления.Продажи КАК Продажи",
    "fields": ["Номенклатура: СправочникСсылка.Номенклатура @dimension", "Количество: число(15,3)", "Сумма: число(15,2)"]
  }],
  "totalFields": ["Количество: Сумма", "Сумма: Сумма"],
  "parameters": ["Период: СтандартныйПериод = LastMonth @autoDates"],
  "settingsVariants": [{
    "name": "Основной",
    "settings": {
      "selection": ["Номенклатура", "Количество", "Сумма", "Auto"],
      "filter": ["Организация = _ @off @user"],
      "dataParameters": ["Период = LastMonth @user"],
      "structure": "Организация > details"
    }
  }]
}

Верификация

/skd-validate <OutputPath>                  — валидация структуры XML
/skd-info <OutputPath>                      — визуальная сводка
/skd-info <OutputPath> -Mode variant -Name 1 — проверка варианта настроек