Cc-1c-skills skd-compile

Компиляция схемы компоновки данных 1С (СКД) из компактного JSON-определения. Используй когда нужно создать СКД с нуля

install
source · Clone the upstream repo
git clone https://github.com/Nikolay-Shirokov/cc-1c-skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/Nikolay-Shirokov/cc-1c-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/.claude/skills/skd-compile" ~/.claude/skills/nikolay-shirokov-cc-1c-skills-skd-compile && rm -rf "$T"
manifest: .claude/skills/skd-compile/SKILL.md
source content

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

В объектной форме:

"useRestriction": { "field": true, "condition": true, "group": true, "order": true }
или
"restrict": ["noField", "noFilter"]
.

Вычисляемые поля (calculatedFields)

Shorthand:

"Имя [Заголовок]: тип = Выражение #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" }

Итоги (shorthand)

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

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

"parameters": [
  "Период [Отчетный период]: StandardPeriod = LastMonth @autoDates"
]

Shorthand:

"Имя [Заголовок]: тип = значение @флаги"
.
[Заголовок]
опциональный — добавляет
<title>
(LocalStringType).

Флаги shorthand:

  • @autoDates
    — добавляет к параметру StandardPeriod пару дат
    НачалоПериода
    /
    КонецПериода
    , вычисляемых из него. Используй их в тексте запроса как
    &НачалоПериода
    /
    &КонецПериода
    ; пользователь выбирает только сам период.
  • @valueList
    <valueListAllowed>true</valueListAllowed>
    — разрешает передавать список значений
  • @hidden
    — скрытый параметр:
    availableAsField=false
    + исключается из
    "dataParameters": "auto"

Объектная форма:

title
,
hidden: true
,
valueListAllowed: true
,
availableAsField: false
,
denyIncompleteValues: true
,
use: "Always"
.

Список допустимых значений (availableValues):

{
  "name": "ПорядокОкругления",
  "type": "EnumRef.Округления",
  "value": "Перечисление.Округления.Окр1_00",
  "use": "Always",
  "denyIncompleteValues": true,
  "availableValues": [
    {"value": "Перечисление.Округления.Окр1_00", "presentation": "руб. коп"},
    {"value": "Перечисление.Округления.Окр1", "presentation": "руб."},
    {"value": "Перечисление.Округления.Окр1000", "presentation": "тыс. руб"}
  ]
}

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

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

Группы фильтров (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"]
на каждом уровне.

Объектная форма — для сложных случаев (именованные группировки, 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", "Количество: число(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 — проверка варианта настроек