Все статьи

7 октября 2026 г.

Интеграция 1С с локальными DeepSeek R1 и Qwen Coder через MCP-сервер Графон

Почему «в лоб» локальные модели на 1С не работают

Типовая ERP или УТ после выгрузки в файлы — это 5–15 ГБ XML-метаданных, 300 000+ строк BSL и десятки тысяч объектов. Если передать этот объём в контекст DeepSeek R1 или Qwen Coder напрямую, происходит predictable катастрофа:

  • контекстное окно 128K токенов переполняется на первой же форме документа;
  • агент теряет нить и начинает выдумывать методы вроде ПолучитьОстаткиПоРегиструБухгалтерии() которых не существует;
  • за один сеанс «объясни, как проводится РеализацияТоваровУслуг» сгорает 400–800K токенов;
  • на локальной RTX 4090 скорость падает до 3–5 токенов/с и диалог растягивается на часы.

Правильный подход — не расширять контекст, а сужать его до релевантного среза. Именно эту задачу решает MCP-сервер Графон.

Архитектура локального стека

Схема развёртывания выглядит так:

[Выгрузка конфигурации 1С в XML]
            │
            ▼
   ┌──────────────────┐
   │  Графон (MCP)    │  ← локальный индекс: граф метаданных,
   │  graph index     │    вызовов, подписок, запросов
   └────────┬─────────┘
            │ JSON-RPC (MCP)
            ▼
   ┌──────────────────┐        ┌──────────────────────┐
   │  Агент           │ ─────► │ Ollama / vLLM        │
   │ (Claude Code,    │        │  deepseek-r1:32b     │
   │  Cursor, Roo)    │        │  qwen2.5-coder:32b   │
   └──────────────────┘        └──────────────────────┘

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

Роли моделей: R1 vs Qwen Coder

| Задача | Модель | Почему |
|---|---|---|
| Анализ бизнес-логики, разбор проводок, поиск причины расхождения | DeepSeek R1 32B (distill) | Chain-of-thought, умеет рассуждать на нескольких модулях |
| Генерация и рефакторинг BSL, перенос кода на БСП | Qwen2.5-Coder 32B | Обучен на коде, лучше держит синтаксис BSL |
| Массовые механические правки (переименование, форматирование) | Qwen2.5-Coder 7B | Дешёвая по VRAM, высокая скорость |
| Архитектурные обзоры метаданных | DeepSeek R1 14B | Компромисс скорость/качество |

Обе модели запускаются локально через Ollama:

ollama pull deepseek-r1:32b
ollama pull qwen2.5-coder:32b
ollama serve

Минимальные требования: 64 ГБ RAM + GPU 24 ГБ VRAM для 32B в Q4_K_M. Для 14B-дистиллятов хватит 16 ГБ VRAM.

Что делает Графон под капотом

Графон индексирует выгрузку и строит несколько слоёв графа:

  1. Граф метаданных — объект → реквизиты → формы → модули.
  2. Граф вызовов — кто вызывает ОбщегоНазначения.ЗначениеРеквизитаОбъекта() и с какими аргументами.
  3. Граф подписок — ПодпискиНаСобытия типа ПередЗаписью и их обработчики.
  4. Граф запросов — какие временные таблицы и регистры трогает конкретный метод.

Всё это доступно ИИ-агенту через MCP-инструменты. Пример реального вызова:

{
  "jsonrpc": "2.0",
  "id": 7,
  "method": "tools/call",
  "params": {
    "name": "graf_context",
    "arguments": {
      "object": "Документ.РеализацияТоваровУслуг",
      "event": "ОбработкаПроведения",
      "depth": 2,
      "include_callers": true
    }
  }
}

Ответ содержит только релевантные модули и сигнатуры — не всю конфигурацию.

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

Допустим, нужно добавить контроль остатков по складу в проведении. Что вернёт Графон агенту:

  • Документ.РеализацияТоваровУслуг.МодульОбъекта — обработчик ОбработкаПроведения;
  • ОбщийМодуль.ТоварыОрганизацийСервер — методы работы с регистром ТоварыНаСкладах;
  • подписки на ПередЗаписью этого документа;
  • список вызовов Движения.ТоварыНаСкладах.Записывать().

Агент на Qwen Coder генерирует патч:

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    
    Движения.ТоварыНаСкладах.Записывать = Истина;
    ОстаткиПоСкладам = Новый Структура;
    
    Для Каждого СтрокаТЧ Из Товары Цикл
        Ключ = СтрокаТЧ.Номенклатура.Ссылка;
        Если ОстаткиПоСкладам.Свойство(Ключ) Тогда
            ОстаткиПоСкладам[Ключ] = ОстаткиПоСкладам[Ключ] - СтрокаТЧ.Количество;
        Иначе
            ОстаткиПоСкладам.Вставить(Ключ, -СтрокаТЧ.Количество);
        КонецЕсли;
    КонецЦикла;
    
    Блокировка = Новый БлокировкаДанных;
    ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ТоварыНаСкладах");
    ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Остатки.Номенклатура КАК Номенклатура,
        |   Остатки.КоличествоОстаток КАК Остаток
        |ИЗ
        |   РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Склад = &Склад) КАК Остатки";
    Запрос.УстановитьПараметр("Дата", Дата);
    Запрос.УстановитьПараметр("Склад", Склад.Ссылка);
    
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
        Если ОстаткиПоСкладам.Свойство(Выборка.Номенклатура) 
            И ОстаткиПоСкладам[Выборка.Номенклатура] > Выборка.Остаток Тогда
            Отказ = Истина;
            Сообщить("Недостаточно " + Выборка.Номенклатура + " на складе", СтатусСообщения.Внимание);
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

Без Графона агент «угадывает» сигнатуру Исключительный блока данных и часто пишет Исключительная или ЗаписьДанных. С Графоном сигнатуры подставляются из индекса.

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

Тест на конфигурации УТ 11.5 (≈ 340 000 строк BSL):

| Метрика | Без Графона | С Графоном | Эффект |
|---|---|---|---|
| Токенов на задачу «правка проведения» | 620 000 | 68 000 | ×9,1 |
| Время до рабочего патча (RTX 4090) | 42 мин | 6 мин | ×7 |
| Доля галлюцинированных методов | 23 % | 1,4 % | ×16 |
| Стоимость (если через API) | ~$9,3 | ~$1,0 | — |
| Модулей прочитано | 210 | 8 | — |

Цифры токенов замерены токенайзером Qwen2.5. Эффект усиливается на ERP, где граф вызовов в разы плотнее.

Подключение MCP-сервера к агенту

Конфиг для Cursor или Claude Code (~/.claude/mcp.json):

{
  "mcpServers": {
    "grafon": {
      "command": "grafon",
      "args": ["serve", "--index", "/data/ut11.5/graph.db"],
      "env": {
        "GRAFON_LLM_BACKEND": "ollama",
        "GRAFON_MODEL_CODER": "qwen2.5-coder:32b",
        "GRAFON_MODEL_REASON": "deepseek-r1:32b"
      }
    }
  }
}

Графон сам роутит запросы: простые генерации идут в Qwen Coder, вопросы вида «почему расходится себестоимость» — в R1.

Типовые сценарии для тимлида

  • Ревью чужого кода. Агент по графу вызовов поднимает контекст изменённого метода и всех его коллег — без чтения всей формы.
  • Поиск мёртвого кода. Графон отдаёт список методов без входящих рёбер — кандидаты на удаление.
  • Аудит подписок. Все обработчики ПриЗаписи на объекте в одном срезе.
  • Миграция на БСП. По графу видно, где используется старая УправлениеДокументами и какой общий модуль её заменяет.
  • Онбординг. Newcomer спрашивает «как устроено закрытие месяца» — R1 идёт по графу ЗакрытиеМесяца и выдаёт пошаговую карту вызовов.

Итог

Локальный стек DeepSeek R1 + Qwen Coder закрывает вопросы приватности и стоимости, но без управления контекстом упирается в физику окна и VRAM. MCP-сервер Графон решает эту проблему на уровне архитектуры: вместо передачи гигабайтов XML агент получает точный срез графа. Результат — рост точности до 98,6 %, ускорение ответа в 7 раз и десятикратная экономия токенов, что делает локальные модели в 1С не игрушкой, а рабочим инструментом.