---
name: xbsl-rename
description: >
  Безопасное переименование объекта конфигурации 1С:Элемент и обновление всех ссылок
  на него во всём проекте: типы реквизитов (Имя.Ссылка?), формы (ФормаОбъекта<Имя.Объект>),
  поля Интерфейс.*.Форма, XBSL-код, сами файлы объекта и его форм.
  Вызывай при запросах «переименуй», «rename», «поменяй имя объекта».
  Поддерживает два сценария: A — переименование базового объекта (Справочник, Документ,
  Регистр и т.д.); B — переименование формы (КомпонентИнтерфейса), при этом обновляет
  ссылку Форма: в YAML владельца.
compatibility:
  runtime:
    - python3
---

## Назначение

Переименовывает объект и обновляет все ссылки на него в проекте.
Сначала показывает план изменений, затем применяет с подтверждением.

## Алгоритм

### Шаг 0 — Найди объекты и уточни у пользователя

#### Шаг 0.1 — Найди все объекты с таким именем

Запусти dry-run без `--object-file` и проверь stderr на код выхода 2 (несколько объектов):

```bash
python3 .claude/skills/xbsl-rename/scripts/rename.py \
  --old-name <СтароеИмя> --new-name <НовоеИмя> --root <корень-проекта> 2>&1; echo "EXIT:$?"
```

- **Код выхода 0 или 1** — объект один или не найден, продолжай.
- **Код выхода 2** — найдено несколько объектов. Покажи пользователю список из stderr и спроси какой переименовать. После выбора передавай `--object-file <путь>` во все последующие вызовы.

#### Шаг 0.2 — Определи представления автоматически

**Не спрашивай пользователя о представлениях.** Определяй самостоятельно:

- **Новое представление** (`--new-presentation`):
  - Если пользователь явно написал представление в запросе — используй его.
  - Иначе — выведи форму **единственного числа** из нового технического имени (`--new-name`) самостоятельно, используя знание русской морфологии.
  - Примеры: `Склады` → `Склад`, `Контрагенты` → `Контрагент`, `МестаХранения` → `Место хранения`.

- **Старое представление** (`--old-presentation`):
  - Аналогично выведи форму единственного числа из старого технического имени (`--old-name`).
  - Примеры: `МестаХранения` → `Место хранения`, `ЗаказыКлиентов` → `Заказ клиента`.

> **Почему единственное число:** технические имена объектов используются во множественном числе (`Склады`, `Контрагенты`), а поле `Представление`/`Заголовок` отображается для одного объекта в UI — поэтому единственное число.

### Шаг 1 — Dry-run (показать план)

```bash
python3 .claude/skills/xbsl-rename/scripts/rename.py \
  --old-name <СтароеИмя> --new-name <НовоеИмя> \
  --new-presentation "<НовоеПредставление>" \
  [--old-presentation "<СтароеПредставление>"] \
  [--object-file <путь-к-файлу-объекта>] \
  --root <корень-проекта>
```

Скрипт выводит:
- список файлов для переименования (сам объект + `.xbsl` + файлы форм `СтароеИмяФорма*.yaml`)
- список файлов с текстовыми заменами (с указанием изменённых строк)

### Шаг 2 — Показать план пользователю и ОСТАНОВИТЬСЯ

Отобрази вывод dry-run пользователю и **завершить свой ответ**. Не выполнять `--apply` в этом же ходу.

Задай вопрос с тремя вариантами ответа:

> Применить переименование?
> 1. Да
> 2. Показать список изменяемых файлов
> 3. Нет

**Обработка ответов:**
- **«1» / «да» / «применяй» / «yes»** → перейти к Шагу 3
- **«2» / «список» / «покажи файлы»** → вывести только список файлов (без строк изменений) и снова задать вопрос с тремя вариантами
- **«3» / «нет» / «отмена»** → отменить, ничего не применять
- Если пользователь попросил изменить параметры — скорректировать план и вернуться к Шагу 1

### Шаг 3 — Применить (только после подтверждения пользователя)

```bash
python3 .claude/skills/xbsl-rename/scripts/rename.py \
  --old-name <СтароеИмя> --new-name <НовоеИмя> \
  --new-presentation "<НовоеПредставление>" \
  [--old-presentation "<СтароеПредставление>"] \
  [--object-file <путь-к-файлу-объекта>] \
  --root <корень-проекта> --apply
```

## Что заменяется

| Паттерн | Пример |
|---|---|
| Тип реквизита | `Номенклатура.Ссылка?` → `Товары.Ссылка?` |
| Тип в форме | `ФормаОбъекта<Номенклатура.Объект>` → `ФормаОбъекта<Товары.Объект>` |
| Ссылка на форму в интерфейсе | `Форма: НоменклатураФормаОбъекта` → `Форма: ТоварыФормаОбъекта` |
| Имя объекта | `Имя: Номенклатура` → `Имя: Товары` |
| Составное имя формы | `НоменклатураФормаОбъекта` → `ТоварыФормаОбъекта` (в тексте и именах файлов) |
| XBSL-код | `Номенклатура = Номенклатура` (в обработчиках регистров и т.д.) |

## Аргументы скрипта

| Аргумент | Описание |
|---|---|
| `--old-name` | Текущее имя объекта (обязательно) |
| `--new-name` | Новое техническое имя объекта (обязательно) |
| `--new-presentation` | Человекочитаемое представление для полей `Представление`/`Заголовок` (напр. `"Места хранения"`). Если не задано — используется `--new-name` |
| `--old-presentation` | Старое представление объекта (напр. `"Место хранения"` для `МестаХранения`). Нужно когда техническое имя и его представление расходятся — скрипт заменит точное совпадение этой строки в полях `Заголовок`/`Представление` |
| `--object-file` | Путь к файлу переименуемого объекта (относительно `--root`). Обязателен если в проекте несколько объектов с именем `--old-name`. Только для этого объекта и его форм меняются поля `Заголовок`/`Представление` |
| `--root` | Корень проекта (по умолчанию `.`) |
| `--apply` | Применить изменения (без флага — dry-run) |

## Ошибки

- Объект не найден: скрипт выводит ошибку и завершается с кодом 1
- Несколько проектов: скрипт обрабатывает все найденные проекты внутри `--root`
