From b4bc02bc9822b417c63e965b21b05e133594520e Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Sun, 6 Sep 2026 19:41:57 +0300 Subject: [PATCH] =?UTF-8?q?docs(meta-edit):=20=D0=BA=D0=B0=D1=81=D0=BA?= =?UTF-8?q?=D0=B0=D0=B4=20=D0=B8=D0=BD=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=86?= =?UTF-8?q?=D0=B8=D0=B9=20=D0=BF=D0=BE=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87?= =?UTF-8?q?=D0=B0=D0=BC=20=D0=B2=D0=BC=D0=B5=D1=81=D1=82=D0=BE=20=D0=BE?= =?UTF-8?q?=D0=B4=D0=BD=D0=BE=D0=B9=20=D0=BA=D1=83=D1=87=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit child-operations.md был на 191 строку и держал в одном файле реквизиты, поля внешнего источника, таблицы, функции, ТЧ, предопределённые и значения перечисления: модель, добавляющая реквизит, читала заодно про функции внешнего источника. Ось резки была механизмом (add/remove/ modify), а нужна сущность — как в meta-compile. SKILL.md: частое (команда, сводная таблица операций, быстрые примеры) плюс индекс «что правишь → файл». Остальное — reference/: attributes, tabular-sections, predefined, external-data-source, other-children, properties (бывший properties-reference), json-dsl. Попутно: везде «навык form-add», а не голое имя — иначе читается как команда оболочки или значение -Operation. Тексты предупреждений в обоих портах тоже. scripts/switch.py собирал .md только из корня навыка, подкаталоги не видел: команды запуска в reference/*.md молча остались бы на старом рантайме. Обход стал рекурсивным. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01NBsZA5cr2WFThtgp7i5WVi --- .claude/skills/meta-edit/SKILL.md | 51 ++--- .claude/skills/meta-edit/child-operations.md | 191 ------------------ .../skills/meta-edit/reference/attributes.md | 88 ++++++++ .../reference/external-data-source.md | 44 ++++ .../meta-edit/{ => reference}/json-dsl.md | 4 +- .../meta-edit/reference/other-children.md | 23 +++ .../skills/meta-edit/reference/predefined.md | 20 ++ .../properties.md} | 0 .../meta-edit/reference/tabular-sections.md | 56 +++++ .../skills/meta-edit/scripts/meta-edit.ps1 | 4 +- .claude/skills/meta-edit/scripts/meta-edit.py | 4 +- docs/python-porting-guide.md | 2 +- scripts/switch.py | 8 +- 13 files changed, 264 insertions(+), 231 deletions(-) delete mode 100644 .claude/skills/meta-edit/child-operations.md create mode 100644 .claude/skills/meta-edit/reference/attributes.md create mode 100644 .claude/skills/meta-edit/reference/external-data-source.md rename .claude/skills/meta-edit/{ => reference}/json-dsl.md (95%) create mode 100644 .claude/skills/meta-edit/reference/other-children.md create mode 100644 .claude/skills/meta-edit/reference/predefined.md rename .claude/skills/meta-edit/{properties-reference.md => reference/properties.md} (100%) create mode 100644 .claude/skills/meta-edit/reference/tabular-sections.md diff --git a/.claude/skills/meta-edit/SKILL.md b/.claude/skills/meta-edit/SKILL.md index 61929097d..fcd485283 100644 --- a/.claude/skills/meta-edit/SKILL.md +++ b/.claude/skills/meta-edit/SKILL.md @@ -35,51 +35,28 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/meta-edit.ps1" -Def | DefinitionFile | JSON-файл с операциями (альтернатива Operation) | | NoValidate | Не запускать meta-validate после правки | -## Операции — сводная таблица +## Частые операции -Batch через `;;` во всех операциях. Подробный синтаксис — в файлах по ссылкам. - -### Дочерние элементы — [child-operations.md](child-operations.md) +Batch через `;;` во всех операциях. | Операция | Формат Value | Пример | |----------|-------------|--------| | `add-attribute` | `Имя: Тип \| флаги` | `"Сумма: Число(15,2) \| req, index"` | -| `add-ts` | `ТЧ: Рекв1: Тип1, Рекв2: Тип2` | `"Товары: Ном: CatalogRef.Ном, Кол: Число(15,3)"` | | `add-dimension` | `Имя: Тип \| флаги` | `"Организация: CatalogRef.Организации \| master"` | | `add-resource` | `Имя: Тип` | `"Сумма: Число(15,2)"` | -| `add-enumValue` | `Имя` | `"Значение1 ;; Значение2"` | | `add-column` | `Имя: Тип` | `"Тип: EnumRef.ТипыДокументов"` | -| `add-command` | `Имя` | `"ОткрытьДосье"` | +| `add-ts` | `ТЧ: Рекв1: Тип1, Рекв2: Тип2` | `"Товары: Ном: CatalogRef.Ном, Кол: Число(15,3)"` | | `add-ts-attribute` | `ТЧ.Имя: Тип` | `"Товары.Скидка: Число(15,2)"` | | `remove-*` | `Имя` | `"СтарыйРеквизит ;; ЕщёОдин"` | | `remove-ts-attribute` | `ТЧ.Имя` | `"Товары.УстаревшийРекв"` | | `modify-attribute` | `Имя: ключ=значение` | `"СтароеИмя: name=НовоеИмя, type=Строка(500)"` | | `modify-ts-attribute` | `ТЧ.Имя: ключ=значение` | `"Товары.Рекв: name=НовоеИмя"` | | `modify-ts` | `ТЧ: ключ=значение` | `"Товары: synonym=Товарный состав"` | +| `modify-property` | `Ключ=Значение` | `"CodeLength=11 ;; DescriptionLength=150"` | Позиционная вставка: `"Склад: CatalogRef.Склады >> after Организация"`. -Форма — `form-add` / `form-remove`, макет — `template-add` / `template-remove`: кроме записи в `ChildObjects` -у них есть собственные файлы, и `meta-edit` их не трогает. - -`modify-attribute` умеет и структурные свойства реквизита — формат/подсказку, форму и параметры выбора, -значение заполнения, границы (`Format`, `ChoiceForm`, `ChoiceParameters`, `FillValue`, `MinValue`/`MaxValue` и др.). - -### Свойства объекта — [properties-reference.md](properties-reference.md) - -| Операция | Формат Value | Пример | -|----------|-------------|--------| -| `modify-property` | `Ключ=Значение` | `"CodeLength=11 ;; DescriptionLength=150"` | -| `add-owner` | `MetaType.Name` | `"Catalog.Контрагенты ;; Catalog.Организации"` | -| `add-registerRecord` | `MetaType.Name` | `"AccumulationRegister.ОстаткиТоваров"` | -| `add-basedOn` | `MetaType.Name` | `"Document.ЗаказКлиента"` | -| `add-inputByString` | `Путь поля` | `"StandardAttribute.Description"` | -| `set-owners` / `set-registerRecords` / `set-basedOn` / `set-inputByString` | Замена всего списка | `"Catalog.Орг ;; Catalog.Контр"` | -| `remove-owner` / `remove-registerRecord` / ... | Удаление из списка | `"Catalog.Контрагенты"` | - -### JSON DSL — [json-dsl.md](json-dsl.md) - -Для комбинированных операций (add + remove + modify в одном файле), синонимы ключей/типов, таблица поддерживаемых объектов. +Составной тип — через `+`: `"Значение: Строка + Число(15,2) + Дата"`. ## Быстрые примеры @@ -87,9 +64,6 @@ Batch через `;;` во всех операциях. Подробный си # Добавить реквизиты -Operation add-attribute -Value "Комментарий: Строка(200) ;; Сумма: Число(15,2) | index" -# Составной тип (несколько типов через +) --Operation add-attribute -Value "Значение: Строка + Число(15,2) + Дата + CatalogRef.Контрагенты" - # Добавить ТЧ с реквизитами -Operation add-ts -Value "Товары: Ном: CatalogRef.Ном | req, Кол: Число(15,3), Цена: Число(15,2)" @@ -106,6 +80,21 @@ Batch через `;;` во всех операциях. Подробный си -Operation set-owners -Value "Catalog.Контрагенты ;; Catalog.Организации" ``` +## Индекс: что правишь → файл + +| Что нужно | Файл | +|-----------|------| +| Реквизит, измерение, ресурс, графа: флаги, составные типы, структурные свойства (`Format`, `ChoiceParameters`, `FillValue`, …) | `reference/attributes.md` | +| Табличная часть и её реквизиты | `reference/tabular-sections.md` | +| Свойства самого объекта, списочные свойства (владельцы, движения, основание, ввод по строке) | `reference/properties.md` | +| Предопределённые элементы | `reference/predefined.md` | +| Значения перечисления, команды | `reference/other-children.md` | +| Внешний источник данных: поля, таблицы, функции | `reference/external-data-source.md` | +| Комбинированные операции в одном JSON, синонимы ключей и типов, какие дети допустимы у типа объекта | `reference/json-dsl.md` | + +Форму добавляет и удаляет навык `form-add` / `form-remove`, макет — навык `template-add` / +`template-remove`: кроме записи в `ChildObjects` у них есть собственные файлы, и `meta-edit` их не трогает. + ## Верификация ``` diff --git a/.claude/skills/meta-edit/child-operations.md b/.claude/skills/meta-edit/child-operations.md deleted file mode 100644 index 347fc948f..000000000 --- a/.claude/skills/meta-edit/child-operations.md +++ /dev/null @@ -1,191 +0,0 @@ -# Inline-операции над дочерними элементами - -Подробный справочник операций `add-*` / `remove-*` / `modify-*` для дочерних элементов объекта метаданных. - -## Общие правила - -**Batch-режим** — несколько элементов через `;;`: -``` --Value "Комментарий: Строка(200) ;; Сумма: Число(15,2) | index" -``` - -**Shorthand-формат** реквизитов: `ИмяРеквизита: Тип | флаги` - -Флаги: `req` — обязательное заполнение; `index` — индексировать; `master` — ведущее измерение (только dimensions); `mainFilter` — основной отбор (только dimensions). - -**Позиционная вставка**: `>> after ИмяЭлемента` или `<< before ИмяЭлемента`: -```powershell --Operation add-attribute -Value "Склад: CatalogRef.Склады >> after Организация" -``` - -## Составные типы - -Для реквизитов с несколькими допустимыми типами — разделитель `+`: -```powershell --Operation add-attribute -Value "Значение: Строка + Число(15,2) + Дата + CatalogRef.Контрагенты" --Operation add-attribute -Value "Значение: Строка + Число(15,2) | req" --Operation modify-ts-attribute -Value "Данные.Значение: type=Строка + Число(15,2) + Дата" -``` - -В JSON DSL — массив в `type`: -```json -{ "name": "Значение", "type": ["Строка", "Число(15,2)", "Дата", "CatalogRef.Контрагенты"] } -``` - -## add-attribute / add-dimension / add-resource / add-column - -```powershell --Operation add-attribute -Value "Комментарий: Строка(200)" --Operation add-attribute -Value "Сумма: Число(15,2) | req, index" --Operation add-attribute -Value "Ном: CatalogRef.Номенклатура | req ;; Кол: Число(15,3)" --Operation add-dimension -Value "Организация: CatalogRef.Организации | master, mainFilter" --Operation add-resource -Value "Сумма: Число(15,2)" --Operation add-column -Value "Тип: EnumRef.ТипыДокументов" -``` - -## add-field (таблица внешнего источника) - -Поле задаётся как обычный реквизит, плюс три своих ключа: `nameInDataSource` (умолчание — имя поля), -`readOnly`, `allowNull`. Флаги строковой формы — `readonly`, `nullable`. - -```json -{ "add": { "fields": [ - "barcode: String(20) | nullable", - { "name": "cost", "type": "Number(15,2)", "nameInDataSource": "cost_net", "readOnly": true } -] } } -``` - -## add-tables / add-functions (внешний источник данных) - -На файле источника (`ExternalDataSources/<Имя>.xml`) добавляются таблицы и функции. Таблица — -единственная операция навыка, создающая **файл**: `<Источник>/Tables/<Имя>.xml` плюс имя в -`ChildObjects` источника. Синтаксис таблицы тот же, что в `meta-compile` -(см. `reference/external-data-source.md` там же). - -```json -{ "add": { - "tables": { "sales": { "keyFields": ["id"], "fields": ["id: Number(10,0)", "summa: Number(15,2)"] } }, - "functions": { "nextKey": "NEXT VALUE FOR public.seq_key" } -} } -``` - -Удалить таблицу — `meta-remove ExternalDataSource.<Источник>.Table.<Таблица>`. - -## add-ts - -Формат: `ИмяТЧ: Реквизит1: Тип1, Реквизит2: Тип2, ...` - -```powershell --Operation add-ts -Value "Товары: Ном: CatalogRef.Ном | req, Кол: Число(15,3), Цена: Число(15,2), Сумма: Число(15,2)" -``` - -## add-ts-attribute / remove-ts-attribute / modify-ts-attribute - -Операции над реквизитами **внутри существующей ТЧ**. Формат: `ИмяТЧ.ОпределениеРеквизита` (dot-нотация). - -```powershell -# Добавить реквизит в ТЧ --Operation add-ts-attribute -Value "Товары.СтавкаНДС: EnumRef.СтавкиНДС" --Operation add-ts-attribute -Value "Товары.Скидка: Число(15,2) ;; Товары.Бонус: Число(15,2)" - -# Позиционная вставка в ТЧ --Operation add-ts-attribute -Value "Товары.Скидка: Число(15,2) >> after Цена" - -# Удалить реквизит из ТЧ --Operation remove-ts-attribute -Value "Товары.УстаревшийРекв" --Operation remove-ts-attribute -Value "Товары.Рекв1 ;; Товары.Рекв2" - -# Изменить реквизит в ТЧ (rename, type change и т.д.) --Operation modify-ts-attribute -Value "Товары.СтароеИмя: name=НовоеИмя, type=Строка(500)" -``` - -Batch через `;;` — можно указать разные ТЧ: `"Товары.А: Строка(50) ;; Услуги.Б: Число(10)"`. - -## modify-ts - -Изменение свойств **самой табличной части** (Synonym, FillChecking, Use и др.): - -```powershell --Operation modify-ts -Value "Товары: synonym=Товарный состав" --Operation modify-ts -Value "Товары: fillChecking=ShowError" -``` - -Формат аналогичен `modify-attribute`: `ИмяТЧ: ключ=значение, ключ=значение`. - -## add-predefined - -Добавить предопределённые элементы (Catalog, ChartOfCharacteristicTypes). Существующие элементы и их -идентификаторы сохраняются, новые получают свежий id. - -Inline — строка `(Код) Имя [Наименование]` (batch через `;;`; `[Наименование]` необязательно — иначе авто из имени): -```powershell --Operation add-predefined -Value "(001) Основной ;; (002) Резервный [Резервный склад]" -``` - -JSON — строки и/или объекты (для групп с вложенными): -```json -{ "add": { "predefined": [ - "(001) Основной", - { "name": "Группа", "isFolder": true, "childItems": ["(002) Вложенный"] } -] } } -``` - -Ключи объекта: `name`, `code`, `description`, `isFolder`, `childItems` (дерево). Тип кода (строковый/числовой) -берётся из объекта автоматически. - -## add-enumValue / add-command - -Просто имена (batch через `;;`): -```powershell --Operation add-enumValue -Value "Значение1 ;; Значение2 ;; Значение3" --Operation add-command -Value "Команда1" -``` - -Команда создаётся вместе с заготовкой модуля `Commands/<Имя>/Ext/CommandModule.bsl`. - -Формы и макеты этот навык не добавляет и не удаляет — у них есть собственные файлы: -`form-add` / `form-remove` и `template-add` / `template-remove`. - -## remove-* - -Имя элемента (или несколько через `;;`): -```powershell --Operation remove-attribute -Value "СтарыйРеквизит ;; ЕщёОдин" --Operation remove-ts -Value "УстаревшаяТЧ" --Operation remove-enumValue -Value "НеиспользуемоеЗначение" -``` - -## modify-attribute / modify-dimension / modify-resource / modify-enumValue / modify-column - -Формат: `ИмяЭлемента: ключ=значение, ключ=значение` - -**Спец-операции** (строчные ключи): `name` (переименование), `type` (смена типа), `synonym`. - -**Свойства** задавайте по имени свойства 1С (PascalCase, как в конфигураторе): `Indexing`, `FillChecking`, -`Use`, `FullTextSearch`, `DataHistory`, `PasswordMode`, `MultiLine`, `Mask`, `CreateOnInput`, `QuickChoice` и др. -Свойство можно задать, даже если у реквизита оно ещё не выставлено. - -```powershell --Operation modify-attribute -Value "СтароеИмя: name=НовоеИмя, type=Строка(500)" --Operation modify-attribute -Value "Комментарий: Indexing=Index, FullTextSearch=Use" --Operation modify-enumValue -Value "СтароеЗначение: name=НовоеЗначение" -``` - -### Структурные свойства реквизита - -Свойства со сложным значением задавайте через JSON DSL (`{ "modify": { "attributes": { "Имя": { ... } } } }`): - -| Ключ | Значение | Пример (JSON) | -|------|----------|---------------| -| `Format` / `EditFormat` / `ToolTip` | строка (мультиязычная) | `"Format": "ДФ=dd.MM.yyyy"` | -| `ChoiceForm` | путь формы выбора | `"ChoiceForm": "Catalog.Товары.Form.ФормаВыбора"` | -| `MinValue` / `MaxValue` | число или строка | `"MinValue": 0, "MaxValue": 100` | -| `FillValue` | значение заполнения | `"FillValue": "EmptyRef"` · `true` · `10` · `{"nil": true}` | -| `LinkByType` | `{dataPath, linkItem?}` | `"LinkByType": {"dataPath": "Вид", "linkItem": 0}` | -| `ChoiceParameterLinks` | `[{name, dataPath, valueChange?}]` | `["Отбор.Организация=Организация"]` | -| `ChoiceParameters` | `[{name, type?, value?}]` | `[{"name": "Отбор.ЭтоГруппа", "value": false}]` | - -- `FillValue`: `"EmptyRef"` — пустая ссылка по типу реквизита; `{"emptyRef": true}` / `{"nil": true}` — явные маркеры. -- `ChoiceParameters` value — булево/число/строка/ссылочный путь или массив; укажите `type` (напр. - `EnumRef.СтавкиНДС`), чтобы задавать значения короткими именами (`"Оптовая"` вместо полного пути). -- В путях данных (`LinkByType`/`ChoiceParameterLinks`) можно писать короткое имя реквизита вместо полного пути. diff --git a/.claude/skills/meta-edit/reference/attributes.md b/.claude/skills/meta-edit/reference/attributes.md new file mode 100644 index 000000000..e8b8e0933 --- /dev/null +++ b/.claude/skills/meta-edit/reference/attributes.md @@ -0,0 +1,88 @@ +# Реквизиты, измерения, ресурсы, графы + +Операции над «плоскими» дочерними элементами объекта: реквизит (`attribute`), измерение (`dimension`), +ресурс (`resource`), графа журнала (`column`). Синтаксис у всех один. + +## Общие правила + +**Batch-режим** — несколько элементов через `;;`: +``` +-Value "Комментарий: Строка(200) ;; Сумма: Число(15,2) | index" +``` + +**Shorthand-формат**: `ИмяРеквизита: Тип | флаги` + +Флаги: `req` — обязательное заполнение; `index` — индексировать; `master` — ведущее измерение (только +измерения); `mainFilter` — основной отбор (только измерения). + +**Позиционная вставка**: `>> after ИмяЭлемента` или `<< before ИмяЭлемента`: +```powershell +-Operation add-attribute -Value "Склад: CatalogRef.Склады >> after Организация" +``` + +## Составные типы + +Разделитель `+`: +```powershell +-Operation add-attribute -Value "Значение: Строка + Число(15,2) + Дата + CatalogRef.Контрагенты" +-Operation add-attribute -Value "Значение: Строка + Число(15,2) | req" +``` + +В JSON DSL — массив в `type`: +```json +{ "name": "Значение", "type": ["Строка", "Число(15,2)", "Дата", "CatalogRef.Контрагенты"] } +``` + +## add-attribute / add-dimension / add-resource / add-column + +```powershell +-Operation add-attribute -Value "Комментарий: Строка(200)" +-Operation add-attribute -Value "Сумма: Число(15,2) | req, index" +-Operation add-attribute -Value "Ном: CatalogRef.Номенклатура | req ;; Кол: Число(15,3)" +-Operation add-dimension -Value "Организация: CatalogRef.Организации | master, mainFilter" +-Operation add-resource -Value "Сумма: Число(15,2)" +-Operation add-column -Value "Тип: EnumRef.ТипыДокументов" +``` + +## remove-* + +Имя элемента (или несколько через `;;`): +```powershell +-Operation remove-attribute -Value "СтарыйРеквизит ;; ЕщёОдин" +-Operation remove-enumValue -Value "НеиспользуемоеЗначение" +``` + +## modify-attribute / modify-dimension / modify-resource / modify-enumValue / modify-column + +Формат: `ИмяЭлемента: ключ=значение, ключ=значение` + +**Спец-операции** (строчные ключи): `name` (переименование), `type` (смена типа), `synonym`. + +**Свойства** задавайте по имени свойства 1С (PascalCase, как в конфигураторе): `Indexing`, `FillChecking`, +`Use`, `FullTextSearch`, `DataHistory`, `PasswordMode`, `MultiLine`, `Mask`, `CreateOnInput`, `QuickChoice` и др. +Свойство можно задать, даже если у реквизита оно ещё не выставлено. + +```powershell +-Operation modify-attribute -Value "СтароеИмя: name=НовоеИмя, type=Строка(500)" +-Operation modify-attribute -Value "Комментарий: Indexing=Index, FullTextSearch=Use" +-Operation modify-enumValue -Value "СтароеЗначение: name=НовоеЗначение" +``` + +## Структурные свойства реквизита + +Свойства со сложным значением задавайте через JSON DSL (`{ "modify": { "attributes": { "Имя": { ... } } } }`): + +| Ключ | Значение | Пример (JSON) | +|------|----------|---------------| +| `Format` / `EditFormat` / `ToolTip` | строка (мультиязычная) | `"Format": "ДФ=dd.MM.yyyy"` | +| `ChoiceForm` | путь формы выбора | `"ChoiceForm": "Catalog.Товары.Form.ФормаВыбора"` | +| `MinValue` / `MaxValue` | число или строка | `"MinValue": 0, "MaxValue": 100` | +| `FillValue` | значение заполнения | `"FillValue": "EmptyRef"` · `true` · `10` · `{"nil": true}` | +| `LinkByType` | `{dataPath, linkItem?}` | `"LinkByType": {"dataPath": "Вид", "linkItem": 0}` | +| `ChoiceParameterLinks` | `[{name, dataPath, valueChange?}]` | `["Отбор.Организация=Организация"]` | +| `ChoiceParameters` | `[{name, type?, value?}]` | `[{"name": "Отбор.ЭтоГруппа", "value": false}]` | + +- `FillValue`: `"EmptyRef"` — пустая ссылка по типу реквизита; `{"emptyRef": true}` / `{"nil": true}` — явные маркеры. +- `ChoiceParameters` value — булево/число/строка/ссылочный путь или массив; укажите `type` (напр. + `EnumRef.СтавкиНДС`), чтобы задавать значения короткими именами (`"Оптовая"` вместо полного пути). +- В путях данных (`LinkByType`/`ChoiceParameterLinks`) можно писать короткое имя реквизита вместо полного пути. diff --git a/.claude/skills/meta-edit/reference/external-data-source.md b/.claude/skills/meta-edit/reference/external-data-source.md new file mode 100644 index 000000000..d44661176 --- /dev/null +++ b/.claude/skills/meta-edit/reference/external-data-source.md @@ -0,0 +1,44 @@ +# Внешние источники данных + +Точечные правки внутри уже созданного источника: поле в таблицу, таблица и функция в источник. +Источник целиком собирает навык `meta-compile` — его повторный запуск заменяет файл источника, +выдаёт новый uuid и оставляет сиротами таблицы, которых нет в описании. + +## add-field — поле таблицы + +Правится файл таблицы: `ExternalDataSources/<Источник>/Tables/<Таблица>.xml`. + +Поле задаётся как обычный реквизит, плюс три своих ключа: `nameInDataSource` (умолчание — имя поля), +`readOnly`, `allowNull`. Флаги строковой формы — `readonly`, `nullable`. + +```json +{ "add": { "fields": [ + "barcode: String(20) | nullable", + { "name": "cost", "type": "Number(15,2)", "nameInDataSource": "cost_net", "readOnly": true } +] } } +``` + +Типы поля: `Number`, `String`, `Date`, `Boolean`, `UUID`, `BinaryData` и ссылка на таблицу того же +источника — `ExternalDataSourceTableRef.<Источник>.<Таблица>`. Составной тип платформа запрещает. + +## add-tables / add-functions — в файле источника + +Правится файл источника: `ExternalDataSources/<Источник>.xml`. Таблица — единственная операция +навыка, создающая **файл**: `<Источник>/Tables/<Имя>.xml` плюс имя в `ChildObjects` источника. +Синтаксис таблицы и функции тот же, что у навыка `meta-compile` (`reference/external-data-source.md` там же). + +```json +{ "add": { + "tables": { "sales": { "keyFields": ["id"], "fields": ["id: Number(10,0)", "summa: Number(15,2)"] } }, + "functions": { "nextKey": "NEXT VALUE FOR public.seq_key" } +} } +``` + +При добавлении таблицы не поддержаны ключи `characteristics` и `default*Form` — навык отвергает их, +а не проглатывает молча. Характеристики задаются при сборке источника навыком `meta-compile`, +форму назначает навык `form-add`. + +## Удаление + +Таблицу удаляет навык `meta-remove`: `ExternalDataSource.<Источник>.Table.<Таблица>` — вместе с файлом +и записью в `ChildObjects`. Весь источник — `ExternalDataSource.<Источник>`. diff --git a/.claude/skills/meta-edit/json-dsl.md b/.claude/skills/meta-edit/reference/json-dsl.md similarity index 95% rename from .claude/skills/meta-edit/json-dsl.md rename to .claude/skills/meta-edit/reference/json-dsl.md index e4edcac40..5036009ca 100644 --- a/.claude/skills/meta-edit/json-dsl.md +++ b/.claude/skills/meta-edit/reference/json-dsl.md @@ -120,7 +120,7 @@ powershell.exe -NoProfile -File ${CLAUDE_SKILL_DIR}/scripts/meta-edit.ps1 -Defin | properties | свойства | Формы и макеты `meta-edit` не добавляет и не удаляет: кроме записи в `ChildObjects` у них есть собственные файлы. -Форма — `form-add` / `form-remove`, макет — `template-add` / `template-remove`. Команда файла не имеет — её `meta-edit` добавляет сам. +Форма — навыки `form-add` / `form-remove`, макет — `template-add` / `template-remove`. Команда файла не имеет — её `meta-edit` добавляет сам. ## Составные типы @@ -150,4 +150,4 @@ powershell.exe -NoProfile -File ${CLAUDE_SKILL_DIR}/scripts/meta-edit.ps1 -Defin | ExternalDataSource | tables, functions | | Table (таблица внешнего источника) | fields, commands | -У `Constant` добавлять нечего: единственный её ребёнок — форма, а форму добавляет `form-add`. +У `Constant` добавлять нечего: единственный её ребёнок — форма, а форму добавляет навык `form-add`. diff --git a/.claude/skills/meta-edit/reference/other-children.md b/.claude/skills/meta-edit/reference/other-children.md new file mode 100644 index 000000000..2d7fc0cfd --- /dev/null +++ b/.claude/skills/meta-edit/reference/other-children.md @@ -0,0 +1,23 @@ +# Значения перечисления и команды + +## add-enumValue / add-command + +Просто имена (batch через `;;`): +```powershell +-Operation add-enumValue -Value "Значение1 ;; Значение2 ;; Значение3" +-Operation add-command -Value "ОткрытьДосье" +``` + +Команда создаётся вместе с заготовкой модуля `Commands/<Имя>/Ext/CommandModule.bsl`. + +## Формы и макеты — другими навыками + +Кроме записи в `ChildObjects` у формы и макета есть собственные файлы, поэтому `meta-edit` их +не добавляет и не удаляет: + +| Что | Добавить | Удалить | +|-----|----------|---------| +| Форма | навык `form-add` | навык `form-remove` | +| Макет | навык `template-add` | навык `template-remove` | + +Содержимое формы собирает навык `form-compile`. diff --git a/.claude/skills/meta-edit/reference/predefined.md b/.claude/skills/meta-edit/reference/predefined.md new file mode 100644 index 000000000..fbb2f9344 --- /dev/null +++ b/.claude/skills/meta-edit/reference/predefined.md @@ -0,0 +1,20 @@ +# Предопределённые элементы + +Добавить предопределённые элементы (Catalog, ChartOfCharacteristicTypes). Существующие элементы и их +идентификаторы сохраняются, новые получают свежий id. + +Inline — строка `(Код) Имя [Наименование]` (batch через `;;`; `[Наименование]` необязательно — иначе авто из имени): +```powershell +-Operation add-predefined -Value "(001) Основной ;; (002) Резервный [Резервный склад]" +``` + +JSON — строки и/или объекты (для групп с вложенными): +```json +{ "add": { "predefined": [ + "(001) Основной", + { "name": "Группа", "isFolder": true, "childItems": ["(002) Вложенный"] } +] } } +``` + +Ключи объекта: `name`, `code`, `description`, `isFolder`, `childItems` (дерево). Тип кода (строковый/числовой) +берётся из объекта автоматически. diff --git a/.claude/skills/meta-edit/properties-reference.md b/.claude/skills/meta-edit/reference/properties.md similarity index 100% rename from .claude/skills/meta-edit/properties-reference.md rename to .claude/skills/meta-edit/reference/properties.md diff --git a/.claude/skills/meta-edit/reference/tabular-sections.md b/.claude/skills/meta-edit/reference/tabular-sections.md new file mode 100644 index 000000000..952bbb835 --- /dev/null +++ b/.claude/skills/meta-edit/reference/tabular-sections.md @@ -0,0 +1,56 @@ +# Табличные части + +Операции над табличной частью и её реквизитами. Общие правила shorthand-формата, флагов, batch и +позиционной вставки — в `attributes.md`. + +## add-ts + +Формат: `ИмяТЧ: Реквизит1: Тип1, Реквизит2: Тип2, ...` + +```powershell +-Operation add-ts -Value "Товары: Ном: CatalogRef.Ном | req, Кол: Число(15,3), Цена: Число(15,2), Сумма: Число(15,2)" +``` + +## add-ts-attribute / remove-ts-attribute / modify-ts-attribute + +Операции над реквизитами **внутри существующей ТЧ**. Формат: `ИмяТЧ.ОпределениеРеквизита` (dot-нотация). + +```powershell +# Добавить реквизит в ТЧ +-Operation add-ts-attribute -Value "Товары.СтавкаНДС: EnumRef.СтавкиНДС" +-Operation add-ts-attribute -Value "Товары.Скидка: Число(15,2) ;; Товары.Бонус: Число(15,2)" + +# Позиционная вставка в ТЧ +-Operation add-ts-attribute -Value "Товары.Скидка: Число(15,2) >> after Цена" + +# Удалить реквизит из ТЧ +-Operation remove-ts-attribute -Value "Товары.УстаревшийРекв" +-Operation remove-ts-attribute -Value "Товары.Рекв1 ;; Товары.Рекв2" + +# Изменить реквизит в ТЧ (rename, type change и т.д.) +-Operation modify-ts-attribute -Value "Товары.СтароеИмя: name=НовоеИмя, type=Строка(500)" +``` + +Batch через `;;` — можно указать разные ТЧ: `"Товары.А: Строка(50) ;; Услуги.Б: Число(10)"`. + +Составной тип реквизита ТЧ: +```powershell +-Operation modify-ts-attribute -Value "Данные.Значение: type=Строка + Число(15,2) + Дата" +``` + +## modify-ts + +Изменение свойств **самой табличной части** (Synonym, FillChecking, Use и др.): + +```powershell +-Operation modify-ts -Value "Товары: synonym=Товарный состав" +-Operation modify-ts -Value "Товары: fillChecking=ShowError" +``` + +Формат аналогичен `modify-attribute`: `ИмяТЧ: ключ=значение, ключ=значение`. + +## remove-ts + +```powershell +-Operation remove-ts -Value "УстаревшаяТЧ" +``` diff --git a/.claude/skills/meta-edit/scripts/meta-edit.ps1 b/.claude/skills/meta-edit/scripts/meta-edit.ps1 index 0ef68623c..e6a68bed6 100644 --- a/.claude/skills/meta-edit/scripts/meta-edit.ps1 +++ b/.claude/skills/meta-edit/scripts/meta-edit.ps1 @@ -1,4 +1,4 @@ -# meta-edit v1.48 — Edit existing 1C metadata object XML +# meta-edit v1.49 — Edit existing 1C metadata object XML # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills [CmdletBinding(PositionalBinding=$false)] param( @@ -2246,7 +2246,7 @@ function Process-Add($addDef) { if ($tv) { foreach ($k in @("characteristics","defaultObjectForm","defaultRecordForm","defaultListForm","defaultChoiceForm")) { if ($tv.$k) { - Warn "Ключ '$k' не поддержан при добавлении таблицы: форму назначает form-add, характеристики — meta-compile. Таблица '$tblName' пропущена." + Warn "Ключ '$k' не поддержан при добавлении таблицы: форму назначает навык form-add, характеристики — навык meta-compile. Таблица '$tblName' пропущена." $tblName = $null; break } } diff --git a/.claude/skills/meta-edit/scripts/meta-edit.py b/.claude/skills/meta-edit/scripts/meta-edit.py index f7498ec08..21ec04b8a 100644 --- a/.claude/skills/meta-edit/scripts/meta-edit.py +++ b/.claude/skills/meta-edit/scripts/meta-edit.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# meta-edit v1.48 — Edit existing 1C metadata object XML +# meta-edit v1.49 — Edit existing 1C metadata object XML # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse @@ -2200,7 +2200,7 @@ def process_add(add_def): bad_key = next((k for k in ('characteristics', 'defaultObjectForm', 'defaultRecordForm', 'defaultListForm', 'defaultChoiceForm') if tv.get(k)), None) if bad_key: - warn(f"Ключ '{bad_key}' не поддержан при добавлении таблицы: форму назначает form-add, характеристики — meta-compile. Таблица '{tbl_name}' пропущена.") + warn(f"Ключ '{bad_key}' не поддержан при добавлении таблицы: форму назначает навык form-add, характеристики — навык meta-compile. Таблица '{tbl_name}' пропущена.") continue if tbl_name in existing_names: warn(f"Table '{tbl_name}' already exists, skipping") diff --git a/docs/python-porting-guide.md b/docs/python-porting-guide.md index 505b88451..ff8da090d 100644 --- a/docs/python-porting-guide.md +++ b/docs/python-porting-guide.md @@ -26,7 +26,7 @@ python scripts/switch-to-python.py python scripts/switch-to-powershell.py ``` -Скрипты обрабатывают все `.md` файлы в `.claude/skills/*/` (SKILL.md, json-dsl.md и др.). Идемпотентны — повторный запуск безопасен. Python-only навыки (img-grid) пропускаются при переключении на PowerShell. +Скрипты обрабатывают все `.md` файлы навыка, включая подкаталоги (SKILL.md, `reference/*.md` и др.). Идемпотентны — повторный запуск безопасен. Python-only навыки (img-grid) пропускаются при переключении на PowerShell. ## Принцип самодостаточности diff --git a/scripts/switch.py b/scripts/switch.py index 5f131e850..a5577a3a8 100644 --- a/scripts/switch.py +++ b/scripts/switch.py @@ -160,8 +160,12 @@ def scan_skills(skills_dir): def collect_md_files(skill_dir): - """Return list of .md files in a skill directory.""" - return sorted(glob.glob(os.path.join(skill_dir, '*.md'))) + """Return list of .md files in a skill directory, including subdirectories. + + Команды запуска живут не только в SKILL.md: у навыков с каскадом инструкций + они есть и в reference/*.md. Нерекурсивный обход молча оставлял бы их на старом рантайме. + """ + return sorted(glob.glob(os.path.join(skill_dir, '**', '*.md'), recursive=True)) def classify_skill_runtime(skill_dir):