---
name: nikolay-shirokov-form-edit
description: "Правка существующей управляемой формы 1С — элементы, реквизиты, команды и свойства самой формы. Используй, когда нужно точечно изменить готовую форму"
license: "MIT"
metadata:
  decimalai-skill-id: "257d6df9-a654-493f-a2ee-14a12508be61"
  decimalai-version-id: "58bb6ebe-27a1-44b5-9b88-42946c09c883"
  decimalai-version: "5"
  decimalai-body-sha256: "1c7f523bce98c5e0f2479133e4e79b70e952ce710c07fcd38a3e696936b9f7f5"
  decimalai-name: "nikolay-shirokov/form-edit"
  decimalai-format: "1"
  decimalai-invocation: "model"
  decimalai-category: "coding"
  decimalai-source: "https://app.decimal.ai/s/nikolay-shirokov-form-edit@5/SKILL.md"
---
# /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` | Реквизиты: добавить, `set` — изменить, `rename` — переименовать, `remove` — удалить; колонка — путём `Таблица.Колонка` |
| `commands` | Команды: добавить, `set`, `rename`, `remove` |
| `parameters` | Параметры формы: добавить, `set`, `rename`, `remove` |
| `title` | Заголовок формы (строка или `{ru, en}`); `null` — убрать |
| `properties` | Свойства формы: `{ "windowOpeningMode": "LockOwnerWindow" }`; `null` у свойства — убрать (`references/form-properties.md`) |
| `events` | Обработчики событий формы: `{ "OnOpen": "ПриОткрытии" }` — повесить или заменить; `{ "OnOpen": null }` — снять; `["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": "КонтрагентПриИзменении" } },
    { "remove": "Комментарий" }
  ]
}
```

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

- Ключи — свойства элемента, те же, что при добавлении: заголовок, видимость, доступность, размеры, цвета и шрифт, кнопки поля, параметры выбора и т. д. (таблица ниже и справочники).
- `null` возвращает свойству значение по умолчанию.
- Строка в `title` меняет русский текст, переводы на другие языки остаются.
- У группы ориентацию меняет `group`: `{ "set": "ГруппаШапка", "group": "vertical" }`.
- `events` — как у формы: имя вешает или заменяет обработчик, `null` снимает, список событий даёт имена по конвенции. Процедуры отвязанных обработчиков остаются в модуле — навык их перечисляет.
- Имя, тип элемента, путь к данным и команду кнопки `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": "ИмяПроцедуры" }`; имена по конвенции — списком: `["OnChange", "StartChoice"]` (элемент списка может задать имя сам: `{ "event": "Clearing", "handler": "Имя" }`) |
| `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`, `OnSaveDataInSettingsAtServer`, `URLProcessing`, `ExternalEvent`, `OnReopen`

**input:** `OnChange`, `StartChoice`, `ChoiceProcessing`, `AutoComplete`, `TextEditEnd`, `Clearing`, `Opening`, `Creating`, `EditTextChange`, `Tuning`, `StartListChoice`
**check / radio:** `OnChange`
**table:** `Selection`, `OnActivateRow`, `OnActivateCell`, `OnActivateField`, `BeforeAddRow`, `BeforeDeleteRow`, `AfterDeleteRow`, `BeforeRowChange`, `OnStartEdit`, `OnEditEnd`, `BeforeEditEnd`, `OnChange`, `ChoiceProcessing`, `ValueChoice`, `BeforeExpand`, `BeforeCollapse`, `Drag`, `DragStart`, `DragCheck`, `DragEnd`; только у таблицы динамического списка — `OnGetDataAtServer`, `URLGetProcessing`, `BeforeLoadUserSettingsAtServer`, `OnLoadUserSettingsAtServer`, `OnSaveUserSettingsAtServer`, `OnUpdateUserSettingSetAtServer`
**label:** `Click`, `URLProcessing`
**labelField:** `Click`, `URLProcessing`, `OnChange`
**picture:** `Click`, `Drag`, `DragCheck`
**picField:** `Click`, `OnChange`, `Drag`, `DragCheck`
**calendar:** `OnChange`, `Selection`, `OnActivateDate`, `OnPeriodOutput`
**pages:** `OnCurrentPageChange`
**spreadsheet:** `Selection`, `OnActivate`, `OnChangeAreaContent`, `DetailProcessing`, `AdditionalDetailProcessing`
**html:** `OnClick`, `DocumentComplete`

У кнопки, страницы, группы колонок, командной панели и подменю событий нет. `Click` обычной группы и `OnHover`, `OnSelectedRowsSetChange` таблицы — только с платформы 8.5.

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

```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`.

### Изменение и переименование

`set` меняет существующий реквизит, команду или параметр — ключами, что и при добавлении; `null` возвращает значение по умолчанию. Колонка таблицы значений — путём `Таблица.Колонка`. Колонка реквизита формы в табличной части объекта (сам документ или справочник не меняется) — путём `Объект.ТабличнаяЧасть.Колонка`:

```json
{
  "attributes": [
    { "set": "Данные.Представление", "type": "string" },
    { "name": "Данные.Код", "type": "string(9)" },
    { "remove": "Данные.Устаревшая" },
    { "name": "Объект.Товары.Скидка", "type": "decimal(15,2)" },
    { "set": "Список", "settings": { "query": "ВЫБРАТЬ …" } }
  ],
  "elements": [ { "input": "ТоварыСкидка", "path": "Объект.Товары.Скидка", "after": "ТоварыКоличество" } ],
  "commands": [ { "set": "Загрузить", "action": "ЗагрузитьИзФайла" } ]
}
```

- `type` заменяет тип целиком. Вид реквизита (таблица ↔ значение ↔ динамический список) и тип основного реквизита не меняются.
- `settings` у динамического списка меняет только переданные части — остальные настройки списка остаются.

Переименование — `rename` и `to`:

```json
{ "attributes": [ { "rename": "Данные", "to": "Строки", "renameInModule": true } ] }
```

Пути элементов, условное оформление и командный интерфейс формы переходят на новое имя. `renameInModule: true` переписывает и обращения в `Module.bsl`; без него навык перечисляет строки модуля, которые надо поправить. Имена элементов и обработчиков не меняются.

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

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

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

Имя по конвенции в расширении — с префиксом и видом вызова: `Расш1_СкладПриИзмененииПосле`. Привязку определяют событие и вид вызова: `{ "OnChange": null }` снимает все привязки события, `{ "OnChange": { "handler": null, "callType": "After" } }` — только `After`.

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

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

| Задача | Справочник |
|--------|-----------|
| Новые группы и поля в стиле типовых: где разместить, имена групп и элементов, ширины полей | `layout-patterns.md` |
| Поле ввода, флажок, переключатель: кнопки, список выбора, быстрый выбор, своя форма выбора, маска, формат, пароль, выключатель/тумблер, поле составного типа | `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` |
| Какие события есть у элемента или формы, имена обработчиков, с какой платформы | `events.md` |

## Workflow

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