---
name: cfe-diff
description: Анализ расширения конфигурации 1С (CFE) — состав, заимствованные объекты, перехватчики, сверка с конфигурацией. Используй когда нужно понять что содержит расширение или чем его объект отличается от объекта конфигурации
argument-hint: <набор-расширение> [<набор-конфигурация>]
allowed-tools:
  - Read
  - Glob
---

# /cfe-diff — Анализ расширения конфигурации

## MCP routing

- Расширение — такой же набор исходников, как конфигурация, и читается тем же
  MCP `unica`: `unica.view` по адресу `<набор>:Configuration` и ниже,
  `unica.check` для валидации, `unica.diff` для сверки узла с конфигурацией.
- Не вызывай внутренние MCP/CLI-адаптеры и не подменяй набор исходников путём к
  каталогу выгрузки.
- Чтение расширения ничего не меняет. Правку веди через `unica.apply` или
  `unica.code.patch` с `dryRun: true` и повторяй с `dryRun: false` только после
  явного подтверждения.

## 1. Какие наборы есть

`unica.view {}` называет каждый набор рабочего пространства и его вид. Набор с
видом `EXTENSION` — расширение; его имя и есть префикс адреса.

```json
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": { "name": "unica.view", "arguments": { "cwd": "<workspace>" } }
}
```

## 2. Что содержит расширение

Корень расширения отвечает его идентичностью и составом.

```json
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "unica.view",
    "arguments": { "cwd": "<workspace>", "at": "ext:Configuration" }
  }
}
```

| Что | Где в ответе |
|-----|--------------|
| Имя, синоним, версия, поставщик | `props.name`, `props.synonym`, `props.version`, `props.vendor` |
| Назначение расширения | `props.extensionPurpose` |
| Префикс имён | `props.properties.namePrefix` |
| Режим совместимости расширения | `props.properties.extensionCompatibilityMode` |
| Сколько объектов в расширении | `props.totalObjects` |
| Состав по видам | `branches` — по ветви на вид с числом объектов |

`props.support.state` у расширения — `extension`: это его собственный статус
поддержки, а не поддержка объекта конфигурации.

Спуск по ветви даёт объекты вида, дальше — их модули и методы, как у обычного
набора: `ext:Role` → роль, `ext:Module` → модули расширения.

## 3. Валидация расширения

Вид набора выбирает валидатор: на корне расширения работает `cfe`, на его
объектах — валидатор вида узла.

```json
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "unica.check",
    "arguments": { "cwd": "<workspace>", "at": "ext:Configuration" }
  }
}
```

Ответ несёт `status`, `validators` — какие валидаторы отработали — и
`diagnostics`. Узел, у которого валидаторов нет, отвечает `status: "readable"`
с пустым списком: это утверждение о читаемости, а не отсутствие проверки.

## 4. Чем объект расширения отличается от объекта конфигурации

`unica.diff` сравнивает один и тот же логический адрес в двух наборах.
Заимствованный объект есть в обоих, и различие приходит списком путей.

```json
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "unica.diff",
    "arguments": {
      "cwd": "<workspace>",
      "left": "main:Catalog.Валюты",
      "right": "ext:Catalog.Валюты"
    }
  }
}
```

`data.equal` отвечает на вопрос целиком, `data.changes[]` перечисляет
расхождения с `path`, `left` и `right`. Собственный объект расширения в
конфигурации не зарегистрирован, и сравнение отказывает кодом `not_found` —
это и есть ответ «объект собственный, а не заимствованный».

## 5. Перехватчики

Перехватчик — метод модуля расширения с директивой `&ИзменениеИКонтроль`,
`&Перед`, `&После` или `&Вместо`. Он виден в проекции модуля расширения:
спустись до `ext:<объект>.Module.<Роль>.Method` и читай методы. Текст директивы
приходит вместе с телом метода по адресу `...Method.<Имя>.Body`.

Поиск по тексту дешевле обхода модулей, но он литеральный: одного запроса
мало. Пройди по всем четырём директивам и считай набор полным только после
последней — `&ИзменениеИКонтроль`, `&Перед`, `&После`, `&Вместо`.

```json
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "unica.search",
    "arguments": { "cwd": "<workspace>", "query": "&ИзменениеИКонтроль", "scope": "ext:Configuration" }
  }
}
```

```json
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "unica.search",
    "arguments": { "cwd": "<workspace>", "query": "&Вместо", "scope": "ext:Configuration" }
  }
}
```

## Чего поверхность не отвечает

Автоматической сверки «перенесена ли вставка `&ИзменениеИКонтроль` в
конфигурацию» на канонической поверхности нет. Проверяй перенос вручную:
найди вставку поиском в расширении, затем тем же поиском в наборе конфигурации
и сравни найденные места. Вывод о переносе делает читатель, а не инструмент.
