Все статьи

17 октября 2026 г.

Рефакторинг процедур проведения документов 1С с помощью ИИ: практическое руководство с Графон MCP

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

ОбработкаПроведения в типовых конфигурациях (ERP 2.5, УТ 11, ЗУП 3.1, КА 2) — это классическое легаси «в квадрате»: 300–1500 строк на документ, вложенные движения по 5–15 регистрам, прямые запросы, дублирующаяся логика контроля остатков и побочные эффекты в общих модулях. Ручной рефакторинг такого кода дорог и рискован: одна неучтённая подписка на ПриЗаписи — и проведение начнёт «плыть» в промышленной эксплуатации.

ИИ здесь даёт реальный рычаг: декомпозировать 800-строчную монолитную процедуру на методы, вынести контроль остатков в общий модуль, добавить управляемые блокировки и убрать дублирующиеся запросы. Но есть нюанс — «ванильные» ИИ-агенты на 1С стабильно ломаются.

Три причины, по которым Claude Code без MCP сдаётся на 1С

  1. Переполнение контекста. Метаданные средней ERP в XML — это гигабайты. Модуль объекта РеализацияТоваровУслуг вместе с общими модулями ОбщегоНазначения, УправлениеЗапасами, РасчетСебестоимости — десятки тысяч строк. Агент либо обрезает код, либо теряет связность.
  2. 10x перерасход токенов. На каждую итерацию агент заново загружает десятки тысяч лишних строк соседних документов, которые к задаче не относятся.
  3. Галлюцинации контрактов. Агент «додумывает» сигнатуру Движения.ТоварыНаСкладах.Добавить() и путает параметры, если в контексте оказалось несколько регистров с похожими именами.

Что даёт Графон агентy

Графон — локальный MCP-сервер, который индексирует конфигурацию и строит граф зависимостей: метаданные → модули → процедуры → вызовы → подписки → запросы. Агент через MCP запрашивает только точный срез: сигнатуру нужной процедуры + её прямые зависимости, без чтения гигабайтов XML.

{
  "method": "mcp/call",
  "params": {
    "name": "grafon.dependencies",
    "arguments": {
      "object": "Документ.РеализацияТоваровУслуг",
      "procedure": "ОбработкаПроведения",
      "depth": 2
    }
  }
}

Ответ приходит в виде компактного среза файлов (обычно 3–8 КБ текста вместо 300–500 КБ), пригодного для немедленного рефакторинга.

Практический сценарий: «РеализацияТоваровУслуг»

До рефакторинга (фрагмент):

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    Движения.ТоварыНаСкладах.Записывать = Истина;
    Для Каждого Строка Из Товары Цикл
        Движение = Движения.ТоварыНаСкладах.Добавить();
        Движение.Период = Дата;
        Движение.Склад = Склад;
        Движение.Номенклатура = Строка.Номенклатура;
        Движение.Количество = -Строка.Количество;
        Движение.Стоимость = -Строка.Сумма;
    КонецЦикла;
    // 700 строк: запросы остатков, дублирующаяся логика, отсутствие блокировок
КонецПроцедуры

Запрос к агенту через граф:

> Claude, через Grafon проанализируй ОбработкаПроведения у РеализацияТоваровУслуг.
  Найди: дубли запросов к ТоварыНаСкладах, отсутствие управляемых блокировок,
  вызовы из общих модулей. Предложи декомпозицию с сохранением контракта.

Результат после рефакторинга:

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    УстановитьПривилегированныйРежим(Истина);
    ЗаблокироватьДанныеДляПроведения();
    СформироватьДвиженияПоТоварам();
    СформироватьДвиженияПоВзаиморасчетам();
    КонтрольОстатков(Отказ);
КонецПроцедуры

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

Процедура СформироватьДвиженияПоТоварам()
Движения.ТоварыНаСкладах.Записывать = Истина;
Для Каждого Строка Из Товары Цикл
Движение = Движения.ТоварыНаСкладах.Добавить();
ЗаполнитьЗначенияСвойств(Движение, Строка);
Движение.Период = Дата;
Движение.Склад = Склад;
Движение.Количество = -Строка.Количество;
Движение.Стоимость = -Строка.Сумма;
КонецЦикла;
КонецПроцедуры

Агент опирался на граф Графона: он «видел» только ОбработкаПроведения, вызываемые процедуры и подписки на ПриЗаписи, — и не галлюцинировал с именами регистров.

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

| Параметр | Без Графона | С Графоном MCP |
|---|---|---|
| Размер контекста на итерацию | 200–600 КБ XML/BSL | 3–10 КБ среза |
| Токенов на полный рефакторинг | 180 000–350 000 | 18 000–35 000 |
| Стоимость в Claude Sonnet (≈) | $3–6 | $0,30–0,60 |
| Время до рабочего патча | 15–40 мин | 3–8 мин |
| Галлюцинации контрактов | частая проблема | практически исключены |
| Понимание подписок на события | теряется | явно в графе |

Разница в 8–10 раз по токенам достигается за счёт того, что агент не тащит в контекст соседние документы, формы и общие модули, не относящиеся к задаче.

Типовые MCP-запросы для рефакторинга проведения

  • grafon.find_callers — кто вызывает ОбработкаПроведения (подписки, обработчики, сервисы).
  • grafon.event_subscriptions — все подписки на ПриЗаписи, ПередЗаписью, ПриПроведении для документа.
  • grafon.query_usage — в каких процедурах процедуры проведения выполняется запрос к регистру ТоварыНаСкладах (для поиска дублей).
  • grafon.affected_by_change — обратный граф: если переименовать метод, что сломается.
  • grafon.metadata_registers — состав движений документа по метаданным RegisterRecords.

Чек-лист внедрения

  1. Установить Графон локально и проиндексировать конфигурацию (ERP/УТ/ЗУП/КА).
  2. Подключить MCP-сервер в Claude Code, Cursor или Windsurf.
  3. Прогнать grafon.event_subscriptions на целевой документ — зафиксировать контракт.
  4. Выполнить рефакторинг по методу «сначала граф, потом патч»: сначала срез зависимостей, потом код.
  5. Проверить через grafon.affected_by_change, что ни одна подписка не сломана.
  6. Прогнать регресс на тестовой базе с журналом проведения.

Рефакторинг процедур проведения 1С с помощью ИИ перестаёт быть лотереей, когда у агента есть дисциплинированный доступ к графу зависимостей. Графон — тот самый ограничитель контекста, который превращает «умного, но рассеянного» агента в предсказуемого инженера-рефакторщика.