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.
Что делает Графон под капотом
Графон индексирует выгрузку и строит несколько слоёв графа:
- Граф метаданных — объект → реквизиты → формы → модули.
- Граф вызовов — кто вызывает
ОбщегоНазначения.ЗначениеРеквизитаОбъекта()и с какими аргументами. - Граф подписок —
ПодпискиНаСобытиятипаПередЗаписьюи их обработчики. - Граф запросов — какие временные таблицы и регистры трогает конкретный метод.
Всё это доступно ИИ-агенту через 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С не игрушкой, а рабочим инструментом.