diff --git a/.claude/skills/skd-compile/SKILL.md b/.claude/skills/skd-compile/SKILL.md index 96be9b30..9c5791a8 100644 --- a/.claude/skills/skd-compile/SKILL.md +++ b/.claude/skills/skd-compile/SKILL.md @@ -344,9 +344,8 @@ Raw XML (`"template": "<...>"`) остаётся как fallback. Детект: ### Расшифровка (drilldown) в параметрах шаблона -Ключ `drilldown` в параметре шаблона управляет генерацией `DetailsAreaTemplateParameter` и привязкой `Расшифровка` в appearance ячеек. Различает три формы по типу значения. +Ключ `drilldown` в параметре шаблона автоматически генерирует `DetailsAreaTemplateParameter` и привязку `Расшифровка` в appearance ячеек: -**Форма B (shortcut, строка) — расшифровка через `ИмяРесурса`/`DrillDown`:** ```json "parameters": [ { "name": "Сырье", "expression": "ПоступлениеСырья", "drilldown": "ПоступлениеСырья" } @@ -355,38 +354,6 @@ Raw XML (`"template": "<...>"`) остаётся как fallback. Детект: Генерирует: `ExpressionAreaTemplateParameter` (обычный) + `DetailsAreaTemplateParameter` с именем `Расшифровка_ПоступлениеСырья`, `fieldExpression` по полю `ИмяРесурса`, `mainAction=DrillDown`. Ячейки `{Сырье}` автоматически получают appearance `Расшифровка = Расшифровка_ПоступлениеСырья`. -**Форма C (объект) — произвольный `DetailsAreaTemplateParameter`:** -```json -"parameters": [ - { "name": "Номер", "expression": "МаршрутныйЛист.Номер" }, - { "name": "Дата", "expression": "МаршрутныйЛист.Дата" }, - { "name": "МаршрутныйЛист", - "drilldown": { "field": "МаршрутныйЛист", "expression": "МаршрутныйЛист", "action": "OpenValue" } } -] -``` - -Параметр без `expression` и с `drilldown` в виде объекта — это самостоятельный `DetailsAreaTemplateParameter` с именем `name`, `fieldExpression={field, expression}`, `mainAction=action` (по умолчанию `DrillDown`). Используется когда `mainAction=OpenValue` (открытие ссылки на data-параметр), либо когда расшифровка не привязана к `ИмяРесурса`. - -**Override расшифровки на уровне ячейки:** -```json -"rows": [ - [ { "value": "{Номер}", "drilldown": "МаршрутныйЛист" }, - { "value": "{Дата}", "drilldown": "МаршрутныйЛист" } ] -] -``` - -Object-форма ячейки `{ value, drilldown }`: appearance ячейки получит `Расшифровка → ` (без префикса `Расшифровка_`). Используется когда несколько ячеек должны указывать на один и тот же параметр расшифровки, объявленный через форму C. Если в ячейке-строке `{X}` есть param X со shortcut form B — appearance подставляется автоматически, override не нужен. - -### Привязка макета к полю — `fieldTemplates` - -```json -"fieldTemplates": [ - { "field": "МаршрутныйЛист", "template": "Макет1" } -] -``` - -Эквивалент XML-секции `X` — при выводе значения поля `X` используется именованный area-template `Y`. - ### Привязки макетов к группировкам ```json diff --git a/docs/skd-dsl-spec.md b/docs/skd-dsl-spec.md index 4f4d1d26..d0f7b7a9 100644 --- a/docs/skd-dsl-spec.md +++ b/docs/skd-dsl-spec.md @@ -404,7 +404,7 @@ XML-маппинг — по `` на каждый элемент: | `use` | `"Always"`, `"Auto"` | | `denyIncompleteValues` | `true` — запретить произвольные значения (только из availableValues) | | `availableValues` | Массив `[{value, presentation}]` — допустимые значения с представлениями. Типы (bool/int/decimal) сохраняются нативно в JSON | -| `inputParameters` | Параметры ввода (например `ФорматРедактирования`) — массив `[{parameter, value, valueType?, choiceParameters?, choiceParameterLinks?}]`. `valueType: {uri, name}` сохраняет кастомный xsi:type с локальным xmlns (например `d6p1:FoldersAndItemsUse`) | +| `inputParameters` | Параметры ввода (например `ФорматРедактирования`) — массив `[{parameter, value, valueType?, choiceParameters?, choiceParameterLinks?}]`. `valueType: {uri, name}` сохраняет кастомный xsi:type с локальным xmlns (например `d6p1:FoldersAndItemsUse`). В `choiceParameters[i].values` элементы — bool/int/double/string; compile эмитит соответствующий xsi:type (`xs:boolean` / `xs:decimal` / `dcscor:DesignTimeValue`) | | `nilValue` | `true` — эмитить `` для параметров с явным типом (decimal/string/dateTime), где XML-сериализатор обычно ставит типизированный default. Bit-perfect round-trip | ### availableValues @@ -552,6 +552,12 @@ decompile эмитит длинные имена (`sourceDataSet` и т.д.); co ] ``` +Опциональное поле `placement` (`Auto` / `Horizontally` / `Vertically` / `Special`) задаёт расположение элементов внутри группы (по умолчанию `Auto`): + +```json +{"folder": "Экономия ФОТ", "items": ["ЭкономияФОТ", "ЭкономияФОТПроцент"], "placement": "Horizontally"} +``` + ### filter #### Shorthand-строка @@ -598,7 +604,7 @@ decompile эмитит длинные имена (`sourceDataSet` и т.д.); co | `field` | Имя поля | | `op` | Оператор (см. таблицу) | | `value` | Правая часть (опц.). См. формы ниже | -| `valueType` | xsi:type для значения (опц.). `"dcscor:Field"` = field-to-field comparison (значение — имя другого поля) | +| `valueType` | xsi:type для значения (опц.). `"dcscor:Field"` = field-to-field comparison (значение — имя другого поля). Для массива `value: [...]` применяется ко всем элементам — нужен когда auto-detect ошибается (например `Перечисление.X.Y` должно остаться `xs:string`, а не `dcscor:DesignTimeValue`) | | `use` | Включён (`true` по умолчанию) | | `presentation` | Текст подсказки | | `viewMode` | `"Normal"`, `"QuickAccess"`, `"Inaccessible"` | @@ -794,7 +800,7 @@ Wrapper эмитится только при наличии extra-полей; п |------|----------| | `parameter` | Имя параметра | | `value` | Значение (объект `{ "variant": "LastMonth" }` для StandardPeriod, или скаляр) | -| `valueType` | Полный xsi:type если кастомный (например `dcsset:DataCompositionGroupUseVariant`) | +| `valueType` | Полный xsi:type если кастомный (например `dcsset:DataCompositionGroupUseVariant`). Для пустого значения с `use: false` — `"xs:string"` эмитит `` (placeholder отключённого параметра типа DateTime, бит-перфектный аналог `xsi:nil`) | | `use` | Включён (`true` по умолчанию) | | `viewMode` | `"Normal"`, `"QuickAccess"`, `"Inaccessible"` | | `userSettingID` | `"auto"` → генерировать GUID | @@ -848,7 +854,7 @@ Platform-pattern: `startDate`/`endDate`/`date` эмитятся ТОЛЬКО д |------|----------| | `type` | `"group"` | | `name` | Имя группировки (опц.) | -| `groupBy` | Массив полей. Пусто/опущено = детальные записи | +| `groupBy` | Массив полей. Каждый элемент — строка (имя поля) или объект `{ field, groupType?, periodAdditionType?, periodAdditionBegin?, periodAdditionEnd? }`. Пусто/опущено = детальные записи. Object-форма нужна когда `groupType ≠ "Items"`, `periodAdditionType ≠ "None"` или задана `periodAdditionBegin/End` (см. ниже) | | `groupType` | `"Items"` (умолч.), `"Hierarchy"`, `"HierarchyOnly"` | | `selection` | Выборка (умолч. `["Auto"]`) | | `filter` | Отборы (как в settings) | @@ -864,6 +870,14 @@ Platform-pattern: `startDate`/`endDate`/`date` эмитятся ТОЛЬКО д Пустой `groupBy` (или `[]`) = детальные записи (без `groupItems` в XML). +**`periodAdditionBegin` / `periodAdditionEnd`** на field-объекте — даты добавочного периода (``/``). Compile auto-определяет xsi:type значения: строка вида `2025-01-01T00:00:00` → `xs:dateTime`, иначе (путь к параметру, например `ПараметрыДанных.ДатаНачала`) → `dcscor:Field`. + +```json +{ "field": "ПериодМесяц", + "periodAdditionBegin": "ПараметрыДанных.ДатаНачала", + "periodAdditionEnd": "ПараметрыДанных.ДатаОкончания" } +``` + #### Таблица (table) ```json @@ -907,6 +921,23 @@ Platform-pattern: `startDate`/`endDate`/`date` эмитятся ТОЛЬКО д `points` и `series` принимают те же поля что table column/row (включая `name` и user-settings). +**Multi-series / multi-points** — `points` и `series` могут быть массивом объектов, тогда генерируется несколько `` или `` подряд (каждый со своими `groupBy`, `filter`, user-settings). Используется например для разделения данных диаграммы на несколько серий по разным фильтрам: + +```json +{ + "type": "chart", + "points": { "groupBy": ["Период"] }, + "series": [ + { "groupBy": ["Стадия"], "filter": ["Стадия = ЗНАЧЕНИЕ(Перечисление.X.A)"], + "viewMode": "Normal", "userSettingID": "auto", + "userSettingPresentation": { "ru": "Серия A" } }, + { "groupBy": ["Стадия"], "filter": ["Стадия = ЗНАЧЕНИЕ(Перечисление.X.B)"], + "viewMode": "Normal", "userSettingID": "auto", + "userSettingPresentation": { "ru": "Серия B" } } + ] +} +``` + ### userFields (пользовательские вычисляемые поля) Дополнительные поля, которые пользователь может задать в режиме «Изменить вариант» через UI. Хранятся в settings варианта. Два подтипа определяются по содержимому объекта: @@ -1151,13 +1182,45 @@ Shorthand-флаги `@inaccessible`, `@quickAccess` доступны для `fi #### Расшифровка (drilldown) в параметрах шаблона -Ключ `drilldown` в параметре шаблона автоматически генерирует: -1. `DetailsAreaTemplateParameter` с именем `Расшифровка_<значение>`, `fieldExpression` по полю `ИмяРесурса`, `mainAction=DrillDown` -2. Привязку `Расшифровка` в appearance ячеек, ссылающихся на этот параметр через `{Имя}` +Ключ `drilldown` в параметре шаблона — три формы по типу значения: + +**Форма A (без drilldown)** — обычный `ExpressionAreaTemplateParameter`: +```json +{ "name": "Дата", "expression": "Документ.Дата" } +``` + +**Форма B (строка, shortcut)** — `ExpressionAreaTemplateParameter` + автоматический `DetailsAreaTemplateParameter` с именем `Расшифровка_`, `fieldExpression` по полю `ИмяРесурса` (`expression=""`), `mainAction=DrillDown`. Ячейки `{name}` получают appearance `Расшифровка → Расшифровка_` автоматически: +```json +{ "name": "Сырье", "expression": "ПоступлениеСырья", "drilldown": "ПоступлениеСырья" } +``` + +**Форма C (объект)** — самостоятельный `DetailsAreaTemplateParameter` с именем `name`, без `ExpressionAreaTemplateParameter`. Используется когда расшифровка ссылается на data-параметр (а не на ИмяРесурса) и/или нужен другой `mainAction` (например `OpenValue`): +```json +{ "name": "МаршрутныйЛист", + "drilldown": { "field": "МаршрутныйЛист", + "expression": "МаршрутныйЛист", + "action": "OpenValue" } } +``` +`action` по умолчанию `DrillDown`. + +**Override на уровне ячейки** — object-форма `{ value, drilldown }`. Используется когда несколько ячеек должны указывать на один и тот же параметр-расшифровку (объявленный формой C): ```json -"parameters": [ - { "name": "Сырье", "expression": "ПоступлениеСырья", "drilldown": "ПоступлениеСырья" } +"rows": [ + [ { "value": "{Номер}", "drilldown": "МаршрутныйЛист" }, + { "value": "{Дата}", "drilldown": "МаршрутныйЛист" } ] +] +``` + +Значение `drilldown` в ячейке — это полное имя параметра-расшифровки (как объявлено в `parameters`). Для shortcut form B override не нужен — appearance подставляется автоматически. + +### fieldTemplates + +Привязка именованного area-template к полю — `X`. Когда платформа выводит значение поля `X`, используется макет `Y`: + +```json +"fieldTemplates": [ + { "field": "МаршрутныйЛист", "template": "Макет1" } ] ```