Все статьи

14 сентября 2026 г.

Подключение Model Context Protocol к 1С:Предприятие: MCP-сервер Графон для BSL и метаданных

Почему MCP стал точкой входа ИИ в 1С

Model Context Protocol (MCP) — открытый протокол, который превращает внешние инструменты в «руки» LLM-агента: модель не переписывает весь проект в контекст, а вызывает типизированные инструменты и получает ровно тот фрагмент, который нужен для задачи. Для 1С:Предприятие это критично: типовая ERP или ЗУП — это гигабайты XML-выгрузки, десятки тысяч процедур и функций, тысячи форм и подписок на события.

Без MCP агент работает «по-файловому»: он читает модули целиком, склеивает их в промпт и на третьем-четвёртом шаге теряет нить. С MCP-сервером Графон агент сначала строит запрос к графу зависимостей, затем получает сигнатуры, связи и только потом — тела нужных методов.

Что Графон даёт поверх «голого» MCP

Графон — локальный MCP-сервер для конфигураций 1С. Он делает три вещи, которые вручную агент не сделает никогда:

  1. Индексация конфигурации. Разбирает выгрузку в XML/EDT, строит граф метаданных: объекты, реквизиты, табличные части, формы, движения, регистры.
  2. Граф кода BSL. Связывает процедуры и функции по вызовам, экспортным методам, директивам компиляции (&НаСервере, &НаКлиенте, &НаСервереБезКонтекста), обработчикам подписок и расширений.
  3. Граф запросов. Разбирает тексты запросов на языке 1С, связывает их с таблицами метаданных и местами использования временных таблиц.

На выходе — индексы, к которым MCP-клиент обращается за миллисекунды, вместо перекачки сотен мегабайт XML.

Архитектура подключения

┌──────────────────┐   stdio / JSON-RPC   ┌──────────────────┐
│ ИИ-агент         │ ◄──────────────────► │ Графон MCP-сервер│
│ Claude Code /    │   listTools          │  (локально)      │
│ Cursor /         │   callTool           │                  │
│ Windsurf /       │                      └────────┬─────────┘
│ Roo Code         │                               │
└──────────────────┘                               │ индексация
                                                   ▼
                                        ┌──────────────────────┐
                                        │ Граф конфигурации 1С │
                                        │ • метаданные (XML)   │
                                        │ • модули BSL         │
                                        │ • формы, подписки    │
                                        │ • тексты запросов    │
                                        └──────────────────────┘

Сервер работает локально и по stdio — исходники конфигурации не покидают рабочую машину или корпоративный контур. Это ключевое требование для проектов под NDA и для контуров с 152-ФЗ.

Установка и первичная индексация

# 1. Установка
npm i -g grafon-mcp-server

2. Индексация выгрузки конфигурации (XML/EDT)

grafon init --config ./src/cf --out ./.grafon --workers 8

3. Инкрементальное обновление после изменения модулей

grafon reindex --watch ./src/cf

Для большой ERP первичная индексация занимает единицы минут на SSD, инкрементальная — секунды. Дальше сервер стартует как MCP-процесс.

Подключение к агентам

Claude Code (.mcp.json в корне проекта)

{
  "mcpServers": {
    "grafon": {
      "command": "grafon",
      "args": ["serve", "--root", "./src/cf"],
      "env": { "GRAFON_LOG": "warn" }
    }
  }
}

Cursor (.cursor/mcp.json)

{
  "mcpServers": {
    "grafon": {
      "command": "grafon",
      "args": ["serve", "--root", "./src/cf"]
    }
  }
}

Windsurf (~/.codeium/windsurf/mcp_config.json)

{
  "mcpServers": {
    "grafon": {
      "command": "grafon",
      "args": ["serve", "--root", "./src/cf"]
    }
  }
}

После перезапуска агента достаточно выполнить /mcp — сервер покажет список инструментов.

Инструменты Графона, доступные агенту

| Инструмент | Назначение | Что возвращает |
|---|---|---|
| search_metadata | Поиск объектов по имени/синониму/типу | Список объектов с реквизитами |
| get_object_schema | Схема объекта метаданных | Реквизиты, ТЧ, формы, движения |
| find_symbol | Поиск процедур/функций по имени | Файл, строка, сигнатура |
| get_call_graph | Кто вызывает и что вызывает | Прямые и обратные связи |
| get_dependencies | Граф зависимостей от точки входа | Транзитивное замыкание |
| find_query_usage | Где используется таблица в запросах | Модули и строки |
| get_event_subscriptions | Подписки на события для объекта | Обработчики и модули |
| describe_slice | Точный срез файлов под задачу | Только релевантные фрагменты |

Пример вызова через JSON-RPC:

{
  "method": "tools/call",
  "params": {
    "name": "get_dependencies",
    "arguments": {
      "symbol": "Документ.РеализацияТоваровУслуг.ОбработкаПроведения",
      "depth": 2,
      "includeBodies": true
    }
  }
}

Ответ содержит сигнатуры, тела двух уровней и список подписок — обычно это 4–12 КБ вместо 3–8 МБ выгрузки.

Практический сценарий: правка проведения документа

Задача: «Добавь проверку отрицательных остатков при проведении РеализацииТоваровУслуг».

Промпт агенту с MCP:

Найди обработчик проведения документа РеализацияТоваровУслуг,
покажи граф вызовов на 2 уровня вглубь, найди все движения
по регистру ТоварыНаСкладах и подписки на события, которые
влияют на этот документ. Затем предложи патч.

Агент последовательно вызывает find_symbol → get_call_graph → get_dependencies → get_event_subscriptions, и только после этого читает тела методов. Типичный BSL-фрагмент, который он получает на вход:

&НаСервере
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    
    // Проверка заполнения ключевых реквизитов
    Если НЕ ПроверитьЗаполнение() Тогда
        Отказ = Истина;
        Возврат;
    КонецЕсли;
    
    Движения.ТоварыНаСкладах.Записывать = Истина;
    Движения.ТоварыНаСкладах.Очистить();
    
    // Движения формируются на сервере без контекста
    СформироватьДвижения(Отказ);
    
    Если Отказ Тогда
        Возврат;
    КонецЕсли;
    
    // Гарантировать контроль остатков (для ERP-схемы)
    БлокировкаДанных = Новый БлокировкаДанных;
    ЭлементБлокировки = БлокировкаДанных.Добавить("РегистрНакопления.ТоварыНаСкладах");
    ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
    ЭлементБлокировки.ИсточникДанных = Движения.ТоварыНаСкладах;
    ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
    БлокировкаДанных.Заблокировать();
    
КонецПроцедуры

&НаСервереБезКонтекста
Процедура СформироватьДвижения(Отказ)

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Реализация.Номенклатура КАК Номенклатура,
| СУММА(Реализация.Количество) КАК Количество
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК Реализация
|ГДЕ
| Реализация.Ссылка = &Ссылка
|СГРУППИРОВАТЬ ПО
| Реализация.Номенклатура";

Запрос.УстановитьПараметр("Ссылка", Ссылка);
Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
Движение = Движения.ТоварыНаСкладах.Добавить();
Движение.Период = Дата;
Движение.Номенклатура = Выборка.Номенклатура;
Движение.Количество = Выборка.Количество;
КонецЦикла;

КонецПроцедуры

Агент видит, что метод СформироватьДвижения вызывается только здесь, а ОбработкаПроведения дополнительно триггерится подпиской ПроверитьОстатки — и не трогает остальные 800 модулей конфигурации.

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

| Метрика | Без MCP (прямая загрузка) | С Графоном | Выигрыш |
|---|---|---|---|
| Токенов на задачу «правка проведения» | 180 000–420 000 | 12 000–35 000 | ~10× |
| Время ответа агента | 4–9 мин | 20–60 сек | 5–8× |
| Стоимость сессии (флагманская модель) | $3–7 | $0,25–0,6 | ~10× |
| Точность попадания в нужный метод | 40–60% | 92–98% | галлюцинации почти исчезают |
| Качество при инкрементальной правке | падает с размером конфигурации | стабильно | — |

Сценарии, где MCP-подключение окупается сразу

  • Аудит расширений. Графон показывает, какие подписки и обработчики переопределены в расширениях, и агент анализирует конфликты с типовой.
  • Миграция на 8.3.2x / ERP 2.5. Массовый поиск устаревших методов и мест вызова — через find_symbol и get_call_graph.
  • Оптимизация запросов. find_query_usage находит все запросы, обращающиеся к таблице, и агент предлагает переиндексацию или замену соединения.
  • Ревью кода в CI. Локальный запуск Графона в пайплайне + агент, который оставляет комментарии по графу вызовов.

Ограничения и best practices

  1. Индексируйте всю конфигурацию, а не отдельные модули — граф строится по экспортным связям.
  2. Для EDT-проектов используйте --format edt, иначе часть подписок не попадёт в индекс.
  3. Обновляйте индекс в pre-commit или по --watch, иначе агент будет работать со устаревшим графом.
  4. Ограничивайте depth в get_dependencies: глубина 3+ на ERP даёт избыточный ответ.
  5. Не отключайте локальный режим — MCP-сервер по stdio принципиально не требует доступа в интернет.

Итог

Подключение Model Context Protocol к 1С:Предприятие перестаёт быть экспериментом, когда появляется сервер, понимающий метаданные и BSL. Графон превращает конфигурацию в граф зависимостей и отдаёт агенту только нужный срез: 10× меньше токенов, 5–8× быстрее цикл правки, предсказуемое качество на ERP, УТ, ЗУП и КА. Настроив .mcp.json один раз, вы получаете ИИ-ассистента, который действительно знает вашу конфигурацию — без галлюцинаций и без выгрузки гигабайтов XML в контекст.