Все статьи

6 октября 2026 г.

Как передавать только сигнатуры методов 1С в промпт нейросети: MCP-подход на практике

Почему полный дамп конфигурации ломает ИИ-агента

Типовая ERP или УТ на 1С — это 1.2–3.5 ГБ XML-выгрузки, 4000–9000 модулей и сотни тысяч строк на BSL. Разработчик, который подключает Claude Code или Cursor «в лоб» — через cat всех общих модулей или индексацию корня выгрузки, — получает предсказуемую деградацию:

  • контекстное окно переполняется на первых же 20–30 модулях, агент начинает «забывать» ранее прочитанное;
  • каждый запрос стоит 3–12 долларов на моделях класса Opus/GPT, потому что 80% токенов — это тела функций, которые не относятся к задаче;
  • агент галлюцинирует имена процедур, придумывает несуществующие параметры и «изобретает» методы общих модулей, которых нет в конфигурации;
  • время ответа растёт с 20 секунд до 5–12 минут.

Ключевая ошибка — передавать в промпт реализацию. Для 90% задач (найти вызов, понять контракт, собрать план рефакторинга, дописать проверку типа) агенту нужны только сигнатуры и связи между ними. Реализация подгружается точечно — по запросу, для 1–3 конкретных методов.

Что такое сигнатура метода 1С и что в неё входит

Сигнатура в 1С — это объявление процедуры или функции без тела:

Функция ПолучитьЦеныНоменклатуры(Номенклатура, Дата, ТипЦен, ИгнорироватьОтсутствие = Ложь) Экспорт
Процедура ЗаполнитьТЧПоДокументу(Документ, ТабличнаяЧасть, ТолькоНовые = Истина) Экспорт

Минимальный полезный набор полей для ИИ-агента:

  1. Имя (ПолучитьЦеныНоменклатуры)
  2. Тип — процедура или функция
  3. Параметры и значения по умолчанию
  4. Признак Экспорт и, для расширений, признак директивы компиляции (&НаСервере, &НаКлиенте, &НаСервереБезКонтекста)
  5. Модуль-владелец (ОбщийМодуль.ЦеныСервер, Документ.РеализацияТоваровУслуг.МодульОбъекта)
  6. Возвращаемый тип, если он выводится из тела или из документирующего комментария
  7. Входящие вызовы — кто вызывает этот метод (рёбра графа)

Этого достаточно, чтобы агент собрал корректный вызов, не подтягивая 300 КБ чужого кода.

Архитектура: локальный граф + MCP-сервер Графон

Графон работает как локальный анализатор и MCP-сервер. Схема:

Выгрузка 1С (XML + BSL)
        │
        ▼
[ Парсер Графона ] ──► Граф зависимостей (SQLite/локальный индекс)
        │                 • метаданные и модули
        │                 • процедуры/функции и их сигнатуры
        │                 • рёбра вызовов и подписки на события
        │                 • запросы и используемые поля
        ▼
[ MCP-сервер Графона ] ◄── stdio / HTTP ── Claude Code, Cursor, Windsurf
        │
        ▼
ИИ-агент получает только сигнатуры и точечный срез кода

Граф строится один раз. Дальше агент делает запросы, а не читает файлы. Для модели это выглядит как обычный tool-use: MCP-сервер отдаёт JSON с сигнатурами.

Как это выглядит в запросе агента

Агент вызывает инструмент search_methods и явно просит вернуть только сигнатуры:

{
  "jsonrpc": "2.0",
  "id": 41,
  "method": "tools/call",
  "params": {
    "name": "search_methods",
    "arguments": {
      "nameMask": "%Цен%Номенклатуры%",
      "moduleType": "ОбщийМодуль",
      "exportOnly": true,
      "signaturesOnly": true,
      "limit": 50
    }
  }
}

Ответ содержит десятки строк вместо мегабайтов:

{
  "result": {
    "methods": [
      {
        "module": "ОбщийМодуль.ЦеныСервер",
        "name": "ПолучитьЦеныНоменклатуры",
        "kind": "Функция",
        "export": true,
        "signature": "ПолучитьЦеныНоменклатуры(Номенклатура, Дата, ТипЦен, ИгнорироватьОтсутствие = Ложь)",
        "callers": 14,
        "returns": "ТаблицаЗначений"
      }
    ]
  }
}

Дальше агент запрашивает граф вызовов:

{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "get_call_graph",
    "arguments": {
      "method": "ОбщийМодуль.ЦеныСервер.ПолучитьЦеныНоменклатуры",
      "depth": 2,
      "direction": "callers"
    }
  }
}

И только теперь — тело одного конкретного метода через get_method_body. Ровно один вызов, ровно один метод.

Практический кейс: рефакторинг общего модуля

Задача: добавить новый параметр УчитыватьСкидки в ПолучитьЦеныНоменклатуры, не сломав 14 вызовов.

Без Графона. Разработчик просит агента прочитать ЦеныСервер и все объекты, где встречается имя метода. В контекст улетает 600–900 КБ кода, агент находит 9 из 14 вызовов и пропускает вызовы через Вычислить() и подписки.

С Графоном. Промпт:

Найди все вызовы ОбщийМодуль.ЦеныСервер.ПолучитьЦеныНоменклатуры
через MCP-инструмент get_call_graph (depth=3).
Верни только сигнатуры вызывающих методов и строки вызовов.
Не загружай тела вызывающих методов.

Агент получает 14 рёбер графа, 14 сигнатур и список строк. Итоговый контекст — около 18 КБ вместо 900 КБ. Задача решается за один проход, без «дочитывания» модулей.

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

| Параметр | Без Графона (полный контекст) | С Графоном (MCP + сигнатуры) |
|---|---|---|
| Что попадает в контекст | 1.2–3.5 ГБ XML + тела модулей | 20–80 КБ релевантного среза |
| Токенов на задачу | 180 000 – 900 000 | 12 000 – 45 000 |
| Время ответа агента | 4–12 минут | 20–60 секунд |
| Стоимость запроса | $3–12 | $0.2–0.8 |
| Поиск вызовов | фрагментарный, по regex | полный граф, включая подписки |
| Выдуманные имена методов | 15–30% | 0–2% |
| Точность сигнатуры | часто искажена | байт-в-байт из парсера |

Разница в токенах — до 10 раз, и это не маркетинговая оценка, а прямое следствие того, что в промпт больше не попадают тела функций.

Настройка в Claude Code, Cursor и Windsurf

Минимальный конфиг MCP-клиента:

{
  "mcpServers": {
    "grafon": {
      "command": "grafon",
      "args": ["mcp", "--config", "./grafon.config.json"],
      "env": { "GRAFON_INDEX": "./.grafon/index.db" }
    }
  }
}

Правила, которые стоит добавить в системный промпт агента:

  • сначала search_methods с signaturesOnly: true, и только потом — тела;
  • запрещено передавать в контекст модуль целиком без явного запроса пользователя;
  • для поиска зависимостей всегда использовать get_call_graph, а не текстовый поиск по выгрузке;
  • при генерации вызова обязательна проверка сигнатуры через get_method_signature перед выводом кода.

Чек-лист формирования промпта

  1. Указывайте модуль-владелец, а не только имя метода — в 1С полно одноимённых процедур.
  2. Ставьте signaturesOnly: true и limit — защита от «простыни» в ответе.
  3. Для больших модулей запрашивайте граф вызовов с depth: 2–3, глубже почти никогда не нужно.
  4. Просите возвращать returns и export, иначе агент начнёт угадывать типы.
  5. Тело метода — отдельным вызовом, только для тех методов, которые реально меняются.
  6. Фиксируйте в промпте, что выгрузка 1С доступна только через MCP — это отключает попытки агента читать файлы напрямую.

Ограничения

  • Динамические вызовы (Вычислить, Выполнить) граф видит не полностью — это ограничение самой платформы, а не парсера.
  • Расширения и заимствованные объекты требуют отдельной настройки индексации, иначе сигнатуры будут от базовой конфигурации.
  • Граф нужно перестраивать после существенных изменений кода, иначе агент получит устаревшие сигнатуры.
  • Для форм с большим объёмом клиентского кода сигнатуры обработчиков полезны, но директивы компиляции нужно передавать обязательно.

Итог

Передача только сигнатур методов 1С в промпт — это не оптимизация «на потом», а базовое условие работоспособности ИИ-агента на реальной конфигурации. Локальный граф и MCP-сервер Графон превращают гигабайты метаданных в компактный контракт: агент видит, какие методы существуют, что они принимают и кто их вызывает — и не тратит контекст на реализацию, которая в 95% случаев ему не нужна. Итог — до 10 раз меньше токенов, ответы за десятки секунд и код, который компилируется с первого раза, потому что имена и параметры взяты из парсера, а не из воображения модели.