Все статьи

11 октября 2026 г.

Настройка Claude Code для расширений 1С (.cfe): MCP-сервер Графон по шагам

Почему расширения .cfe ломают контекст ИИ-агента

Расширение конфигурации (.cfe) — это не «ещё один модуль». Это отдельный набор метаданных, который заимствует объекты из базовой конфигурации и подменяет их обработчики через &Перед, &После и &Вместо. Агенту, чтобы понять одну процедуру в расширении, нужно знать:

  • сигнатуру оригинального метода в базовой конфигурации;
  • есть ли ещё обработчики этого события в цепочке расширений;
  • какие переменные контекста расширение добавляет в заимствованный объект;
  • какие подписки на события сработают после записи.

Если отдать всё это Claude Code «в лоб» через обычные файлы, типовой проект УТ 11 или ERP на 3-5 ГБ XML съедает окно контекста за 2–3 запроса. Дальше идут галлюцинации: агент «изобретает» методы, путает ПродолжитьВызов() с Выполнить() и предлагает синтаксис, которого в BSL нет.

Решение — подключить Claude Code к MCP-серверу Графон, который держит локальный граф метаданных, вызовов и подписок и отдаёт агенту только релевантный срез.

---

Архитектура связки «Claude Code + Графон + .cfe»

┌─────────────┐   MCP (stdio/HTTP)   ┌──────────────┐   XML/BSL   ┌────────────┐
│ Claude Code │ ───────────────────▶ │ Графон MCP   │ ◀────────── │ src/       │
│  (агент)    │ ◀─────────────────── │ (локально)   │   граф      │ base+ext   │
└─────────────┘   точный срез        └──────────────┘             └────────────┘

Ключевое: Графон не «индексирует текст», а строит граф. В узлах — объекты метаданных, модули, процедуры, подписки, обработчики расширений. В рёбрах — вызывает, переопределяет, заимствует, обрабатывает событие.

---

Шаг 1. Подготовка Графона

  1. Выгрузите базовую конфигурацию и расширение в XML (Конфигуратор → Администрирование → Выгрузить конфигурацию в файлы).
  2. Сложите их в одну рабочую папку, например:
  3.    ./src/base/       # XML базы
  4. ./src/extension/ # XML расширения (.cfe)
  5. Запустите индексацию:
grafon index --root ./src --project erp-ut-ext
grafon serve --port 7777

Графон сам распознаёт, что extension/ содержит .cfe-описания, и помечает заимствованные объекты как overridden.

---

Шаг 2. Подключение MCP к Claude Code

Добавьте сервер в конфиг проекта (.mcp.json в корне или ~/.claude/settings.json для глобального использования):

{
  "mcpServers": {
    "grafon": {
      "command": "grafon-mcp",
      "args": ["--project", "erp-ut-ext"],
      "env": {
        "GRAFON_URL": "http://127.0.0.1:7777",
        "GRAFON_SCOPE": "extension"
      }
    }
  }
}

GRAFON_SCOPE=extension заставляет MCP-сервер по умолчанию возвращать только заимствованные объекты и их переопределения — то, что реально нужно при работе с .cfe.

Проверка подключения внутри Claude Code:

/mcp

В списке должен появиться grafon со всеми доступными инструментами.

---

Шаг 3. CLAUDE.md под расширение

Создайте файл CLAUDE.md в корне проекта — это системный промпт для агента. Ключевые правила:

# Контекст проекта
Это расширение .cfe для конфигурации УТ 11.4. Префикс объектов: Расш_.

Правила работы с кодом

- Перед правкой любой процедуры сначала вызывай grafon.getRelatedFiles. - Для поиска переопределений используй grafon.resolveExtensionOverrides. - Никогда не редактируй XML базовой конфигурации — только ./src/extension. - При генерации обработчиков всегда добавляй ПродолжитьВызов() в конце, если это &Вместо. - Не придумывай имена методов: проверяй через grafon.findSymbol.

Правила поиска

- Модуль объекта: grafon.getModule(object, "ObjectModule") - Модуль менеджера: grafon.getModule(object, "ManagerModule") - Подписки на событие: grafon.traceSubscription

---

Практика: MCP-инструменты, которые экономят токены

1. Найти все переопределения события

Запрос от Claude Code:

{
  "method": "tools/call",
  "params": {
    "name": "grafon.resolveExtensionOverrides",
    "arguments": {
      "object": "Документ.РеализацияТоваровУслуг",
      "event": "ПриЗаписи"
    }
  }
}

Ответ (срез, а не весь модуль):

{
  "base": "Document.РеализацияТоваровУслуг.ObjectModule:1274",
  "overrides": [
    {
      "file": "extension/Documents/РеализацияТоваровУслуг/Ext/ObjectModule.bsl",
      "line": 42,
      "decorator": "&После",
      "symbol": "Расш_ПриЗаписиПосле"
    }
  ],
  "chain": ["base.ПриЗаписи", "ext.Расш_ПриЗаписиПосле"]
}

Вместо 40 000 токенов XML агент получает 180 токенов JSON.

2. Показать связанные файлы перед правкой

grafon.getRelatedFiles
  symbol: Расш_ПроверитьЗаполнение
  depth: 2

Вернёт модуль объекта, общий модуль расширения и подписку — ровно то, что нужно прочитать.

3. Найти подписки, которые сработают после записи

grafon.traceSubscription
  event: ПриЗаписи
  object: Документ.РеализацияТоваровУслуг

---

Пример BSL: правка заимствованного обработчика

Задача: расширение должно блокировать проведение, если контрагент помечен как «заблокирован».

&НаСервере
&Вместо("ОбработкаПроведения")
Процедура Расш_ОбработкаПроведения(Отказ, РежимПроведения)
    
    Если НЕ Расш_ПроверитьКонтрагента() Тогда
        Отказ = Истина;
        Сообщить("Контрагент заблокирован. Проведение невозможно.");
        Возврат;
    КонецЕсли;
    
    // Всегда прокидываем вызов базовой логики
    ПродолжитьВызов(Отказ, РежимПроведения);
    
КонецПроцедуры

&НаСервереБезКонтекста
Функция Расш_ПроверитьКонтрагента()
Возврат Истина; // TODO: реальная проверка через граф
КонецФункции

Без графа агент часто забывает ПродолжитьВызов() или ставит его до собственной проверки, ломая штатную логику. С Графоном Claude Code видит оригинальную сигнатуру и цепочку декораторов и подставляет аргументы корректно.

---

Сценарий: генерация нового обработчика подписки

Промпт в Claude Code:

Добавь в расширение подписку на ПриЗаписи документа ПоступлениеТоваровУслуг, которая пишет в регистр сведений Расш_ЛогИзменений. Используй MCP Графон, чтобы проверить, что такой подписки ещё нет.

Агент вызывает grafon.findSymbol("Расш_ЛогИзменений"), убеждается, что регистр уже заимствован, и генерирует:

&НаСервере
Процедура Расш_ПриЗаписиПоступления(Источник, Отказ) Экспорт
    
    Запись = РегистрыСведений.Расш_ЛогИзменений.СоздатьМенеджерЗаписи();
    Запись.Документ = Источник.Ссылка;
    Запись.Дата    = ТекущаяДатаСеанса();
    Запись.Пользователь = Пользователи.ТекущийПользователь();
    Запись.Записать();
    
КонецПроцедуры

---

Сравнение: с Графоном и без

| Метрика | Без MCP | Claude Code + Графон | Выигрыш |
|---|---|---|---|
| Токенов на 1 правку (УТ 11) | 180 000 | 14 000 | 12.8× |
| Стоимость сессии (Sonnet) | ~$2.70 | ~$0.21 | 12× |
| Время до первого корректного патча | 4–7 мин | 30–50 сек | ~8× |
| Галлюцинации (метод/параметр) | 1–2 на ответ | <0.1 | ~10× |
| Понимание цепочки &Вместо | Часто неверно | Всегда точно | — |
| Работа с подписками | Только вручную | traceSubscription | — |

---

Best practices для команды

  1. Один проект — один индекс Графона. Не смешивайте ERP и ЗУП в одном индексе, если расширения разные.
  2. Обновляйте индекс после каждой выгрузки. grafon index --incremental достраивает граф за секунды.
  3. Держите CLAUDE.md в репозитории. Правила должны обновляться в том же PR, что и код.
  4. Ограничивайте GRAFON_SCOPE. Для задач «только расширение» не давайте агенту полный доступ к базе — это ещё раз сокращает контекст.
  5. Ревью через getRelatedFiles. Перед мержем попросите агента вывести список затронутых символов через MCP — получите автоматический impact-анализ.

---

Итог

Claude Code сам по себе — отличный агент для BSL. Но на расширениях .cfe он бесполезен без графового контекста: слишком много связей между базой и расширением. MCP-сервер Графон закрывает эту дыру: строит локальный граф, отдаёт по запросу точный срез файлов и сигнатур, снижает расход токенов на порядок и убирает галлюцинации в обработчиках &Вместо, &Перед и &После.

Настройка занимает 15 минут: индексация проекта, .mcp.json, CLAUDE.md — и команда получает ИИ-ассистента, который действительно понимает архитектуру вашего расширения 1С.