--- name: skd-edit description: Точечное редактирование схемы компоновки данных 1С (СКД). Используй когда нужно модифицировать существующую СКД — добавить поля, итоги, фильтры, параметры, изменить текст запроса argument-hint: -Operation -Value allowed-tools: - Bash - Read - Write - Glob --- # /skd-edit — точечное редактирование СКД (Template.xml) Атомарные операции модификации существующей схемы компоновки данных: добавление, удаление и модификация полей, итогов, фильтров, параметров, настроек варианта, управление структурой, замена запроса. ## Параметры и команда | Параметр | Описание | |----------|----------| | `TemplatePath` | Путь к Template.xml (или к папке — автодополнение Ext/Template.xml) | | `Operation` | Операция (см. список ниже) | | `Value` | Значение операции (shorthand-строка или текст запроса) | | `DataSet` | (опц.) Имя набора данных (умолч. первый) | | `Variant` | (опц.) Имя варианта настроек (умолч. первый) | | `NoSelection` | (опц.) Не добавлять поле в selection варианта | ```powershell python ".codeassistant/skills/skd-edit/scripts/skd-edit.py" -TemplatePath "" -Operation -Value "" ``` ## Пакетный режим (batch) Несколько значений в одном вызове через разделитель `;;`: ```powershell -Operation add-field -Value "Цена: decimal(15,2) ;; Количество: decimal(15,3) ;; Сумма: decimal(15,2)" ``` Работает для всех операций кроме `set-query`, `set-structure` и `add-dataSet`. ## Операции ### add-field — добавить поле в набор данных Shorthand: `"Имя [Заголовок]: тип @роль #ограничение"`. ``` "Цена: decimal(15,2)" "Организация [Орг-ция]: CatalogRef.Организации @dimension" "Служебное: string #noFilter #noOrder" ``` Поле добавляется в набор и в selection варианта (если нет `-NoSelection`). Дубликат dataPath — предупреждение, пропуск. Чтобы поле попало в selection не варианта, а конкретной группировки структуры — используй `-NoSelection` и затем `add-selection "Имя @group=ИмяГруппы"`. ### add-total — добавить итог Shorthand: `": <выражение>"`. Если выражение — известная аггрегатная функция без скобок (`Сумма`, `Количество`, `Минимум`, `Максимум`, `Среднее`), оно автоматически оборачивается в `Func(dataPath)`. Если функция со скобками или произвольное выражение — используется как есть. ``` "Цена: Среднее" # → Среднее(Цена) "Стоимость: Сумма(Кол * Цена)" # → как есть "Проверка: Проверка" # identity: выражение = Проверка ``` ### add-calculated-field — добавить вычисляемое поле Shorthand: `"Имя [Заголовок]: тип = Выражение #noFilter #noOrder #noGroup"`. ``` "Маржа = Продажа - Закупка" "Наценка [Наценка, %]: decimal(10,2) = Маржа / Закупка * 100" "Служебное: string = \"\" #noFilter #noOrder #noGroup" ``` `#noFilter`, `#noOrder`, `#noGroup`, `#noField` → `` (аналогично add-field). Также добавляется в selection варианта. ### add-parameter — добавить параметр ``` "Период [Отчетный период]: StandardPeriod = LastMonth @autoDates" "Организация: CatalogRef.Организации" ``` Shorthand: `"Имя [Заголовок]: тип = значение [availableValue=список] [@флаги]"`. `[Заголовок]` опциональный — добавляет ``. Флаги: - `@autoDates` — генерирует пару скрытых параметров `ДатаНачала`/`ДатаОкончания` для StandardPeriod-параметра. - `@hidden` — скрывает параметр от пользовательских настроек (для параметров-констант, используемых в запросе). - `@always` — параметр всегда подставляется в запрос. Часто вместе с `@hidden`, но используется и отдельно (для видимых обязательных параметров типа отчётного периода). - `@valueList` — разрешает передавать в параметр список значений (при значении-списке ниже подразумевается автоматически, отдельно указывать не обязательно). Значение-список: несколько значений по умолчанию задаются через запятую в `значение`. Для запятой внутри одного значения — кавычки `'...'`. ``` "Виды [Виды субконто]: ChartOfCharacteristicTypesRef.ВидыСубконтоХозрасчетные = ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты, ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.Договоры" ``` ``` "ПС: CatalogRef.Контрагенты = Справочник.Контрагенты.ПустаяСсылка @hidden" "Период: StandardPeriod = LastMonth @always" "ПСчет: ChartOfAccountsRef.Хозрасчетный = ПланСчетов.Хозрасчетный.X @hidden @always" "Округление: EnumRef.Округления = Окр1 availableValue=Перечисление.Округления.Окр1: руб., Перечисление.Округления.Окр1000: тыс." ``` `availableValue=` задаёт начальный список допустимых значений. Формат списка: `v1[: p1], v2[: p2], ...` — элементы через `,`, представление после `:`. Если в значении или представлении встречается `,` или `:` — оборачивай в одинарные кавычки `'...'`: ``` "Округление: ... = Окр1 availableValue=Окр1_00: 'руб., коп.', Окр1: руб." ``` ### modify-parameter — изменить существующий параметр Shorthand: `"ИмяПараметра [Заголовок] [ключ=значение]... [@флаги]"`. Находит параметр по имени, обновляет указанные свойства. ``` "ПорядокОкругления use=Always" "ПорядокОкругления [Округление сумм] denyIncompleteValues=true" "ПериодОтчета [Отчетный период]" # только title "ПорядокОкругления availableValue=Перечисление.Округления.Окр1: руб., Перечисление.Округления.Окр1000: тыс." "СчетПС value=ПланСчетов.Хозрасчетный.КассаПредприятия" "Виды value=ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты, ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.Договоры" "Контрагент @hidden @always" ``` `[Заголовок]` опциональный — устанавливает или заменяет `<title>`. Можно вызывать без других kv-пар, чтобы только обновить title. `availableValue=` **заменяет весь список** допустимых значений (старые удаляются). Формат и кавычки — те же, что в `add-parameter`. `value=` заменяет значение параметра. Несколько значений через запятую → **список значений** (заменяет все прежние); для запятой внутри значения — кавычки `'...'`. Флаги `@hidden` / `@always` — те же, что и в `add-parameter`. Идемпотентны. ### rename-parameter — переименовать параметр Shorthand: `"OldName => NewName"`. Атомарно обновляет имя параметра, ссылки `&Имя` в выражениях других параметров (только полные совпадения, `&ПериодX` не задевается), и записи в `dataParameters` всех вариантов. Текст запроса не трогает — переименование строго в области параметров. ``` "Период => ПериодОтчета" ``` ### reorder-parameters — переставить параметры в указанном порядке Shorthand: `"Имя1, Имя2, Имя3"`. Частичный список — указанные параметры идут первыми в заданном порядке, остальные сохраняют исходный порядок и идут в конце. Параметры из списка, которых нет в схеме — warning, пропуск. ``` "ПериодОтчета, НачалоПериода, КонецПериода" ``` ### add-filter — добавить фильтр в вариант Shorthand: `"Поле оператор значение @флаги"`. Флаги: `@off` (use=false), `@user` (userSettingID=auto), `@quickAccess`, `@normal`, `@inaccessible`. ``` "Номенклатура = _ @off @user" "Дата >= 2024-01-01T00:00:00" "Статус filled" ``` ### add-dataParameter — добавить параметр данных в вариант Shorthand: `"Имя [= значение] @флаги"`. ``` "Период = LastMonth @user" "Организация @off @user" ``` ### add-order — добавить сортировку Shorthand: `"Поле [desc]"`. По умолчанию asc. `Auto` — авто-элемент. ``` "Количество desc" "Auto" ``` ### add-selection — добавить элемент выборки ``` "Номенклатура" "Auto" "Folder(Поступление: ПолеА, ПолеБ, ПолеВ)" ``` `Folder(Название: поле1, поле2)` — группа полей (SelectedItemFolder) с заголовком и `placement=Auto`. `@group=ИмяГруппировки` — добавить в selection именованной группировки (вместо уровня варианта): ``` "Folder(Поступление: ПолеА, ПолеБ) @group=ДанныеОтчета" ``` ### add-dataSetLink — добавить связь наборов данных Shorthand: `"Источник > Приёмник on ВырИсточника = ВырПриёмника [param Имя]"`. ``` "Набор1 > Набор2 on Поле1 = Поле2" "Набор1 > Набор2 on Поле1 = Поле2 [param Связь]" ``` ### add-dataSet — добавить набор данных Shorthand: `"Имя: ТЕКСТ_ЗАПРОСА"` или `"ТЕКСТ_ЗАПРОСА"` (авто-имя `НаборДанныхN`). ``` "Доп: ВЫБРАТЬ 1 КАК Тест" "ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура" "Продажи: @queries/sales.sql" ``` `dataSource` берётся из первого существующего. Дубликат имени — предупреждение, пропуск. Не поддерживает пакетный режим (запрос может содержать `;;`). ### add-variant — добавить вариант настроек Shorthand: `"Имя [Представление]"`. Представление опционально, по умолчанию = имя. ``` "Детальный" "Детальный [Детальный отчёт]" ``` Создаёт вариант с Auto selection + detail group. Дубликат имени — предупреждение, пропуск. ### add-conditionalAppearance — добавить условное оформление Shorthand: `"Параметр = значение [when условие] [for Поле1, Поле2]"`. Блок `when` — синтаксис `add-filter` (Поле оператор значение). ``` "ЦветТекста = web:Red when Сумма < 0" "ЦветФона = web:LightGreen when Статус = Одобрен for Статус" "МинимальнаяШирина = 50 for Организация" "Формат = ЧДЦ=2 for Цена, Сумма" ``` Типы значений appearance (автодетект): `web:*`/`style:*`/`win:*` → Color, `true`/`false` → Boolean, параметр `Формат`/`Текст`/`Заголовок` → LocalStringType, иначе String. Типы значений фильтра (автодетект): `Перечисление.*`/`Справочник.*`/`ПланСчетов.*`/`Документ.*` → DesignTimeValue, `true`/`false` → Boolean, дата → DateTime, числа → Decimal, иначе String. OrGroup: несколько условий через ` or ` в `when` объединяются в FilterItemGroup/OrGroup: ``` "Формат = ЧЦ=15; ЧДЦ=0 when ПараметрыДанных.Округление = Перечисление.Округления.Окр1 or ПараметрыДанных.Округление = Перечисление.Округления.Окр1000" ``` **Важно**: для параметров данных используйте префикс `ПараметрыДанных.` в поле фильтра. ### add-drilldown — подключить расшифровку к ресурсам в шаблонах Value — имена ресурсов (как в полях/вычисляемых полях СКД) через запятую. ``` "ПоступлениеИзПроизводства, ВыбытиеПрочее" "Сумма_Дт83, Сумма_Дт99, Сумма_68, Сумма_84" ``` Подключает DrillDown по `ИмяРесурса` ко всем шаблонам, содержащим указанные ресурсы. Идемпотентно. ### set-query — заменить текст запроса Не поддерживает пакетный режим. Value — полный текст запроса или `@path/to/file.sql` (ссылка на внешний файл). Путь разрешается относительно Template.xml, затем CWD. Когда что: **существенная переработка** (добавить поля, соединения, переписать пакет) → выгрузи запрос через `/skd-info <tpl> -Mode query -Name <набор> -Raw -OutFile file.sql`, отредактируй файл, верни `set-query @file`. `-Raw` отдаёт запрос целиком без декораций, поэтому выгрузка ↔ возврат точны (включая многопакетные запросы). **Точечная замена** (переименовать идентификатор, заменить подстроку) → выгрузка не нужна, используй `patch-query` ниже. ### patch-query — точечная замена в тексте запроса Shorthand: `"старое => новое [@once]"`. По умолчанию заменяет все вхождения подстроки. Поддерживает пакетный режим и `-DataSet`. ``` "СубконтоДт1) В => СубконтоКт1) В" "КАК ВТ_СтароеИмя => КАК ВТ_НовоеИмя @once" ``` `@once` — упасть с ошибкой, если в запросе не **ровно одно** вхождение. Защищает от случайных замен в комментариях и однотипных идентификаторах. Многострочные подстроки поддерживаются. ### set-outputParameter — установить параметр вывода ``` "Заголовок = Мой отчёт" "ВыводитьЗаголовок = true" ``` Если параметр уже существует — заменяет значение. ### set-structure — установить структуру варианта Shorthand: `"Поле1 > Поле2 > details"`. `>` — вложенный уровень группировки, `,` — несколько полей в одном уровне, `details` — детальные записи. **Заменяет всю структуру полностью** (включая Selection/order/filter/conditionalAppearance каждой группы). Для точечной модификации полей группировки с сохранением настроек — используй `modify-structure`. Не поддерживает пакетный режим. ``` "Организация > Номенклатура > details" "Валюта, НаименованиеБанка, ИНН" "details" "СчетМеждународногоУчета @name=ДанныеОтчета" ``` `@name=Имя` — присваивает имя группировке (`<dcsset:name>`). Используется для привязки шаблонов через `groupName`. ### modify-structure — изменить поля группировки существующей группы Тот же shorthand что и `set-structure`. Находит группу по `@name=`, заменяет только `<groupItems>` (поля группировки). Selection/order/filter/conditionalAppearance/outputParameters группы сохраняются. Без `@name=` — ошибка. ``` "Валюта @name=ДанныеОтчета" "Валюта, НаименованиеБанка @name=ДанныеОтчета" "details @name=ДанныеОтчета" ``` ### modify-field — изменить существующее поле Тот же shorthand что и `add-field`. Находит по dataPath, объединяет свойства (непустые переопределяют), сохраняет позицию. ``` "Цена [Цена USD]: decimal(10,4) @dimension" ``` ### set-field-role — установить роль поля Shorthand: `"<dataPath> [@флаги] [kv=значение]"`. **Полностью заменяет** роль поля. Если в значении только dataPath без флагов/kv — удаляет роль. ``` "Сумма" # снять роль полностью "СуммаОстаток @balance" # простая балансовая роль "СуммаНач @balance balanceGroupName=Сумма balanceType=OpeningBalance" # с уточнением "Контрагент @dimension parentDimension=Группа" "Период @period" # роль периода ``` Флаги: `@balance`, `@dimension`, `@account`, `@period`, `@required`, `@autoOrder`, `@ignoreNullValues`. KV: `balanceGroupName`, `balanceType` (OpeningBalance/ClosingBalance), `parentDimension`, `accountTypeExpression`, `orderType` (Asc/Desc), `expression`, `periodNumber`, `periodType`. Поддерживает пакетный режим (`;;`). ### modify-filter — изменить существующий фильтр Тот же shorthand что и `add-filter`. Находит по полю, обновляет оператор/значение/флаги. См. правило для `<use>` ниже. ### modify-dataParameter — изменить параметр данных Тот же shorthand что и `add-dataParameter`. Находит по имени, обновляет значение/флаги. См. правило для `<use>` ниже. #### Правило `<use>` для modify-filter / modify-dataParameter В отличие от `add-*`, в `modify-*` поле `<use>` обновляется **только если флаг задан явно**: - `@off` — установить `<use>false</use>` - `@on` — убрать существующий `<use>false</use>` (включить параметр) - ни `@off`, ни `@on` не задано — `<use>` не трогается, существующее значение сохраняется (важно: это значит, что отключённый параметр останется отключённым после модификации других свойств) ### remove-* и clear-* | Операция | Value | Действие | |----------|-------|----------| | `remove-field` | dataPath | Удаляет поле из набора + из selection варианта | | `remove-total` | dataPath | Удаляет итог | | `remove-calculated-field` | dataPath | Удаляет вычисляемое поле + из selection | | `remove-parameter` | name | Удаляет параметр | | `remove-filter` | поле | Удаляет первый фильтр с указанным полем | | `clear-selection` | `*` | Очищает все элементы selection | | `clear-order` | `*` | Очищает все элементы order | | `clear-filter` | `*` | Очищает все элементы filter | | `clear-conditionalAppearance` | `*` | Очищает все правила условного оформления | ## Верификация ``` /skd-validate <TemplatePath> — валидация структуры после редактирования /skd-info <TemplatePath> — визуальная сводка ```