16 сентября 2026 г.
Поиск связей общих модулей и подписок на события 1С для ИИ: MCP-сервер Графон вместо гигабайтов контекста
Почему ИИ-агент «слепнет» на большой конфигурации 1С
Выгрузка ERP или ЗУП в XML — это 3–8 ГБ файлов, из которых 400–900 МБ приходится на модули BSL. Один общий модуль уровня ЦенообразованиеСервер, УправлениеЗапасами или ОбщегоНазначения — это 5 000–25 000 строк. Когда Claude Code, Cursor или Windsurf открывает такой файл целиком, он сжигает 40–80 тысяч токенов на один модуль и всё равно не видит главного: как этот модуль связан с остальной конфигурацией.
Особенно болезненны два типа связей:
- Вызовы общих модулей. Метод
РассчитатьЦену()живёт в одном модуле, вызывается из семи документов и трёх обработок, а его поведение зависит от проведения подчинённого документа. - Подписки на события. Обработчик лежит в общем модуле, а связь с объектом объявлена в XML-метаданных подписки. Grep по
ПриЗаписине находит ничего — в модуле объекта этого кода просто нет.
Именно здесь ИИ-агенты начинают галлюцинировать: придумывают несуществующие методы, «забывают» обработчик подписки, ломают логику при рефакторинге.
Два типа связей, которые теряются чаще всего
Связь №1: вызовы общих модулей
// Общий модуль ЦенообразованиеСервер, флаг «Сервер»
Процедура РассчитатьЦенуНоменклатуры(Номенклатура, ДатаЦены) Экспорт
Если Номенклатура.Пустая() Тогда
ВызватьИсключение НСтр("ru = 'Не заполнена номенклатура'");
КонецЕсли;
Цена = ПолучитьПоследнююЦену(Номенклатура, ДатаЦены);
Скидка = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Номенклатура, "МаксимальнаяСкидка");
Возврат ?(Цена = Неопределено, 0, Цена * (1 - Скидка / 100));
КонецПроцедуры
Чтобы понять эту функцию, агенту нужны ПолучитьПоследнююЦену (локальный вызов), ОбщегоНазначения.ЗначениеРеквизитаОбъекта (внешний модуль), тип реквизита МаксимальнаяСкидка из метаданных справочника. Без графа агент читает три-четыре файла наугад.
Связь №2: подписки на события
// Общий модуль НаСобытияРеализации (Сервер, ВызовСервера)
// Подписка: Источник = Документ.РеализацияТоваровУслуг, Событие = ПриЗаписи
Процедура КонтрольЦенПриЗаписи(Источник, Отказ) Экспорт
Если Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
Для Каждого СтрокаТЧ Из Источник.Товары Цикл
ЦенаКонтрольная = ЦенообразованиеСервер.РассчитатьЦенуНоменклатуры(
СтрокаТЧ.Номенклатура, Источник.Дата);
Если СтрокаТЧ.Цена < ЦенаКонтрольная Тогда
Отказ = Истина;
Сообщить("Цена ниже минимальной: " + СтрокаТЧ.Номенклатура);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Здесь скрытая цепочка: Документ → подписка → общий модуль → другой общий модуль → реквизит метаданных. Это классический случай, когда агент без графа выдаёт неполный ответ.
Архитектура Графона: граф зависимостей конфигурации
Графон собирает граф в четыре слоя прямо на машине разработчика, без облака и без выгрузки кода наружу:
- Парсер метаданных — проходит XML-выгрузку, индексирует объекты, реквизиты, формы, подписки на события, регламентные задания.
- Парсер BSL — строит AST каждого модуля, вытягивает объявления процедур и функций, экспортные флаги, области, фактические вызовы.
- Построитель графа — соединяет узлы рёбрами
вызывает,подписан_на,использует_реквизит,читает_таблицу,экспортирует. - MCP-сервер — отдаёт агенту готовые срезы через Model Context Protocol.
| Узел графа | Входящие/исходящие рёбра |
|---|---|
| Общий модуль | экспортирует метод, вызывает модуль, читает метаданные |
| Метод (процедура/функция) | вызывает, вызывается_из, использует_реквизит |
| Подписка на событие | источник, событие, обработчик, режим |
| Объект метаданных | имеет_реквизит, имеет_форму, участвует_в_подписке |
| Запрос (текст) | читает_таблицу, читает_поле |
MCP-инструменты: что именно запрашивает агент
{
"jsonrpc": "2.0",
"id": 42,
"method": "tools/call",
"params": {
"name": "find_event_subscriptions",
"arguments": {
"source": "Документ.РеализацияТоваровУслуг",
"event": "ПриЗаписи",
"with_handler_body": true,
"trace_call_chain_depth": 2
}
}
}
Ответ — уже отфильтрованный срез: только обработчик, только вызываемые им методы до второго уровня, только использованные реквизиты. Не 200 000 токенов XML, а 4 000–8 000 токенов по делу.
Ключевые инструменты Графона:
find_module_links— все входящие и исходящие связи общего модуля;find_event_subscriptions— подписки по источнику, событию или обработчику;get_call_chain— граф вызовов от точки входа до листа;get_context_slice— минимальный набор файлов и сигнатур для задачи;impact_analysis— обратный анализ: кого сломает изменение метода;find_query_usage— где читается конкретная таблица или реквизит.
Сценарий: «кто перезаписывает цены при проведении реализации»
Промпт агенту в Cursor или Claude Code:
Используй графон. Найди все подписки на событие ПриЗаписи для Документ.РеализацияТоваровУслуг, построй цепочку вызовов до 3 уровней и покажи, какие общие модули влияют на реквизит Товары.Цена.
Агент делает три MCP-вызова и получает: подписку КонтрольЦенПриЗаписи, цепочку ЦенообразованиеСервер.РассчитатьЦенуНоменклатуры → ПолучитьПоследнююЦену, список из шести модулей-участников и точные номера строк. Без Графона тот же результат достигается чтением 18–25 файлов и всё равно остаётся неполным.
Сравнение: с Графоном и без
| Задача | Токенов без Графона | Токенов с Графоном | Время без | Время с |
|---|---|---|---|---|
| Найти подписки на ПриЗаписи документа | ~180 000 | ~4 500 | 10–15 мин | 30–60 сек |
| Цепочка вызовов от подписки (3 уровня) | ~320 000 | ~9 000 | 20–30 мин | 1–2 мин |
| Анализ влияния правки метода | ~450 000 | ~12 000 | 30+ мин | 2 мин |
| Онбординг в чужой общий модуль | ~210 000 | ~6 000 | 15 мин | 45 сек |
| Поиск, где читается реквизит | ~150 000 | ~3 500 | 8–12 мин | 20 сек |
Экономия — до 10 раз по токенам и в 10–20 раз по времени. Главное: агент перестаёт выдумывать методы, потому что работает не с «похоже на то», а с реальными сигнатурами из графа.
Как встроить Графон в пайплайн команды
- Установите Графон локально и укажите путь к XML-выгрузке конфигурации.
- Запустите первичную индексацию — граф строится один раз, инкрементально обновляется по изменённым файлам.
- Пропишите MCP-сервер в конфигурацию Claude Code (
.mcp.json), Cursor или Windsurf. - Добавьте в правила проекта инструкцию: «перед анализом BSL всегда вызывай
get_context_slice». - Включите Графон в pre-commit хук:
impact_analysisпо изменённым методам покажет затронутые подписки и общие модули.
// Пример проверки в CI: регламентное задание контроля графа связей
Процедура ПроверитьЦелостностьГрафаСвязей() Экспорт
Отчёт = Графон.ПроверитьСвязи(
Новый Структура("ВключатьПодписки, Глубина", Истина, 3));
Для Каждого Проблема Из Отчёт.РазорванныеСвязи Цикл
ЗаписьЖурналаРегистрации("Графон.Связи",
УровеньЖурналаРегистрации.Предупреждение, , ,
Проблема.Описание);
КонецЦикла;
КонецПроцедуры
Ограничения, о которых стоит знать
- Граф строится по статическому анализу: динамические вызовы через
Вычислить()иВыполнить()в него не попадают — их нужно помечать вручную. - Подписки, добавленные расширениями конфигурации, индексируются отдельно, проверяйте режим заимствования.
- Для очень больших КА и ERP первичная индексация занимает 10–25 минут, поэтому её лучше запускать ночью или на выделенной машине.
- Контекстный срез бессмысленен без актуального графа: после крупного мержа обязательно делайте реиндексацию.
Чек-лист внедрения
- Индексация конфигурации и расширений в Графоне.
- Подключение MCP-сервера к вашему ИИ-агенту.
- Замер базовой стоимости задачи без графа для сравнения.
- Правила промптов: сначала
find_event_subscriptions, потомget_call_chain, только потом чтение кода. - Ревью ответов агента по графу перед коммитом.
- Регламентная реиндексация после обновления конфигурации.
Поиск связей общих модулей и подписок на события 1С для ИИ — это не про «скормить побольше кода модели», а про точный контекст. Графон отдаёт агенту ровно тот срез графа, который нужен для ответа, и это единственный способ работать с ERP, ЗУП и КА без десятикратного перерасхода токенов и без галлюцинаций.