Add conditionalAppearance, multi-group totalField, viewMode flags (@normal, @inaccessible), userSettingPresentation, dataParameters table. Update guide with @autoDates, structure/filter shorthand, and modern examples. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
28 KiB
JSON DSL для схемы компоновки данных (СКД)
Компактный JSON-формат для описания DataCompositionSchema (Template.xml).
Компилируется навыком /skd-compile в XML, валидируется /skd-validate.
1. Корневая структура
{
"dataSources": [...],
"dataSets": [...],
"dataSetLinks": [...],
"calculatedFields": [...],
"totalFields": [...],
"parameters": [...],
"templates": [...],
"groupTemplates": [...],
"settingsVariants": [...]
}
Умолчания:
dataSourcesопущен → авто-создаётся{ "name": "ИсточникДанных1", "type": "Local" }sourceв наборе опущен → первый dataSourcenameнабора опущен → "НаборДанных1", "НаборДанных2"...settingsVariantsопущен → один вариант "Основной" с детальной группировкой иselection: ["Auto"]
2. Источники данных (dataSources)
"dataSources": [
{ "name": "ИсточникДанных1", "type": "Local" }
]
| Поле | Обязат. | Умолчание | XML-маппинг |
|---|---|---|---|
name |
да | — | <name> |
type |
нет | "Local" |
<dataSourceType> |
Значения type: "Local", "External".
3. Наборы данных (dataSets)
Тип определяется по ключу-дискриминатору:
| Ключ | Тип | xsi:type |
|---|---|---|
query |
Запрос | DataSetQuery |
objectName |
Объект | DataSetObject |
items |
Объединение | DataSetUnion |
DataSetQuery (самый частый)
{ "name": "Продажи", "query": "ВЫБРАТЬ ...", "fields": [...], "autoFillFields": false }
DataSetObject
{ "name": "ТаблицаПроверки", "objectName": "ТаблицаПроверки", "fields": [...] }
DataSetUnion
{
"name": "Объединение",
"items": [
{ "name": "Набор1", "query": "...", "fields": [...] },
{ "name": "Набор2", "query": "...", "fields": [...] }
],
"fields": [...]
}
| Поле | Обязат. | Описание |
|---|---|---|
name |
нет | Авто: "НаборДанных1"... |
source |
нет | Имя dataSource (авто: первый) |
query |
да* | Текст запроса (DataSetQuery) |
objectName |
да* | Имя объекта (DataSetObject) |
items |
да* | Вложенные наборы (DataSetUnion) |
fields |
нет | Массив полей |
autoFillFields |
нет | false — отключить автозаполнение (по умолчанию не выводится = true) |
4. Поля — shorthand и объектная форма
Shorthand-строка
"<dataPath>[: <type>] [@role...] [#restrict...]"
Примеры:
"fields": [
"Наименование",
"Количество: decimal(15,2)",
"Организация: CatalogRef.Организации @dimension",
"Служебное: string #noFilter #noOrder",
"Счёт: CatalogRef.Хозрасчетный @account",
"Сумма: decimal(15,2) @balance"
]
Объектная форма
{
"dataPath": "Сумма",
"field": "Сумма",
"title": "Сумма продаж",
"type": "decimal(15,2)",
"role": { "dimension": true },
"restrict": ["noFilter", "noGroup"],
"attrRestrict": ["noFilter"],
"appearance": { "Формат": "ЧДЦ=2" },
"presentationExpression": "Формат(Сумма, \"ЧДЦ=2\")"
}
Парсинг shorthand
- Разделить по пробелам; найти
@-роли и#-ограничения - Остаток до первого
:—dataPath(иfieldпо умолчанию) - После
:до@/#— тип
Типы
| DSL | XML v8:Type | Квалификатор |
|---|---|---|
string |
xs:string |
Length=0, AllowedLength=Variable |
string(N) |
xs:string |
Length=N, AllowedLength=Variable |
decimal(D,F) |
xs:decimal |
Digits=D, FractionDigits=F, AllowedSign=Any |
decimal(D,F,nonneg) |
xs:decimal |
Digits=D, FractionDigits=F, AllowedSign=Nonnegative |
boolean |
xs:boolean |
— |
date |
xs:dateTime |
DateFractions=Date |
dateTime |
xs:dateTime |
DateFractions=DateTime |
CatalogRef.XXX |
d5p1:CatalogRef.XXX |
inline xmlns:d5p1 |
DocumentRef.XXX |
d5p1:DocumentRef.XXX |
inline xmlns:d5p1 |
EnumRef.XXX |
d5p1:EnumRef.XXX |
inline xmlns:d5p1 |
ChartOfAccountsRef.XXX |
d5p1:ChartOfAccountsRef.XXX |
inline xmlns:d5p1 |
StandardPeriod |
v8:StandardPeriod |
— |
Ссылочные типы (
CatalogRef.XXX,DocumentRef.XXXи др.) эмитируются с inline namespace declaration:<v8:Type xmlns:d5p1="http://v8.1c.ru/8.1/data/enterprise/current-config">d5p1:CatalogRef.XXX</v8:Type>. Использование префиксаcfg:вместоd5p1:с объявлением namespace приводит к ошибке XDTO. Сборка EPF со ссылочными типами требует базу с соответствующей конфигурацией (не пустую).
Синонимы типов
Все имена типов регистронезависимые. Поддерживаются русские и альтернативные имена:
| Синоним | Канонический тип |
|---|---|
число, Число |
decimal |
строка, Строка |
string |
булево, Булево, bool |
boolean |
дата, Дата |
date |
датаВремя, ДатаВремя |
dateTime |
СтандартныйПериод |
StandardPeriod |
int, integer, number, num |
decimal |
СправочникСсылка.XXX |
CatalogRef.XXX |
ДокументСсылка.XXX |
DocumentRef.XXX |
ПеречислениеСсылка.XXX |
EnumRef.XXX |
ПланСчетовСсылка.XXX |
ChartOfAccountsRef.XXX |
ПланВидовХарактеристикСсылка.XXX |
ChartOfCharacteristicTypesRef.XXX |
Параметризованные: число(15,2) → decimal(15,2), строка(100) → string(100).
Роли
| DSL shorthand | Объектная форма | XML |
|---|---|---|
@dimension |
"role": "dimension" или {"dimension": true} |
<dcscom:dimension>true</dcscom:dimension> |
@account |
"role": "account" или {"account": true} |
<dcscom:account>true</dcscom:account> |
@balance |
"role": "balance" или {"balance": true} |
<dcscom:balance>true</dcscom:balance> |
@period |
"role": "period" или {"period": true} |
<dcscom:periodNumber>1</dcscom:periodNumber> + <dcscom:periodType>Main</dcscom:periodType> |
Объектная форма с доп. полями:
"role": {
"account": true,
"accountTypeExpression": "Счёт.ВидСчёта",
"balanceGroup": "/Остатки"
}
Ограничения
| DSL shorthand | Объектная форма | XML useRestriction |
|---|---|---|
#noField |
"noField" |
<field>true</field> |
#noFilter / #noCondition |
"noFilter" |
<condition>true</condition> |
#noGroup |
"noGroup" |
<group>true</group> |
#noOrder |
"noOrder" |
<order>true</order> |
Оформление (appearance)
"appearance": {
"Формат": "ЧДЦ=2",
"ГоризонтальноеПоложение": "Center"
}
Маппинг на XML:
<appearance>
<dcscor:item xsi:type="dcsset:SettingsParameterValue">
<dcscor:parameter>Формат</dcscor:parameter>
<dcscor:value xsi:type="xs:string">ЧДЦ=2</dcscor:value>
</dcscor:item>
</appearance>
Значения ГоризонтальноеПоложение → xsi:type="v8ui:HorizontalAlign".
5. Итоговые поля (totalFields)
Shorthand
"<dataPath>: <Функция>"
"<dataPath>: <Функция>(<выражение>)"
Примеры:
"totalFields": [
"Количество: Сумма",
"Цена: Максимум",
"Стоимость: Сумма(Кол * Цена)"
]
Парсинг: "A: Func" → dataPath=A, expression=Func(A). "A: Func(expr)" → dataPath=A, expression=Func(expr).
Функции (русские): Сумма, Количество, Максимум, Минимум, Среднее.
Объектная форма
{ "dataPath": "X", "expression": "Максимум(X)", "group": "Группа1" }
Привязка к группировкам (group)
В объектной форме поле group может быть строкой или массивом строк. Каждая строка задаёт имя группировки, для которой вычисляется итог:
"totalFields": [
{ "dataPath": "Кол", "expression": "Сумма(Кол)", "group": ["ГруппаПользователей", "ГруппаПользователей Иерархия", "ОбщийИтог"] }
]
XML-маппинг — по <group> на каждый элемент:
<totalField>
<dataPath>Кол</dataPath>
<expression>Сумма(Кол)</expression>
<group>ГруппаПользователей</group>
<group>ГруппаПользователей Иерархия</group>
<group>ОбщийИтог</group>
</totalField>
6. Параметры (parameters)
Shorthand
"<name>: <type> [= <default>] [@autoDates]"
Примеры:
"parameters": [
"Период: StandardPeriod = LastMonth @autoDates",
"Организация: CatalogRef.Организации",
"ДатаОтчета: date"
]
Парсинг: "A: T = V" → name=A, type=T, value=V. Значение LastMonth и другие варианты периодов → v8:StandardPeriod с v8:variant.
@autoDates
Флаг @autoDates в shorthand параметра автоматически генерирует два дополнительных параметра:
ДатаНачала(date, expression=&<Имя>.ДатаНачала, availableAsField=false)ДатаОкончания(date, expression=&<Имя>.ДатаОкончания, availableAsField=false)
Заменяет типовой бойлерплейт из 5 строк на 1:
// Было:
"parameters": [
"Период: StandardPeriod = LastMonth",
{ "name": "ДатаНачала", "type": "date", "expression": "&Период.ДатаНачала", "availableAsField": false },
{ "name": "ДатаОкончания", "type": "date", "expression": "&Период.ДатаОкончания", "availableAsField": false }
]
// Стало:
"parameters": ["Период: StandardPeriod = LastMonth @autoDates"]
Объектная форма
{
"name": "ДатаНач",
"title": "Дата начала",
"type": "date",
"value": "0001-01-01T00:00:00",
"expression": "&Период.ДатаНачала",
"availableAsField": false,
"useRestriction": true,
"use": "Always"
}
| Поле | Описание |
|---|---|
name |
Имя параметра |
title |
Заголовок (умолч. = name) |
type |
Тип (см. таблицу типов) |
value |
Значение по умолчанию |
expression |
Выражение для вычисления |
availableAsField |
false — скрыть из полей |
useRestriction |
true — скрыть от пользователя |
use |
"Always", "Auto" |
Значения параметров по типу
| Тип | value | XML |
|---|---|---|
StandardPeriod |
"LastMonth", "ThisYear" и др. |
<v8:variant xsi:type="v8:StandardPeriodVariant">LastMonth</v8:variant> |
date |
"0001-01-01T00:00:00" |
xsi:type="xs:dateTime" |
string |
"текст" |
xsi:type="xs:string" |
boolean |
true/false |
xsi:type="xs:boolean" |
Стандартные варианты периодов: Custom, Today, ThisWeek, ThisMonth, ThisQuarter, ThisYear, LastMonth, LastQuarter, LastYear.
7. Вычисляемые поля (calculatedFields)
Shorthand
"<dataPath> = <expression>"
"calculatedFields": [
"УИД = Строка(Ссылка.УникальныйИдентификатор())",
"Итого = Количество * Цена"
]
Объектная форма
{
"dataPath": "Итого",
"expression": "Количество * Цена",
"title": "Итого",
"type": "decimal(15,2)",
"restrict": ["noGroup"],
"appearance": { "Формат": "ЧДЦ=2" }
}
8. Связи наборов (dataSetLinks)
Только объектная форма:
"dataSetLinks": [
{
"source": "Периоды",
"dest": "Данные",
"sourceExpr": "Месяц",
"destExpr": "Месяц",
"parameter": "НачалоМесяца"
}
]
| Поле | XML |
|---|---|
source |
<sourceDataSet> |
dest |
<destinationDataSet> |
sourceExpr |
<sourceExpression> |
destExpr |
<destinationExpression> |
parameter |
<parameter> (опц.) |
9. Варианты настроек (settingsVariants)
"settingsVariants": [{
"name": "Основной",
"presentation": "Основной вариант",
"settings": {
"selection": [...],
"filter": [...],
"order": [...],
"conditionalAppearance": [...],
"outputParameters": {...},
"dataParameters": [...],
"structure": [...]
}
}]
selection
"selection": [
"Наименование",
{ "field": "Количество", "title": "Кол-во" },
"Auto"
]
- Строка →
SelectedItemField "Auto"→SelectedItemAuto(только на уровне группировок; на верхнем уровне settings игнорируется)- Объект с
field/title→SelectedItemFieldсlwsTitle
filter
Shorthand-строка
"filter": [
"Организация = _ @off @user",
"Дата >= 2024-01-01T00:00:00",
"Статус filled",
"Количество > 0"
]
Формат: "<Поле> <оператор> [<значение>] [@off] [@user] [@quickAccess] [@normal] [@inaccessible]".
- Значение
_— пустое (placeholder, не выводится в XML) @off→use=false@user→userSettingID=auto(генерировать GUID)@quickAccess→viewMode=QuickAccess@normal→viewMode=Normal@inaccessible→viewMode=Inaccessible- Типы значений автоопределяются:
true/false→ boolean,2024-01-01T00:00:00→ dateTime, числа → decimal, прочее → string
Объектная форма
"filter": [
{ "field": "Организация", "op": "=", "use": false, "userSettingID": "auto" },
{ "field": "Дата", "op": ">=", "value": "0001-01-01T00:00:00", "valueType": "xs:dateTime" },
{ "group": "Or", "items": [
{ "field": "Статус", "op": "=", "value": true, "valueType": "xs:boolean" },
{ "field": "Пометка", "op": "filled" }
]}
]
| Поле | Описание |
|---|---|
field |
Имя поля |
op |
Оператор (см. таблицу) |
value |
Правая часть (опц.) |
valueType |
xsi:type для значения (опц.) |
use |
Включён (true по умолчанию) |
presentation |
Текст подсказки |
viewMode |
"Normal", "QuickAccess", "Inaccessible" |
userSettingID |
"auto" → генерировать GUID |
userSettingPresentation |
Отображаемое имя настройки (LocalStringType) |
Операторы:
| DSL | XML comparisonType |
|---|---|
= |
Equal |
<> |
NotEqual |
> |
Greater |
>= |
GreaterOrEqual |
< |
Less |
<= |
LessOrEqual |
in |
InList |
notIn |
NotInList |
inHierarchy |
InHierarchy |
contains |
Contains |
notContains |
NotContains |
beginsWith |
BeginsWith |
filled |
Filled |
notFilled |
NotFilled |
Группа условий: { "group": "And"|"Or"|"Not", "items": [...] } → FilterItemGroup с groupType.
order
"order": ["Количество desc", "Наименование", "Auto"]
"Field"→OrderItemField,orderType=Asc"Field desc"→OrderItemField,orderType=Desc"Field asc"→OrderItemField,orderType=Asc"Auto"→OrderItemAuto(только на уровне группировок; на верхнем уровне settings игнорируется)
conditionalAppearance
Условное оформление — массив правил, каждое задаёт набор полей (selection), условия (filter), параметры оформления (appearance) и мета-атрибуты.
"conditionalAppearance": [
{
"selection": ["Сумма"],
"filter": ["Сумма > 1000"],
"appearance": { "ЦветТекста": "style:ПросроченныеДанныеЦвет" },
"presentation": "Выделять крупные суммы",
"viewMode": "Normal",
"userSettingID": "auto"
},
{
"filter": ["Статус notFilled"],
"appearance": { "Текст": "Не указано", "ЦветТекста": "web:Gray" },
"presentation": "Скрывать пустые статусы"
}
]
| Поле | Описание |
|---|---|
selection |
Массив полей, к которым применяется. Пусто/опущено = все поля |
filter |
Условия (shorthand-строки или объекты, как в settings filter) |
appearance |
Объект { "Параметр": "Значение" } |
presentation |
Описание правила |
use |
Включено (true по умолчанию) |
viewMode |
"Normal", "QuickAccess", "Inaccessible" |
userSettingID |
"auto" → генерировать GUID |
Типы значений appearance определяются автоматически:
style:XXX,web:XXX,win:XXX→v8ui:Colortrue/false→xs:boolean- Параметр
ТекстилиЗаголовок→v8:LocalStringType - Прочее →
xs:string
Поддержка use=false на уровне параметра:
"appearance": {
"ЦветФона": { "value": "web:LightGray", "use": false }
}
outputParameters
"outputParameters": {
"Заголовок": "Мой отчёт",
"ВыводитьЗаголовок": "Output",
"МакетОформления": "ОформлениеОтчетовЧерноБелый"
}
Ключ → dcscor:parameter, значение → dcscor:value.
Типы значений определяются автоматически:
"Заголовок"→v8:LocalStringType"ВыводитьЗаголовок","ВыводитьПараметрыДанных","ВыводитьОтбор"→dcsset:DataCompositionTextOutputType"РасположениеПолейГруппировки"→dcsset:DataCompositionGroupFieldsPlacement"РасположениеРеквизитов"→dcsset:DataCompositionAttributesPlacement"ГоризонтальноеРасположениеОбщихИтогов","ВертикальноеРасположениеОбщихИтогов"→dcscor:DataCompositionTotalPlacement- Прочие →
xs:string
dataParameters
Shorthand-строка
"dataParameters": [
"Период = LastMonth @user",
"Организация @off @user"
]
Формат: "<Имя> [= <значение>] [@off] [@user] [@quickAccess] [@normal] [@inaccessible]".
- Значения-варианты периодов (
LastMonth,ThisYearи др.) автоматически оборачиваются вv8:StandardPeriod @off→use=false,@user→userSettingID=auto
Объектная форма
"dataParameters": [
{ "parameter": "Период", "value": { "variant": "LastMonth" }, "userSettingID": "auto" },
{ "parameter": "Организация", "use": false, "viewMode": "Normal", "userSettingID": "auto", "userSettingPresentation": "Организация отчёта" }
]
| Поле | Описание |
|---|---|
parameter |
Имя параметра |
value |
Значение (объект { "variant": "LastMonth" } для StandardPeriod, или скаляр) |
use |
Включён (true по умолчанию) |
viewMode |
"Normal", "QuickAccess", "Inaccessible" |
userSettingID |
"auto" → генерировать GUID |
userSettingPresentation |
Отображаемое имя настройки (LocalStringType) |
structure
String shorthand (рекомендуется для типичных случаев)
"structure": "Организация > details"
"structure": "Организация > Номенклатура > details"
"structure": "Период > Организация > Номенклатура > details"
> разделяет уровни вложенности. Каждый сегмент — группировка по указанному полю. details (или детали) — детальные записи (пустой groupBy). Для каждого уровня selection и order автоматически ["Auto"].
Массив объектов
"structure": [
{
"type": "group",
"groupBy": ["Организация"],
"children": [
{ "type": "group" }
]
}
]
Умолчания: selection и order по умолчанию ["Auto"] на каждом уровне (в группировках, строках/колонках таблиц, точках/сериях диаграмм). Указывать явно нужно только если требуется другой набор полей.
Группировка (group)
| Поле | Описание |
|---|---|
type |
"group" |
name |
Имя группировки (опц.) |
groupBy |
Массив полей. Пусто/опущено = детальные записи |
groupType |
"Items" (умолч.), "Hierarchy", "HierarchyOnly" |
selection |
Выборка (умолч. ["Auto"]) |
filter |
Отборы (как в settings) |
order |
Сортировка (умолч. ["Auto"]) |
outputParameters |
Параметры вывода (как в settings) |
children |
Вложенные элементы структуры |
Пустой groupBy (или []) = детальные записи (без groupItems в XML).
Таблица (table)
{
"type": "table",
"name": "Таблица",
"rows": [
{ "groupBy": ["Номенклатура"], "selection": ["Auto"], "order": ["Auto"] }
],
"columns": [
{ "groupBy": ["Период"], "selection": ["Auto"], "order": ["Auto"] }
]
}
Диаграмма (chart)
{
"type": "chart",
"points": { "groupBy": ["Организация"], "order": ["Auto"] },
"series": { "groupBy": ["Месяц"], "order": ["Auto"] },
"selection": ["Сумма"]
}
10. Макеты и привязки (templates, groupTemplates)
Редко используются. Поддерживаются в объектной форме, близкой к XML.
templates
"templates": [
{
"name": "Макет1",
"template": "<raw XML dcsat:AreaTemplate>",
"parameters": [
{ "name": "ТипЦены", "expression": "Представление(ТипЦен)" }
]
}
]
groupTemplates
"groupTemplates": [
{ "groupField": "ТипЦен", "templateType": "Header", "template": "Макет1" }
]
11. Полный пример — минимальный
{
"dataSets": [
{
"name": "НаборДанных1",
"query": "ВЫБРАТЬ\n\tНоменклатура.Наименование КАК Наименование,\n\tКОЛИЧЕСТВО(1) КАК Количество\nИЗ\n\tСправочник.Номенклатура КАК Номенклатура\nСГРУППИРОВАТЬ ПО\n\tНоменклатура.Наименование",
"fields": [
{ "dataPath": "Наименование", "title": "Наименование" },
"Количество"
]
}
],
"totalFields": ["Количество: Сумма"],
"settingsVariants": [{
"name": "Основной",
"settings": {
"selection": ["Наименование", "Количество"],
"structure": [{ "type": "group" }]
}
}]
}
12. Полный пример — средний (с shorthand v2)
{
"dataSets": [
{
"name": "Продажи",
"query": "ВЫБРАТЬ\n\tПродажи.Организация,\n\tПродажи.Номенклатура,\n\tПродажи.Количество,\n\tПродажи.Сумма\nИЗ\n\tРегистрНакопления.Продажи КАК Продажи\n{ГДЕ\n\tПродажи.Период >= &ДатаНачала\n\tИ Продажи.Период < &ДатаОкончания}",
"fields": [
"Организация: СправочникСсылка.Организации @dimension",
"Номенклатура: СправочникСсылка.Номенклатура @dimension",
"Количество: число(15,3)",
"Сумма: число(15,2)"
]
}
],
"totalFields": ["Количество: Сумма", "Сумма: Сумма"],
"parameters": [
"Период: СтандартныйПериод = LastMonth @autoDates"
],
"settingsVariants": [{
"name": "Основной",
"presentation": "Продажи по организациям",
"settings": {
"selection": ["Номенклатура", "Количество", "Сумма", "Auto"],
"filter": ["Организация = _ @off @user"],
"order": ["Сумма desc", "Auto"],
"outputParameters": {
"Заголовок": "Анализ продаж",
"ВыводитьЗаголовок": "Output"
},
"dataParameters": ["Период = LastMonth @user"],
"structure": "Организация > details"
}
}]
}
Сравнение с v1: средний пример сократился с 58 до 33 строк (−43%). Основная экономия: @autoDates (−4 строки), structure shorthand (−9 строк), filter/dataParam shorthand (−4 строки).