Skip to content
cccskills
FreePublished on GitHub

skd-compile

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

The English summary is being prepared. Showing the original description.

See how to install

Files included (4)

  • SKILL.md22.7 KB
  • examples/skd-styles.json628 B
  • scripts/skd-compile.ps1175.5 KB
  • scripts/skd-compile.py187.0 KB

SKILL.md (original)

Review the instructions the agent will receive before you install.

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

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

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

ПараметрОписание
DefinitionFileПуть к JSON-файлу с определением СКД (взаимоисключающий с Value)
ValueJSON-строка с определением СКД (взаимоисключающий с 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 файл вместо inline-текста: "query": "@queries/sales.sql". Путь разрешается относительно JSON-файла, затем CWD.

DataSetObject — внешний набор данных (без источника-запроса). Поля описываются явно; данные передаются вторым параметром ПроцессорКомпоновкиДанных.Инициализировать(Макет, Новый Структура("<objectName>", ТЗ), ...).

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

name — имя набора в схеме, objectName — ключ в структуре передачи данных.

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

"Наименование"                              — просто имя
"Количество: 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)) применяются к каждому элементу.

Роли (shorthand или объект):

  • @-флаги: @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)

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 пару дат НачалоПериода/КонецПериода, вычисляемых из него. Используй их в тексте запроса как &НачалоПериода/&КонецПериода; пользователь выбирает только сам период. По умолчанию сам параметр получает 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 — проверка варианта настроек

Reviews

No reviews yet. Tell others what you thought.

Comments

No login needed. Share how it worked for you, ask a question, or note where it did not run.

No comments yet. Be the first to write one.

Comments are published right away. Do not include personal information such as email addresses or phone numbers. Up to 2 URLs.

0 / 1,000 characters

This form is protected by reCAPTCHA, and the Google Privacy Policy and Terms of Service apply.

More skills from this repository

Точечное редактирование конфигурации 1С. Используй когда нужно изменить свойства конфигурации, добавить или удалить объект из состава, настроить роли по умолчанию, поменять раскладку панелей, настроить начальную страницу

The English summary is being prepared. Showing the original description.

Nikolay-Shirokov/cc-1c-skills717Updated Oct 22, 2026

Анализ структуры конфигурации 1С — свойства, состав, счётчики объектов. Используй для обзора конфигурации — какие объекты есть, сколько их, какие настройки

The English summary is being prepared. Showing the original description.

Nikolay-Shirokov/cc-1c-skills717Updated Oct 22, 2026

Создать пустую конфигурацию 1С (scaffold XML-исходников). Используй когда нужно начать новую конфигурацию с нуля

The English summary is being prepared. Showing the original description.

Nikolay-Shirokov/cc-1c-skills717Updated Oct 22, 2026

Валидация конфигурации 1С. Используй после создания или модификации конфигурации для проверки корректности

The English summary is being prepared. Showing the original description.

Nikolay-Shirokov/cc-1c-skills717Updated Oct 22, 2026

Заимствование объектов из конфигурации 1С в расширение (CFE). Используй когда нужно перехватить метод, изменить форму или добавить реквизит к существующему объекту конфигурации

The English summary is being prepared. Showing the original description.

Nikolay-Shirokov/cc-1c-skills717Updated Oct 22, 2026

Анализ расширения конфигурации 1С (CFE) — состав, заимствованные объекты, перехватчики, проверка переноса. Используй когда нужно понять что содержит расширение или проверить перенесены ли вставки в конфигурацию

The English summary is being prepared. Showing the original description.

Nikolay-Shirokov/cc-1c-skills717Updated Oct 22, 2026

See all skills by Nikolay-Shirokov

Report a problem with this skill