mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-08-31 15:30:51 +03:00
fix(form-add): нотация параметров в документации и приём обиходных написаний
Таблица параметров и примеры в SKILL.md описывали слэш-нотацию (--set-default, --purpose), а скрипт принимает -SetDefault и -Purpose. Модель, читающая таблицу, получала отказ биндинга на первом же вызове. Документация приведена к исполняемой форме — она теперь одна. Заодно навык принимает обиходные написания молча: назначение формы русским названием вида формы или английским с суффиксом Form (регистр, пробелы и разделители не значимы) и флаг основной формы с дефисом внутри имени. Допустимость назначения для вида объекта по-прежнему проверяется — неизвестное значение отвергается со списком доступных. Порты выровнены: PS принимает это через алиас параметра, py — через перечисление опций; проверено девятью написаниями на обоих, результат совпадает. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
9efa336fc1
commit
aafc680ad5
@@ -1,7 +1,7 @@
|
||||
---
|
||||
name: form-add
|
||||
description: Добавить пустую управляемую форму к объекту 1С. Используй когда нужно создать у объекта новую форму
|
||||
argument-hint: <ObjectPath> <FormName> [Purpose] [--set-default]
|
||||
argument-hint: <ObjectPath> <FormName> [-Purpose <Purpose>] [-Synonym <Synonym>] [-SetDefault]
|
||||
allowed-tools:
|
||||
- Bash
|
||||
- Read
|
||||
@@ -18,7 +18,7 @@ allowed-tools:
|
||||
## Usage
|
||||
|
||||
```
|
||||
/form-add <ObjectPath> <FormName> [Purpose] [Synonym] [--set-default]
|
||||
/form-add <ObjectPath> <FormName> [-Purpose <Purpose>] [-Synonym <Synonym>] [-SetDefault]
|
||||
```
|
||||
|
||||
| Параметр | Обязательный | По умолчанию | Описание |
|
||||
@@ -27,7 +27,7 @@ allowed-tools:
|
||||
| FormName | да | — | Имя формы (ФормаДокумента) |
|
||||
| Purpose | нет | основная форма вида | Назначение формы — см. таблицу ниже: у справочника это форма объекта, у регистра сведений — форма записи, у журнала — форма списка |
|
||||
| Synonym | нет | = FormName | Синоним формы |
|
||||
| --set-default | нет | авто | Сделать основной. Без флага основной становится первая форма каждого назначения |
|
||||
| -SetDefault | нет | авто | Сделать основной. Без флага основной становится первая форма каждого назначения |
|
||||
|
||||
## Команда
|
||||
|
||||
@@ -70,19 +70,19 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/form-add.ps1" -Obje
|
||||
|
||||
```
|
||||
# Форма документа
|
||||
/form-add Documents/АвансовыйОтчет.xml ФормаДокумента --purpose Object
|
||||
/form-add Documents/АвансовыйОтчет.xml ФормаДокумента -Purpose Object
|
||||
|
||||
# Форма списка каталога
|
||||
/form-add Catalogs/Контрагенты.xml ФормаСписка --purpose List
|
||||
/form-add Catalogs/Контрагенты.xml ФормаСписка -Purpose List
|
||||
|
||||
# Форма записи регистра сведений
|
||||
/form-add InformationRegisters/КурсыВалют.xml ФормаЗаписи --purpose Record
|
||||
/form-add InformationRegisters/КурсыВалют.xml ФормаЗаписи -Purpose Record
|
||||
|
||||
# Форма выбора с синонимом
|
||||
/form-add Catalogs/Номенклатура.xml ФормаВыбора --purpose Choice --synonym "Выбор номенклатуры"
|
||||
/form-add Catalogs/Номенклатура.xml ФормаВыбора -Purpose Choice -Synonym "Выбор номенклатуры"
|
||||
|
||||
# Установить как форму по умолчанию
|
||||
/form-add Documents/Заказ.xml ФормаДокументаНовая --purpose Object --set-default
|
||||
/form-add Documents/Заказ.xml ФормаДокументаНовая -Purpose Object -SetDefault
|
||||
```
|
||||
|
||||
## Workflow
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# form-add v1.27 — Add managed form to 1C config object (+write_xml_file/write_utf8_bom: общий эталон записи)
|
||||
# form-add v1.28 — Add managed form to 1C config object
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
[CmdletBinding(PositionalBinding=$false)]
|
||||
param(
|
||||
@@ -15,6 +15,10 @@ param(
|
||||
# по умолчанию было бы неверным для видов, у которых формы объекта не бывает.
|
||||
[string]$Purpose = "",
|
||||
|
||||
# Алиас с дефисом внутри имени: вызов вида --set-default PowerShell разбирает как имя
|
||||
# параметра "set-default" и без алиаса отвечает отказом биндинга. Написания -SetDefault,
|
||||
# --SetDefault и --setdefault совпадают с именем параметра и так.
|
||||
[Alias('set-default')]
|
||||
[switch]$SetDefault
|
||||
)
|
||||
|
||||
@@ -424,6 +428,34 @@ Write-Host "Object: $objectType.$objectName"
|
||||
|
||||
# Назначение ищем в таблице регистронезависимо — как принимает PowerShell (в py-порту .lower()).
|
||||
$kindPurposes = $formKinds[$objectType]
|
||||
|
||||
# Обиходные написания назначения приводим к канону молча: русское название вида формы и
|
||||
# английское с суффиксом Form. Ключ нормализуем — регистр, пробелы и разделители не значимы.
|
||||
# Канон в документации один; здесь только приём ошибочного ввода, чтобы вызов не падал на форме
|
||||
# записи вместо назначения. Применимость назначения к виду объекта проверяется ниже как обычно.
|
||||
$purposeSynonyms = @{
|
||||
"формаобъекта"="Object"; "формаэлемента"="Object"; "формадокумента"="Object"
|
||||
"объект"="Object"; "элемент"="Object"; "документ"="Object"; "objectform"="Object"
|
||||
"формасписка"="List"; "список"="List"; "listform"="List"
|
||||
"формавыбора"="Choice"; "выбор"="Choice"; "choiceform"="Choice"
|
||||
"формагруппы"="Folder"; "группа"="Folder"; "folderform"="Folder"
|
||||
"формавыборагруппы"="FolderChoice"; "выборгруппы"="FolderChoice"; "folderchoiceform"="FolderChoice"
|
||||
"формазаписи"="Record"; "запись"="Record"; "recordform"="Record"
|
||||
"форманаборазаписей"="RecordSet"; "наборзаписей"="RecordSet"; "recordsetform"="RecordSet"
|
||||
"формасохранения"="Save"; "формасохранениянастроек"="Save"; "сохранение"="Save"; "saveform"="Save"
|
||||
"формазагрузки"="Load"; "формазагрузкинастроек"="Load"; "загрузка"="Load"; "loadform"="Load"
|
||||
"произвольная"="Custom"; "произвольнаяформа"="Custom"; "customform"="Custom"
|
||||
}
|
||||
if ($Purpose) {
|
||||
$purposeProbe = ($Purpose -replace '[\s_-]', '').ToLowerInvariant()
|
||||
$isKnownPurpose = $false
|
||||
foreach ($p in $kindPurposes.Keys) {
|
||||
if ($p.ToLowerInvariant() -eq $Purpose.ToLowerInvariant()) { $isKnownPurpose = $true; break }
|
||||
}
|
||||
if (-not $isKnownPurpose -and $purposeSynonyms.ContainsKey($purposeProbe)) {
|
||||
$Purpose = $purposeSynonyms[$purposeProbe]
|
||||
}
|
||||
}
|
||||
if (-not $Purpose) {
|
||||
foreach ($p in $kindPurposes.Keys) {
|
||||
if ($kindPurposes[$p].Primary) { $Purpose = $p; break }
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env python3
|
||||
# form-add v1.27 — Add managed form to 1C config object (+write_xml_file/write_utf8_bom: общий эталон записи)
|
||||
# form-add v1.28 — Add managed form to 1C config object (Python port)
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
|
||||
import argparse
|
||||
@@ -326,7 +326,10 @@ def main():
|
||||
# Пусто = основная форма вида (primary в таблице): у справочника это форма объекта,
|
||||
# у регистра сведений — форма записи, у журнала — форма списка.
|
||||
parser.add_argument("-Purpose", default="")
|
||||
parser.add_argument("-SetDefault", action="store_true")
|
||||
# Написания с дефисом внутри имени и с двойным дефисом: в PS-порте их принимает алиас
|
||||
# set-default, здесь — перечисление опций, чтобы порты принимали ровно одно и то же.
|
||||
parser.add_argument("-SetDefault", "--SetDefault", "--set-default", "-set-default",
|
||||
dest="SetDefault", action="store_true")
|
||||
args = ci_parse_args(parser)
|
||||
|
||||
object_path = args.ObjectPath
|
||||
@@ -610,6 +613,33 @@ def main():
|
||||
|
||||
# Назначение ищем в таблице регистронезависимо — как принимает PowerShell.
|
||||
kind_purposes = form_kinds[object_type]
|
||||
|
||||
# Обиходные написания назначения приводим к канону молча: русское название вида формы и
|
||||
# английское с суффиксом Form. Ключ нормализуем — регистр, пробелы и разделители не значимы.
|
||||
# Канон в документации один; здесь только приём ошибочного ввода, чтобы вызов не падал на форме
|
||||
# записи вместо назначения. Применимость назначения к виду объекта проверяется ниже как обычно.
|
||||
purpose_synonyms = {
|
||||
"формаобъекта": "Object", "формаэлемента": "Object", "формадокумента": "Object",
|
||||
"объект": "Object", "элемент": "Object", "документ": "Object", "objectform": "Object",
|
||||
"формасписка": "List", "список": "List", "listform": "List",
|
||||
"формавыбора": "Choice", "выбор": "Choice", "choiceform": "Choice",
|
||||
"формагруппы": "Folder", "группа": "Folder", "folderform": "Folder",
|
||||
"формавыборагруппы": "FolderChoice", "выборгруппы": "FolderChoice",
|
||||
"folderchoiceform": "FolderChoice",
|
||||
"формазаписи": "Record", "запись": "Record", "recordform": "Record",
|
||||
"форманаборазаписей": "RecordSet", "наборзаписей": "RecordSet", "recordsetform": "RecordSet",
|
||||
"формасохранения": "Save", "формасохранениянастроек": "Save", "сохранение": "Save",
|
||||
"saveform": "Save",
|
||||
"формазагрузки": "Load", "формазагрузкинастроек": "Load", "загрузка": "Load",
|
||||
"loadform": "Load",
|
||||
"произвольная": "Custom", "произвольнаяформа": "Custom", "customform": "Custom",
|
||||
}
|
||||
if purpose:
|
||||
purpose_probe = re.sub(r"[\s_-]", "", purpose).lower()
|
||||
is_known_purpose = any(k.lower() == purpose.lower() for k in kind_purposes)
|
||||
if not is_known_purpose and purpose_probe in purpose_synonyms:
|
||||
purpose = purpose_synonyms[purpose_probe]
|
||||
|
||||
if not purpose:
|
||||
for k, rule in kind_purposes.items():
|
||||
if rule.get("primary"):
|
||||
|
||||
Reference in New Issue
Block a user