18 октября 2026 г.
Генерация обработок 1С через Cursor без галлюцинаций по метаданным
Почему Cursor галлюцинирует на метаданных 1С
Генерация обработок 1С через Cursor выглядит простой только до первого реального проекта. В типовой ERP, УТ, ЗУП или КА — гигабайты XML-метаданных и сотни тысяч строк BSL. Если ИИ-агент пытается работать с конфигурацией через @codebase, эмбеддинги или ручную загрузку файлов, он получает неполный и «размытый» контекст. Результат предсказуем: несуществующие реквизиты, вызовы отсутствующих процедур, неверные типы регистров, формы с элементами, которых нет в метаданных.
Типичные ошибки без графа метаданных:
- агент придумывает метод
ПолучитьОстаткиТоваров(), хотя в конфигурации есть только запрос к регистру накопления; - путает
Справочник.Номенклатура.ЕдиницаИзмеренияиСправочник.Номенклатура.БазоваяЕдиницаИзмерения; - генерирует форму с реквизитом, которого нет в объекте;
- предлагает запрос к
РегистрНакопления.ТоварыНаСкладах, не проверяя измерения и ресурсы; - тратит 250–800 тыс. токенов на задачу, где достаточно 25–80 тыс.
Проблема не в модели, а в контексте. Cursor нужен точный срез конфигурации: сигнатуры, связи, владельцы, формы, подписки и зависимости запросов. Именно это даёт MCP-сервер Графон.
Архитектура Графона: граф вместо «всей конфигурации»
Графон — локальный инструмент и MCP-сервер для 1С:Предприятие. Он индексирует XML-метаданные и BSL-код, строит граф зависимостей и отдаёт ИИ-агенту только связанные узлы.
Схема потока:
- Графон сканирует каталог конфигурации или расширения.
- Парсит объекты метаданных, модули, формы, общие модули, подписки, запросы.
- Строит граф: объект → реквизиты → формы → обработчики → вызовы процедур → чтение/запись регистров.
- Cursor через MCP запрашивает контекст конкретной задачи.
- Графон возвращает точные файлы, сигнатуры и зависимости.
- Cursor генерирует BSL.
- Перед применением агент валидирует ссылки через Графон.
Такой подход сокращает потребление токенов до 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С.
Чек-лист внедрения
- Установите Графон и проиндексируйте конфигурацию или расширение.
- Подключите MCP-сервер в Cursor. Пример конфигурации:
{
"mcpServers": {
"grafon": {
"command": "grafon",
"args": ["mcp", "--config", "C:/1C/ERP"]
}
}
}
- В промптах требуйте сначала вызывать
get_object_context,get_signature,get_form_context. - Запретите агенту использовать метаданные, которых нет в ответе Графона.
- Добавьте обязательный вызов
validate_bsl_referencesперед применением кода. - Для сложных задач просите Графон возвращать глубину зависимостей 2–3, а не весь проект.
Генерация обработок 1С через Cursor без галлюцинаций по метаданным возможна не за счёт «более умной модели», а за счёт правильного контекста. Графон превращает конфигурацию 1С в локальный граф зависимостей и отдаёт агенту только то, что нужно для конкретной задачи. Это снижает расход токенов, ускоряет разработку и делает результат проверяемым до записи в информационную базу.