diff --git a/.claude/skills/form-add/SKILL.md b/.claude/skills/form-add/SKILL.md index 0de9be7f..9b93eb05 100644 --- a/.claude/skills/form-add/SKILL.md +++ b/.claude/skills/form-add/SKILL.md @@ -75,6 +75,23 @@ powershell.exe -NoProfile -File .claude\skills\form-add\scripts\form-add.ps1 -Fo Группы и таблицы поддерживают `children`/`columns` для вложенных элементов. +### Кнопки: command и stdCommand + +- `"command": "ИмяКоманды"` → `Form.Command.ИмяКоманды` +- `"stdCommand": "Close"` → `Form.StandardCommand.Close` +- `"stdCommand": "Товары.Add"` → `Form.Item.Товары.StandardCommand.Add` (стандартная команда элемента) + +### Допустимые события (`on`) + +Компилятор предупреждает об ошибках в именах событий. Основные: + +- **input**: `OnChange`, `StartChoice`, `ChoiceProcessing`, `Clearing`, `AutoComplete`, `TextEditEnd` +- **check**: `OnChange` +- **table**: `OnStartEdit`, `OnEditEnd`, `OnChange`, `Selection`, `BeforeAddRow`, `BeforeDeleteRow`, `OnActivateRow` +- **label/picture**: `Click`, `URLProcessing` +- **pages**: `OnCurrentPageChange` +- **button**: `Click` + ### Система типов (для attributes) `string`, `string(100)`, `decimal(15,2)`, `boolean`, `date`, `dateTime`, `CatalogRef.XXX`, `DocumentObject.XXX`, `ValueTable`, `DynamicList`, `Type1 | Type2` (составной). diff --git a/.claude/skills/form-add/scripts/form-add.ps1 b/.claude/skills/form-add/scripts/form-add.ps1 index 8604656b..9f8cc0b6 100644 --- a/.claude/skills/form-add/scripts/form-add.ps1 +++ b/.claude/skills/form-add/scripts/form-add.ps1 @@ -233,9 +233,37 @@ function Get-ElementName { return "$($el.$typeKey)" } +$script:knownEvents = @{ + "input" = @("OnChange","StartChoice","ChoiceProcessing","AutoComplete","TextEditEnd","Clearing","Creating","EditTextChange") + "check" = @("OnChange") + "label" = @("Click","URLProcessing") + "labelField"= @("OnChange","StartChoice","ChoiceProcessing","Click","URLProcessing","Clearing") + "table" = @("Selection","BeforeAddRow","AfterDeleteRow","BeforeDeleteRow","OnActivateRow","OnEditEnd","OnStartEdit","BeforeRowChange","BeforeEditEnd","ValueChoice","OnActivateCell","OnActivateField","Drag","DragStart","DragCheck","DragEnd","OnGetDataAtServer","BeforeLoadUserSettingsAtServer","OnUpdateUserSettingSetAtServer","OnChange") + "pages" = @("OnCurrentPageChange") + "page" = @("OnCurrentPageChange") + "button" = @("Click") + "picField" = @("OnChange","StartChoice","ChoiceProcessing","Click","Clearing") + "calendar" = @("OnChange","OnActivate") + "picture" = @("Click") + "cmdBar" = @() + "popup" = @() + "group" = @() +} + function Emit-Events { - param($el, [string]$elementName, [string]$indent) + param($el, [string]$elementName, [string]$indent, [string]$typeKey) if (-not $el.on) { return } + + # Validate event names + if ($typeKey -and $script:knownEvents.ContainsKey($typeKey)) { + $allowed = $script:knownEvents[$typeKey] + foreach ($evt in $el.on) { + if ($allowed.Count -gt 0 -and $allowed -notcontains "$evt") { + Write-Host "[WARN] Unknown event '$evt' for $typeKey '$elementName'. Known: $($allowed -join ', ')" + } + } + } + X "$indent" foreach ($evt in $el.on) { $evtName = "$evt" @@ -323,7 +351,7 @@ function Emit-Input { if ($el.inputHint) { Emit-MLText -tag "InputHint" -text "$($el.inputHint)" -indent $inner } Emit-Companion -tag "ContextMenu" -name "${name}КонтекстноеМеню" -indent $inner Emit-Companion -tag "ExtendedTooltip" -name "${name}РасширеннаяПодсказка" -indent $inner - Emit-Events -el $el -elementName $name -indent $inner + Emit-Events -el $el -elementName $name -indent $inner -typeKey "input" X "$indent" } @@ -337,7 +365,7 @@ function Emit-Check { if ($el.titleLocation) { X "$inner$($el.titleLocation)" } Emit-Companion -tag "ContextMenu" -name "${name}КонтекстноеМеню" -indent $inner Emit-Companion -tag "ExtendedTooltip" -name "${name}РасширеннаяПодсказка" -indent $inner - Emit-Events -el $el -elementName $name -indent $inner + Emit-Events -el $el -elementName $name -indent $inner -typeKey "check" X "$indent" } @@ -362,7 +390,7 @@ function Emit-Label { if ($el.height) { X "$inner$($el.height)" } Emit-Companion -tag "ContextMenu" -name "${name}КонтекстноеМеню" -indent $inner Emit-Companion -tag "ExtendedTooltip" -name "${name}РасширеннаяПодсказка" -indent $inner - Emit-Events -el $el -elementName $name -indent $inner + Emit-Events -el $el -elementName $name -indent $inner -typeKey "label" X "$indent" } @@ -376,7 +404,7 @@ function Emit-LabelField { if ($el.hyperlink -eq $true) { X "$innertrue" } Emit-Companion -tag "ContextMenu" -name "${name}КонтекстноеМеню" -indent $inner Emit-Companion -tag "ExtendedTooltip" -name "${name}РасширеннаяПодсказка" -indent $inner - Emit-Events -el $el -elementName $name -indent $inner + Emit-Events -el $el -elementName $name -indent $inner -typeKey "labelField" X "$indent" } @@ -405,7 +433,7 @@ function Emit-Table { foreach ($col in $el.columns) { Emit-Element -el $col -indent "$inner`t" } X "$inner" } - Emit-Events -el $el -elementName $name -indent $inner + Emit-Events -el $el -elementName $name -indent $inner -typeKey "table" X "$indent" } @@ -416,7 +444,7 @@ function Emit-Pages { if ($el.pagesRepresentation) { X "$inner$($el.pagesRepresentation)" } Emit-CommonFlags -el $el -indent $inner Emit-Companion -tag "ExtendedTooltip" -name "${name}РасширеннаяПодсказка" -indent $inner - Emit-Events -el $el -elementName $name -indent $inner + Emit-Events -el $el -elementName $name -indent $inner -typeKey "pages" if ($el.children -and $el.children.Count -gt 0) { X "$inner" foreach ($child in $el.children) { Emit-Element -el $child -indent "$inner`t" } @@ -453,7 +481,14 @@ function Emit-Button { X "$inner$btnType" } if ($el.command) { X "$innerForm.Command.$($el.command)" } - if ($el.stdCommand) { X "$innerForm.StandardCommand.$($el.stdCommand)" } + if ($el.stdCommand) { + $sc = "$($el.stdCommand)" + if ($sc -match '^(.+)\.(.+)$') { + X "$innerForm.Item.$($Matches[1]).StandardCommand.$($Matches[2])" + } else { + X "$innerForm.StandardCommand.$sc" + } + } Emit-Title -el $el -name $name -indent $inner Emit-CommonFlags -el $el -indent $inner if ($el.defaultButton -eq $true) { X "$innertrue" } @@ -466,7 +501,7 @@ function Emit-Button { if ($el.representation) { X "$inner$($el.representation)" } if ($el.locationInCommandBar) { X "$inner$($el.locationInCommandBar)" } Emit-Companion -tag "ExtendedTooltip" -name "${name}РасширеннаяПодсказка" -indent $inner - Emit-Events -el $el -elementName $name -indent $inner + Emit-Events -el $el -elementName $name -indent $inner -typeKey "button" X "$indent" } @@ -485,7 +520,7 @@ function Emit-PictureDecoration { if ($el.height) { X "$inner$($el.height)" } Emit-Companion -tag "ContextMenu" -name "${name}КонтекстноеМеню" -indent $inner Emit-Companion -tag "ExtendedTooltip" -name "${name}РасширеннаяПодсказка" -indent $inner - Emit-Events -el $el -elementName $name -indent $inner + Emit-Events -el $el -elementName $name -indent $inner -typeKey "picture" X "$indent" } @@ -500,7 +535,7 @@ function Emit-PictureField { if ($el.height) { X "$inner$($el.height)" } Emit-Companion -tag "ContextMenu" -name "${name}КонтекстноеМеню" -indent $inner Emit-Companion -tag "ExtendedTooltip" -name "${name}РасширеннаяПодсказка" -indent $inner - Emit-Events -el $el -elementName $name -indent $inner + Emit-Events -el $el -elementName $name -indent $inner -typeKey "picField" X "$indent" } @@ -513,7 +548,7 @@ function Emit-Calendar { Emit-CommonFlags -el $el -indent $inner Emit-Companion -tag "ContextMenu" -name "${name}КонтекстноеМеню" -indent $inner Emit-Companion -tag "ExtendedTooltip" -name "${name}РасширеннаяПодсказка" -indent $inner - Emit-Events -el $el -elementName $name -indent $inner + Emit-Events -el $el -elementName $name -indent $inner -typeKey "calendar" X "$indent" } diff --git a/.claude/skills/form-compile/SKILL.md b/.claude/skills/form-compile/SKILL.md index 3e8a6138..7720bffa 100644 --- a/.claude/skills/form-compile/SKILL.md +++ b/.claude/skills/form-compile/SKILL.md @@ -85,6 +85,26 @@ powershell.exe -NoProfile -File .claude\skills\form-compile\scripts\form-compile | `on: [...]` | События с автоименованием обработчиков | | `handlers: {...}` | Явное задание имён обработчиков: `{"OnChange": "МоёИмя"}` | +### Допустимые имена событий (`on`) + +Компилятор предупреждает о неизвестных событиях. Имена регистрозависимы — используйте точно как указано. + +**Форма** (`events`): `OnCreateAtServer`, `OnOpen`, `BeforeClose`, `OnClose`, `NotificationProcessing`, `ChoiceProcessing`, `OnReadAtServer`, `BeforeWriteAtServer`, `OnWriteAtServer`, `AfterWriteAtServer`, `BeforeWrite`, `AfterWrite`, `FillCheckProcessingAtServer`, `BeforeLoadDataFromSettingsAtServer`, `OnLoadDataFromSettingsAtServer`, `ExternalEvent`, `Opening` + +**input / picField**: `OnChange`, `StartChoice`, `ChoiceProcessing`, `AutoComplete`, `TextEditEnd`, `Clearing`, `Creating`, `EditTextChange` + +**check**: `OnChange` + +**table**: `OnStartEdit`, `OnEditEnd`, `OnChange`, `Selection`, `ValueChoice`, `BeforeAddRow`, `BeforeDeleteRow`, `AfterDeleteRow`, `BeforeRowChange`, `BeforeEditEnd`, `OnActivateRow`, `OnActivateCell`, `Drag`, `DragStart`, `DragCheck`, `DragEnd` + +**label / picture**: `Click`, `URLProcessing` + +**labelField**: `OnChange`, `StartChoice`, `ChoiceProcessing`, `Click`, `URLProcessing`, `Clearing` + +**button**: `Click` + +**pages**: `OnCurrentPageChange` + ### Поле ввода (input) | Ключ | Описание | Пример | @@ -164,7 +184,7 @@ powershell.exe -NoProfile -File .claude\skills\form-compile\scripts\form-compile | Ключ | Описание | |------|----------| | `command` | Имя команды формы → `Form.Command.Имя` | -| `stdCommand` | Стандартная команда → `Form.StandardCommand.Close` и др. | +| `stdCommand` | Стандартная команда: `"Close"` → `Form.StandardCommand.Close`; с точкой: `"Товары.Add"` → `Form.Item.Товары.StandardCommand.Add` | | `defaultButton: true` | Кнопка по умолчанию | | `type` | `"usual"`, `"hyperlink"`, `"commandBar"` | | `picture` | Картинка кнопки | @@ -178,6 +198,23 @@ powershell.exe -NoProfile -File .claude\skills\form-compile\scripts\form-compile | `autofill: true` | Автозаполнение стандартными командами | | `children: [...]` | Кнопки панели | +### Выпадающее меню (popup) + +| Ключ | Описание | +|------|----------| +| `title` | Заголовок подменю | +| `children: [...]` | Кнопки подменю | + +Используется внутри `cmdBar` для группировки кнопок в подменю: +```json +{ "cmdBar": "Панель", "children": [ + { "popup": "Добавить", "title": "Добавить", "children": [ + { "button": "ДобавитьСтроку", "stdCommand": "Товары.Add" }, + { "button": "ДобавитьИзДокумента", "command": "ДобавитьИзДокумента", "title": "Из документа" } + ]} +]} +``` + ### Реквизиты (attributes) ```json diff --git a/.claude/skills/form-compile/scripts/form-compile.ps1 b/.claude/skills/form-compile/scripts/form-compile.ps1 index 3d0adc66..496551e0 100644 --- a/.claude/skills/form-compile/scripts/form-compile.ps1 +++ b/.claude/skills/form-compile/scripts/form-compile.ps1 @@ -229,11 +229,39 @@ function Get-ElementName { return "$($el.$typeKey)" } +$script:knownEvents = @{ + "input" = @("OnChange","StartChoice","ChoiceProcessing","AutoComplete","TextEditEnd","Clearing","Creating","EditTextChange") + "check" = @("OnChange") + "label" = @("Click","URLProcessing") + "labelField"= @("OnChange","StartChoice","ChoiceProcessing","Click","URLProcessing","Clearing") + "table" = @("Selection","BeforeAddRow","AfterDeleteRow","BeforeDeleteRow","OnActivateRow","OnEditEnd","OnStartEdit","BeforeRowChange","BeforeEditEnd","ValueChoice","OnActivateCell","OnActivateField","Drag","DragStart","DragCheck","DragEnd","OnGetDataAtServer","BeforeLoadUserSettingsAtServer","OnUpdateUserSettingSetAtServer","OnChange") + "pages" = @("OnCurrentPageChange") + "page" = @("OnCurrentPageChange") + "button" = @("Click") + "picField" = @("OnChange","StartChoice","ChoiceProcessing","Click","Clearing") + "calendar" = @("OnChange","OnActivate") + "picture" = @("Click") + "cmdBar" = @() + "popup" = @() + "group" = @() +} +$script:knownFormEvents = @("OnCreateAtServer","OnOpen","BeforeClose","OnClose","NotificationProcessing","ChoiceProcessing","OnReadAtServer","AfterWriteAtServer","BeforeWriteAtServer","AfterWrite","BeforeWrite","OnWriteAtServer","FillCheckProcessingAtServer","OnLoadDataFromSettingsAtServer","BeforeLoadDataFromSettingsAtServer","OnSaveDataInSettingsAtServer","ExternalEvent","OnReopen","Opening") + function Emit-Events { - param($el, [string]$elementName, [string]$indent) + param($el, [string]$elementName, [string]$indent, [string]$typeKey) if (-not $el.on) { return } + # Validate event names + if ($typeKey -and $script:knownEvents.ContainsKey($typeKey)) { + $allowed = $script:knownEvents[$typeKey] + foreach ($evt in $el.on) { + if ($allowed.Count -gt 0 -and $allowed -notcontains "$evt") { + Write-Host "[WARN] Unknown event '$evt' for $typeKey '$elementName'. Known: $($allowed -join ', ')" + } + } + } + X "$indent" foreach ($evt in $el.on) { $evtName = "$evt" @@ -454,7 +482,7 @@ function Emit-Input { Emit-Companion -tag "ContextMenu" -name "${name}КонтекстноеМеню" -indent $inner Emit-Companion -tag "ExtendedTooltip" -name "${name}РасширеннаяПодсказка" -indent $inner - Emit-Events -el $el -elementName $name -indent $inner + Emit-Events -el $el -elementName $name -indent $inner -typeKey "input" X "$indent" } @@ -478,7 +506,7 @@ function Emit-Check { Emit-Companion -tag "ContextMenu" -name "${name}КонтекстноеМеню" -indent $inner Emit-Companion -tag "ExtendedTooltip" -name "${name}РасширеннаяПодсказка" -indent $inner - Emit-Events -el $el -elementName $name -indent $inner + Emit-Events -el $el -elementName $name -indent $inner -typeKey "check" X "$indent" } @@ -511,7 +539,7 @@ function Emit-Label { Emit-Companion -tag "ContextMenu" -name "${name}КонтекстноеМеню" -indent $inner Emit-Companion -tag "ExtendedTooltip" -name "${name}РасширеннаяПодсказка" -indent $inner - Emit-Events -el $el -elementName $name -indent $inner + Emit-Events -el $el -elementName $name -indent $inner -typeKey "label" X "$indent" } @@ -533,7 +561,7 @@ function Emit-LabelField { Emit-Companion -tag "ContextMenu" -name "${name}КонтекстноеМеню" -indent $inner Emit-Companion -tag "ExtendedTooltip" -name "${name}РасширеннаяПодсказка" -indent $inner - Emit-Events -el $el -elementName $name -indent $inner + Emit-Events -el $el -elementName $name -indent $inner -typeKey "labelField" X "$indent" } @@ -581,7 +609,7 @@ function Emit-Table { X "$inner" } - Emit-Events -el $el -elementName $name -indent $inner + Emit-Events -el $el -elementName $name -indent $inner -typeKey "table" X "$indent" } @@ -601,7 +629,7 @@ function Emit-Pages { # Companion Emit-Companion -tag "ExtendedTooltip" -name "${name}РасширеннаяПодсказка" -indent $inner - Emit-Events -el $el -elementName $name -indent $inner + Emit-Events -el $el -elementName $name -indent $inner -typeKey "pages" # Children (pages) if ($el.children -and $el.children.Count -gt 0) { @@ -672,7 +700,12 @@ function Emit-Button { X "$innerForm.Command.$($el.command)" } if ($el.stdCommand) { - X "$innerForm.StandardCommand.$($el.stdCommand)" + $sc = "$($el.stdCommand)" + if ($sc -match '^(.+)\.(.+)$') { + X "$innerForm.Item.$($Matches[1]).StandardCommand.$($Matches[2])" + } else { + X "$innerForm.StandardCommand.$sc" + } } Emit-Title -el $el -name $name -indent $inner @@ -699,7 +732,7 @@ function Emit-Button { # Companion Emit-Companion -tag "ExtendedTooltip" -name "${name}РасширеннаяПодсказка" -indent $inner - Emit-Events -el $el -elementName $name -indent $inner + Emit-Events -el $el -elementName $name -indent $inner -typeKey "button" X "$indent" } @@ -729,7 +762,7 @@ function Emit-PictureDecoration { Emit-Companion -tag "ContextMenu" -name "${name}КонтекстноеМеню" -indent $inner Emit-Companion -tag "ExtendedTooltip" -name "${name}РасширеннаяПодсказка" -indent $inner - Emit-Events -el $el -elementName $name -indent $inner + Emit-Events -el $el -elementName $name -indent $inner -typeKey "picture" X "$indent" } @@ -752,7 +785,7 @@ function Emit-PictureField { Emit-Companion -tag "ContextMenu" -name "${name}КонтекстноеМеню" -indent $inner Emit-Companion -tag "ExtendedTooltip" -name "${name}РасширеннаяПодсказка" -indent $inner - Emit-Events -el $el -elementName $name -indent $inner + Emit-Events -el $el -elementName $name -indent $inner -typeKey "picField" X "$indent" } @@ -772,7 +805,7 @@ function Emit-Calendar { Emit-Companion -tag "ContextMenu" -name "${name}КонтекстноеМеню" -indent $inner Emit-Companion -tag "ExtendedTooltip" -name "${name}РасширеннаяПодсказка" -indent $inner - Emit-Events -el $el -elementName $name -indent $inner + Emit-Events -el $el -elementName $name -indent $inner -typeKey "calendar" X "$indent" } @@ -1058,6 +1091,11 @@ X "`t" # 12e. Events if ($def.events) { + foreach ($p in $def.events.PSObject.Properties) { + if ($script:knownFormEvents -notcontains $p.Name) { + Write-Host "[WARN] Unknown form event '$($p.Name)'. Known: $($script:knownFormEvents -join ', ')" + } + } X "`t" foreach ($p in $def.events.PSObject.Properties) { X "`t`t$($p.Value)"