Все статьи

18 октября 2026 г.

Генерация обработок 1С через Cursor без галлюцинаций по метаданным

Почему Cursor галлюцинирует на метаданных 1С

Генерация обработок 1С через Cursor выглядит простой только до первого реального проекта. В типовой ERP, УТ, ЗУП или КА — гигабайты XML-метаданных и сотни тысяч строк BSL. Если ИИ-агент пытается работать с конфигурацией через @codebase, эмбеддинги или ручную загрузку файлов, он получает неполный и «размытый» контекст. Результат предсказуем: несуществующие реквизиты, вызовы отсутствующих процедур, неверные типы регистров, формы с элементами, которых нет в метаданных.

Типичные ошибки без графа метаданных:

  • агент придумывает метод ПолучитьОстаткиТоваров(), хотя в конфигурации есть только запрос к регистру накопления;
  • путает Справочник.Номенклатура.ЕдиницаИзмерения и Справочник.Номенклатура.БазоваяЕдиницаИзмерения;
  • генерирует форму с реквизитом, которого нет в объекте;
  • предлагает запрос к РегистрНакопления.ТоварыНаСкладах, не проверяя измерения и ресурсы;
  • тратит 250–800 тыс. токенов на задачу, где достаточно 25–80 тыс.

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

Архитектура Графона: граф вместо «всей конфигурации»

Графон — локальный инструмент и MCP-сервер для 1С:Предприятие. Он индексирует XML-метаданные и BSL-код, строит граф зависимостей и отдаёт ИИ-агенту только связанные узлы.

Схема потока:

  1. Графон сканирует каталог конфигурации или расширения.
  2. Парсит объекты метаданных, модули, формы, общие модули, подписки, запросы.
  3. Строит граф: объект → реквизиты → формы → обработчики → вызовы процедур → чтение/запись регистров.
  4. Cursor через MCP запрашивает контекст конкретной задачи.
  5. Графон возвращает точные файлы, сигнатуры и зависимости.
  6. Cursor генерирует BSL.
  7. Перед применением агент валидирует ссылки через Графон.

Такой подход сокращает потребление токенов до 10 раз и убирает главную причину галлюцинаций — работу по неполному контексту.

MCP-запросы: как Cursor получает метаданные

Пример запроса контекста объекта перед генерацией обработки:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "grafon.get_object_context",
    "arguments": {
      "object": "Справочник.Номенклатура",
      "include": ["attributes", "tab_sections", "forms", "modules"],
      "depth": 2
    }
  }
}

Пример запроса сигнатур и вызываемых методов:

{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/call",
  "params": {
    "name": "grafon.get_signature",
    "arguments": {
      "symbols": [
        "ОбщийМодуль.ОбщегоНазначения.ЗначениеРеквизитаОбъекта",
        "Справочники.Номенклатура.НайтиПоРеквизиту"
      ]
    }
  }
}

Пример запроса контекста формы:

{
  "jsonrpc": "2.0",
  "id": 3,
  "method": "tools/call",
  "params": {
    "name": "grafon.get_form_context",
    "arguments": {
      "owner": "Обработка.ЗагрузкаТоваровИзCSV",
      "form": "Форма",
      "include": ["elements", "commands", "handlers", "attributes"]
    }
  }
}

Cursor получает не «всю 1С», а конкретный граф: какие реквизиты есть, какие типы используются, какие методы существуют и как они вызываются.

Сценарий: генерация внешней обработки загрузки товаров

Задача: создать внешнюю обработку ЗагрузкаТоваровИзCSV, которая читает CSV, ищет номенклатуру по артикулу, создаёт элемент и записывает цену в регистр сведений.

Промпт для Cursor:

Сгенерируй внешнюю обработку 1С. Перед генерацией вызови Grafon MCP:
1) get_object_context для Справочник.Номенклатура;
2) get_object_context для РегистрСведений.ЦеныНоменклатуры;
3) get_signature для методов поиска и записи.
Используй только реальные реквизиты и методы из ответа Графона.
После генерации вызови grafon.validate_bsl_references и исправь ошибки.

Фрагмент BSL, который агент может собрать по точному контексту:

Функция ЗагрузитьТоварыИзCSV(ПутьКФайлу) Экспорт
    Результат = Новый Структура("Успешно, Ошибки", Ложь, Новый Массив);
    Чтение = Новый ЧтениеТекста(ПутьКФайлу, "UTF-8");

Пока Истина Цикл
Строка = Чтение.ПрочитатьСтроку();
Если Строка = Неопределено Тогда
Прервать;
КонецЕсли;
Если ПустаяСтрока(Строка) Тогда
Продолжить;
КонецЕсли;

Части = СтрРазделить(Строка, ";");
Если Части.Количество() < 4 Тогда
Результат.Ошибки.Добавить("Некорректная строка: " + Строка);
Продолжить;
КонецЕсли;

Артикул = СокрЛП(Части[0]);
Наименование = СокрЛП(Части[1]);
КодЕдиницы = СокрЛП(Части[2]);
Цена = ?(ЗначениеЗаполнено(Части[3]), Число(Части[3]), 0);

НачатьТранзакцию();
Попытка
Ссылка = СоздатьИлиНайтиНоменклатуру(Артикул, Наименование, КодЕдиницы);
ЗаписатьЦену(Ссылка, Цена);
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
Результат.Ошибки.Добавить("Ошибка: " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;

Чтение.Закрыть();
Результат.Успешно = Результат.Ошибки.Количество() = 0;
Возврат Результат;
КонецФункции

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

Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.Ссылка;
КонецЕсли;

Объект = Справочники.Номенклатура.СоздатьЭлемент();
Объект.Наименование = Наименование;
Объект.Артикул = Артикул;
Объект.ЕдиницаИзмерения = Справочники.УпаковкиЕдиницыИзмерения.НайтиПоКоду(КодЕдиницы);
Объект.Записать();
Возврат Объект.Ссылка;
КонецФункции

Процедура ЗаписатьЦену(Номенклатура, Цена)
Если Цена <= 0 Тогда
Возврат;
КонецЕсли;

МенеджерЗаписи = РегистрыСведений.ЦеныНоменклатуры.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Период = ТекущаяДатаСеанса();
МенеджерЗаписи.Номенклатура = Номенклатура;
МенеджерЗаписи.Цена = Цена;
МенеджерЗаписи.Записать();
КонецПроцедуры

Важно: в реальной конфигурации имена реквизитов и регистров могут отличаться. Графон как раз возвращает фактические имена, а не предположения модели.

Валидация после генерации

Генерация без проверки — это только половина процесса. Перед применением изменений Cursor вызывает валидатор:

{
  "jsonrpc": "2.0",
  "id": 4,
  "method": "tools/call",
  "params": {
    "name": "grafon.validate_bsl_references",
    "arguments": {
      "file": "src/Обработки/ЗагрузкаТоваровИзCSV/Ext/ObjectModule.bsl",
      "check": ["metadata", "methods", "queries"]
    }
  }
}

Если Графон находит неизвестный реквизит, отсутствующий метод или запрос к несуществующему регистру, агент получает структурированную ошибку и исправляет код до коммита.

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

| Параметр | Cursor без Графона | Cursor + Графон |
|---|---|---|
| Контекст | Вся конфигурация, эмбеддинги, случайные файлы | Точный срез: объект, формы, сигнатуры, зависимости |
| Токены на задачу | 250–800 тыс. и выше | 25–80 тыс. |
| Время до рабочего каркаса | 20–40 мин | 5–12 мин |
| Риск галлюцинаций | Высокий: несуществующие реквизиты и методы | Низкий: проверка по графу и валидатор |
| Работа с типовой | Часто требует ручной сверки | Контекст строится по фактическим метаданным |
| Безопасность | Код и метаданные могут уходить в облако | Локальный индекс и MCP-сервер |

Диапазоны зависят от конфигурации и задачи, но экономия достигается именно за счёт отказа от передачи «всего проекта» в контекст.

Практические сценарии для команды 1С

  • Генерация внешних обработок и отчётов по точным метаданным.
  • Доработка типовых конфигураций через расширения.
  • Рефакторинг общих модулей с запросом всех вызывающих методов.
  • Онбординг: новый разработчик через Cursor и Графон быстрее понимает связи объектов.
  • Код-ревью: агент проверяет ссылки на метаданные до запуска в 1С.

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

  1. Установите Графон и проиндексируйте конфигурацию или расширение.
  2. Подключите MCP-сервер в Cursor. Пример конфигурации:
{
  "mcpServers": {
    "grafon": {
      "command": "grafon",
      "args": ["mcp", "--config", "C:/1C/ERP"]
    }
  }
}
  1. В промптах требуйте сначала вызывать get_object_context, get_signature, get_form_context.
  2. Запретите агенту использовать метаданные, которых нет в ответе Графона.
  3. Добавьте обязательный вызов validate_bsl_references перед применением кода.
  4. Для сложных задач просите Графон возвращать глубину зависимостей 2–3, а не весь проект.

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