---
name: form-edit
description: Правка существующей управляемой формы 1С — элементы, реквизиты, команды и свойства самой формы. Используй, когда нужно точечно изменить готовую форму
argument-hint: <FormPath> <JsonPath>
allowed-tools:
  - Bash
  - Read
  - Write
  - Glob
---

# /form-edit — Правка формы

Точечно меняет существующий `Form.xml` по описанию правок в JSON; остальное в файле не трогает. Перенесённый или изменённый элемент сохраняет свой id — обработчики и обращения из модуля продолжают работать.

## Команда

| Параметр  | Обязательный | Описание                       |
|-----------|:------------:|--------------------------------|
| FormPath  | да           | Путь к существующему Form.xml  |
| JsonPath  | да           | Путь к JSON с описанием правок |

```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/form-edit.ps1" -FormPath "<путь>" -JsonPath "<путь>"
```

## Что можно править

| Ключ | Правка |
|------|--------|
| `elements` | Элементы: добавить, перенести, изменить, удалить — список операций, по порядку |
| `attributes` | Реквизиты: добавить; `{ "remove": "Имя" }` — удалить |
| `commands` | Команды: добавить; `{ "remove": "Имя" }` — удалить |
| `parameters` | Параметры формы: добавить; `{ "remove": "Имя" }` — удалить |
| `title` | Заголовок формы (строка или `{ru, en}`); `null` — убрать |
| `properties` | Свойства формы: `{ "windowOpeningMode": "LockOwnerWindow" }`; `null` у свойства — убрать (`references/form-properties.md`) |
| `events` | Обработчики событий формы: `{ "OnOpen": "ПриОткрытии" }` |
| `excludedCommands` | Исключить стандартные команды: `["Copy"]`; вернуть: `{ "remove": ["Copy"] }` |
| `conditionalAppearance` | Добавить правила условного оформления (`references/appearance.md`) |
| `commandInterface` | Добавить команды в панели формы (`references/command-interface.md`) |

Все ключи необязательны, в одной правке можно сочетать любые. Имена элементов, реквизитов и команд — из `/form-info`. Процедуры обработчиков в модуле формы не создаются — их добавляют в `Module.bsl` отдельно.

## Элементы

Операцию задаёт ключ:

| Ключ | Операция |
|------|----------|
| тип элемента: `input`, `group`, `table`, … | Добавить новый элемент |
| `move` | Перенести: имя или список имён (встают подряд в этом порядке) вместе с содержимым |
| `set` | Изменить свойства: имя или список имён |
| `remove` | Удалить: имя или список имён; группа, страница, таблица — вместе с содержимым |

Куда встаёт добавляемый или переносимый элемент:

| Ключи | Куда |
|-------|------|
| `after: "X"` / `before: "X"` | Рядом с X, в его группе |
| `into: "G"` | В конец G — группы, страницы, таблицы, командной панели |
| `into: "G", first: true` | В начало G |

Новый элемент без позиции встаёт в конец формы; следующий без позиции — за ним. У `move` позиция обязательна.

```json
{
  "attributes": [ { "name": "Срочно", "type": "boolean" } ],
  "elements": [
    { "group": "alwaysHorizontal", "name": "ГруппаОтгрузка", "after": "Контрагент" },
    { "move": ["Склад", "Организация"], "into": "ГруппаОтгрузка" },
    { "check": "Срочно", "path": "Срочно", "into": "ГруппаОтгрузка" },
    { "move": "ТоварыСумма", "before": "ТоварыЦена" },
    { "set": "Ответственный", "visible": false },
    { "set": "Контрагент", "title": "Покупатель", "events": { "OnChange": null } },
    { "remove": "Комментарий" }
  ]
}
```

### Изменение (`set`)

- Ключи — свойства элемента, те же, что при добавлении: заголовок, видимость, доступность, размеры, цвета и шрифт, кнопки поля, параметры выбора и т. д. (таблица ниже и справочники).
- `null` возвращает свойству значение по умолчанию.
- Строка в `title` меняет русский текст, переводы на другие языки остаются.
- У группы ориентацию меняет `group`: `{ "set": "ГруппаШапка", "group": "vertical" }`.
- `events` добавляет обработчики — как у нового элемента.
- Имя, тип элемента, путь к данным и команду кнопки `set` не меняет: такой элемент удаляют и добавляют заново.

### Удаление вместе с реквизитом

Поле и реквизит, к которому оно привязано, удаляются в одной правке:

```json
{
  "elements":   [ { "remove": "Срочно" } ],
  "attributes": [ { "remove": "Срочно" } ]
}
```

## Новый элемент

Ключ — тип элемента, значение — имя; у `group` значение — ориентация, а имя задаётся в `name`.

| Ключ | Элемент | Подробно |
|------|---------|----------|
| `input` | Поле ввода | `input-fields.md` |
| `check` / `radio` | Флажок / переключатель | `input-fields.md` |
| `labelField` | Поле-надпись (значение без редактирования) | `input-fields.md` |
| `label` | Надпись, текст — в `title` | `tooltips-text.md` |
| `group` | Группа: `vertical` / `horizontalIfPossible` / `alwaysHorizontal` | `groups-pages.md` |
| `pages` / `page` | Страницы / страница | `groups-pages.md` |
| `table` / `columnGroup` | Таблица / группа колонок | `table-advanced.md` |
| `button` / `popup` / `buttonGroup` / `cmdBar` | Кнопка / подменю / группа кнопок / командная панель | `buttons-commands.md` |
| `picture` / `picField` | Картинка / поле-картинка | `pictures.md` |

Табличный документ, HTML, календарь, диаграммы и другие особые поля — по индексу ниже.

| Ключ | Описание |
|------|----------|
| `name` | Имя, если отличается от значения ключа типа. Имена в форме уникальны |
| `path` | Путь к данным: `"Объект.Склад"`, `"ИмяРеквизита"`; колонка таблицы — `"Объект.Товары.Сумма"` |
| `title` / `tooltip` | Заголовок / подсказка (строка или `{ru, en}`) |
| `visible: false` / `enabled: false` / `readOnly: true` | Скрыть / сделать недоступным / только чтение |
| `events` | Обработчики: `{ "OnChange": "ИмяПроцедуры" }`; `null` вместо имени — имя по шаблону `<Элемент><Событие>` |
| `children` / `columns` | Вложенные элементы группы или страницы / колонки таблицы |

Поле на новом реквизите формы — реквизит и элемент в одной правке:

```json
{
  "attributes": [ { "name": "СуммаИтого", "type": "decimal(15,2)" } ],
  "elements": [ { "input": "СуммаИтого", "path": "СуммаИтого", "readOnly": true, "after": "Контрагент" } ]
}
```

Колонка в существующую таблицу — элемент рядом с другой колонкой или `into` таблицы:

```json
{ "input": "ТоварыСкидка", "path": "Объект.Товары.Скидка", "after": "ТоварыЦена" }
```

Кнопка — в командную панель формы (`ФормаКоманднаяПанель`) или таблицы (`ТоварыКоманднаяПанель`); `command` — команда формы, `stdCommand` — стандартная (`"Close"`, у таблицы — `"Товары.Add"`):

```json
{
  "commands": [ { "name": "Пересчитать", "action": "ПересчитатьОбработка" } ],
  "elements": [ { "button": "Пересчитать", "command": "Пересчитать", "into": "ФормаКоманднаяПанель" } ]
}
```

Свойства командной панели формы — операция `autoCmdBar`: `{ "autoCmdBar": "ФормаКоманднаяПанель", "autofill": false }` (без стандартных команд), `horizontalAlign`.

### События

Имена регистрозависимы.

**Форма:** `OnCreateAtServer`, `OnOpen`, `BeforeClose`, `OnClose`, `NotificationProcessing`, `ChoiceProcessing`, `OnReadAtServer`, `BeforeWriteAtServer`, `OnWriteAtServer`, `AfterWriteAtServer`, `BeforeWrite`, `AfterWrite`, `FillCheckProcessingAtServer`, `BeforeLoadDataFromSettingsAtServer`, `OnLoadDataFromSettingsAtServer`, `ExternalEvent`, `Opening`

**input:** `OnChange`, `StartChoice`, `ChoiceProcessing`, `AutoComplete`, `TextEditEnd`, `Clearing`, `Creating`, `EditTextChange`
**check / radio:** `OnChange`
**table:** `OnStartEdit`, `OnEditEnd`, `OnChange`, `Selection`, `ValueChoice`, `BeforeAddRow`, `BeforeDeleteRow`, `AfterDeleteRow`, `BeforeRowChange`, `BeforeEditEnd`, `OnActivateRow`, `OnActivateCell`
**label / labelField:** `Click`, `URLProcessing`; у `labelField` также `OnChange`, `StartChoice`, `ChoiceProcessing`, `Clearing`
**picture / button:** `Click`
**pages:** `OnCurrentPageChange`

### Реквизиты, команды, параметры

```json
"attributes": [ { "name": "Итого", "type": "decimal(15,2)", "title": "Итого" },
                { "name": "Данные", "type": "ValueTable", "columns": [ { "name": "Сумма", "type": "decimal(15,2)" } ] } ],
"commands":   [ { "name": "Загрузить", "action": "ЗагрузитьОбработка", "shortcut": "Ctrl+Enter" } ],
"parameters": [ { "name": "Основание", "type": "DocumentRef.Заказ", "key": true } ]
```

Типы: `string`, `string(100)`, `decimal(15,2)`, `boolean`, `date`, `dateTime`, `CatalogRef.X`, `DocumentRef.X`, `EnumRef.X`, `ValueTable`, `ValueList`, `DynamicList`, `Тип1 | Тип2` — все типы в `references/type-system-advanced.md`. Остальные ключи реквизитов — `attributes-advanced.md`, команд — `buttons-commands.md`.

## Форма расширения

Форма расширения (с `<BaseForm>`) распознаётся сама. Свои элементы, реквизиты и команды расширения называют с префиксом расширения (`Расш1_Метка`) и задают им `title` — иначе заголовок возьмётся из имени вместе с префиксом. Обработчику указывают вид вызова — `callType`: `Before`, `After` или `Override`; без него — `Before`:

```json
{
  "events": { "OnCreateAtServer": { "handler": "Расш1_ПриСозданииПосле", "callType": "After" } },
  "elements": [
    { "set": "Банк", "events": { "OnChange": { "handler": "Расш1_БанкПриИзменении", "callType": "Before" } } }
  ],
  "commands": [
    { "name": "Подбор", "action": "Расш1_ПодборПосле", "callType": "After" },
    { "name": "Запрос", "actions": [
      { "handler": "Расш1_ЗапросПеред", "callType": "Before" },
      { "handler": "Расш1_ЗапросПосле", "callType": "After" } ] }
  ]
}
```

## Задача → справочник

Под задачу подгрузите файл из `references/`:

| Задача | Справочник |
|--------|-----------|
| Поле ввода, флажок, переключатель: кнопки, список выбора, быстрый выбор, своя форма выбора, маска, формат, пароль, выключатель/тумблер, поле составного типа | `input-fields.md` |
| Ограничить выбор отбором, связать поле с другим полем, связь по типу | `choice-params.md` |
| Группа и страницы: ориентация, рамка, свёрнутая группа, интервалы, заголовок из данных, значок закладки, мастер по шагам | `groups-pages.md` |
| Таблица: колонки и группы колонок, итоги в подвале, дерево, выделение строк, закрепление колонок, поиск, перетаскивание | `table-advanced.md` |
| Форма списка: источник данных, запрос, отбор, сортировка, группировка, иерархия | `dynamic-list.md` |
| Кнопки, подменю, команды: картинка кнопки, переключатель в панели, команды таблицы в группе кнопок, своё контекстное меню у поля, команда для текущей строки | `buttons-commands.md` |
| Подсветить цветом, шрифт, рамка, условное оформление (в форме списка — `dynamic-list.md`) | `appearance.md` |
| Расширенная подсказка под полем, надпись с выделением или ссылкой | `tooltips-text.md` |
| Картинка, значок в колонке, иконка по значению | `pictures.md` |
| Табличный документ (печатная форма, отчёт на форме) | `spreadsheet.md` |
| HTML, текстовый документ, индикатор, ползунок, календарь, период | `special-fields.md` |
| Диаграмма, диаграмма Ганта, планировщик | `charts.md` |
| Свойства формы: модальность, размер, прокрутка, Enter, время и проведение документа | `form-properties.md` |
| Форма отчёта (СКД) | `report-form.md` |
| Реквизиты: сохранение в настройках, проверка заполнения, функциональные опции | `attributes-advanced.md` |
| Типы реквизитов, составные типы и наборы | `type-system-advanced.md` |
| Видимость и доступ по ролям | `roles-access.md` |
| Командный интерфейс формы (переходы, важные команды) | `command-interface.md` |
| Размеры, выравнивание, фокус по умолчанию, узкие экраны | `layout-advanced.md` |

## Workflow

1. `/form-info` — структура формы: имена элементов, реквизиты, команды.
2. Описать правки в JSON.
3. `/form-edit` — применить; в выводе — что добавлено, перенесено, изменено и удалено.
4. `/form-validate` — проверить форму.
