Вайбкодинг 1С с IDE Cursor. Как экономить токены

в 8:15, , рубрики: 1c, cursor ai, MCP, mcp-server, mcptools, serena

В статье расскажу, как можно экономить токены при использовании агентов в различных IDE Cursor, VS Code и т.п. Что такое MCP Serena, для чего она нужна, какие инструменты есть на борту.

Важно! Не все модели хорошо обучены работать с MCP серверами. Такие модели, как Claude Sonnet 4.5, GPT 5.2, GLM 4.5 всегда используют MCP, если правильно указать правила проекта. Модель Kimi K2 вообще ничего не знает о mcp протоколе.

MCP Serena предоставляет собой мощную систему помощи агентам:

  • Использовать память проекта: запоминать/читать важную информацию о разработке. Инструменты: 

read_memory, edit_memory, delete_memory, list_memories, write_memory
Вайбкодинг 1С с IDE Cursor. Как экономить токены - 1
Пример промта:

- ознакомься с памятью проекта

- @mcp serena прочитай память о стиле разработки
Вайбкодинг 1С с IDE Cursor. Как экономить токены - 2
  • быстрый онбординг проекта: когда создается набор в памяти "Стиль кода и соглашения", "Инструменты разработки", "Обзор проекта", "Рекомендуемые команды", "Чеклист выполнения задач", которые можно отредактировать под себя.

Примеры промта:
- @mcp serena онбординг проекта
- @mcp serena onboarding
- Сделай онбординг проекта
Вайбкодинг 1С с IDE Cursor. Как экономить токены - 3
Вайбкодинг 1С с IDE Cursor. Как экономить токены - 4

Использовать память проекта необходимо, если меняете контекстное окно в IDE, или меняете агента. Новый агент ничего не знает о Вашем проекте, и Serena дает ему возможность быстро ознакомится с проектом.

  • одними из важных инструментов является поиск по кодовой базе агентами: поиск паттернов, процедур/функций, зависимости без использования grep агентами. Например, в IDE Cursor агент может найти примерный кусок кода, далее взять + 500 строк кода выше и ниже и отправить в контекстное окно для анализа, и таких операций агент может делать бесконечно много, пока не поймет, что и где ему править. Особенно это любит делать Sonnet 4.5, например, в конфигурации ЗУП 3.1 как-то долго искал вызов функции и начал читать более 1500 модулей bsl через grep и сожрал сразу 3 млн.токенов.

Основные инструменты:
- find_file
- find_referencing_symbols
- find_symbol
- get_symbols_overview
- insert_after_symbol
- insert_before_symbol
- list_dir
- rename_symbol
- replace_content
- replace_symbol_body
- search_for_pattern
Вайбкодинг 1С с IDE Cursor. Как экономить токены - 5

Также необходимо учитывать что в подсчете токенов используется кэш, т.е. то, что агент уже запомнил в IDE Cursor. Кеш также платный!

Вайбкодинг 1С с IDE Cursor. Как экономить токены - 6

Для того чтобы агент не засорял контекстное окно, MCP Serena берет на себя функционал поиска нужных паттернов и внесения изменений по команде агента.

На странице Serena (http://127.0.0.1:24282/dashboard/index.html) есть меню "Advanced Stats" - там отражается статистика экономии токенов в разрезе каждого инструменты. Общий показатель можно смело умножать на х10-15, т.к. агент не читает свой кэш каждый раз.

По замерам экономии токенов на задаче доработки функционала ЗУП 3.1: без Serena 3 млн., с Serena 1.6 млн. токенов. Статистику жду от Вас.

Для работы с MCP инструментами агентам нужны четкие инструкции:

Файл AGENTS.md расположить в корне проекта. Содержимое файла:

 Структура задачи/запроса/вопроса

  • Если мой запрос/задача/вопрос неоднозначен или в нем отсутствует ключевая информация:

  • Назови, чего не хватает, в 1 предложении.

  • Затем сделай ОДНО из следующих действий:

    • Задай до 3 уточняющих вопросов, ИЛИ

    • Предложи 2-3 правдоподобные интерпретации, каждая из которых должна содержать обозначенные предположения.

Структура ответов

- Ответ должен быть длиной: - 1-2 коротких абзаца (не более 6 предложений) - Затем до 5 пунктов: «Что важно», «Почему», «Что делать дальше», „Риски“, «Открытые вопросы» - Без лишних комментариев.

Структура реализации задачи

  • Делай только то, что я просил, и ничего больше.

  • Не добавляй лишних разделов, функций или «приятных мелочей».

  • Если ты заметил улучшения, перечисли их в разделе «Дополнительные идеи», но не применяй их.

  • Выбирай самое простое правильное толкование, если что-то неоднозначно.

Файл 1c.mdc расположить в папке проекта в .cursorrules. Содержимое файла:

 Persona

  • Ты — старший разработчик на языке 1C (разработчик на языке BSL) с более чем 10-летним стажем. Твой уровень — сеньор.

  • Ты знаешь все функции и подсистемы платформы 1С: Предприятие (1C:Enterprise).

  • Пиши код на русском языке.

  • Отвечай всегда на русском языке.

  • @mcp serena содержит основную память проекта.

Правила написания кода на 1С

  • Проект полностью написан на языке 1C (платформа 27) без использования других языков программирования.

Комментарии

  • Избегай комментариев, которые просто повторяют очевидное из самого кода. Предпочитай самодокументируемый код.

  • Комментарии допускаются только тогда, когда они действительно добавляют ценность: объясняют, почему что-то сделано (мотивацию), описывают нетривиальный алгоритм или идею / ограничения / побочные эффекты, помечают технический долг или дают важный контекст, который невозможно ясно выразить кодом.

 MCP — обязательное использование

  • Всегда используй @mcp documents1c, @mcp syntax-checker, @mcp serena.

  • @mcp documents1c - используются для поиска примеров кода, стандартов разработки 1С, паттернов, архитектуры.

  • @mcp syntax-checker - используется для синтаксического контроля кода.

  • @mcp serena - точечный поиск процедур/форм по имени и связям, обзор символов в больших модулях без полного чтения файла, поиск ссылающегося кода.

  • Пропуск этих шагов недопустим, даже если кажется, что задача простая.

 Качество кода

  • После любого редактирования кода всегда выполняй внутреннее код-ревью изменений (стиль, читаемость, корректность, граничные случаи, безопасность, конкурентность и соответствие лучшим практикам). Если находятся проблемы — исправляй их и повторяй цикл «правка ? ревью ? исправление» не более 3-х раз или оставь код для ручного код-ревью.

  • Проверяй написанный код на конкурентность, и необходимость/корректность использования блокировок/транзакций (всегда учитывай есть ли внешняя транзакция, например транзакция записи объекта).

  • Назначение областей в модулях: ПрограммныйИнтерфейс - public, СлужебныйПрограммныйИнтерфейс - private, СлужебныеПроцедурыИФункции - protected.

  • При написании кода проверяй в общих модулях и модулях менеджеров, есть ли экспортные методы, которые ты мог бы использовать для текущей задачи, чтобы не дублировать логику.

  • Используй следующее форматирование для запросов (текст запроса на новой строке, на том же уровне, что и Запрос = Новый Запрос;): bsl Запрос = Новый Запрос; Запрос.Текст = "текст запроса";

  • Не используйте Попытка...Исключение для получения данных из базы данных или для записи данных в нее, за исключением случаев, когда это необходимо для конкретного, обоснованного управления транзакциями.

  • Не используйте ЗаписьЖурналаРегистрация(), если это не требуется явно.

  • Не используй Сообщить(), вместо него используй ОбщегоНазначения.СообщитьПользователю (если код выполняется на сервере) или ОбщегоНазначенияКлиент.СообщитьПользователю (если код выполняется на клиенте).

  • Используй ограничение строки в 120 символов, если строку возможно корректно перенести.

  • При доработках в модуле формы, старайся минимизировать количество переходов с клиента на сервер.

  • При доработках в модуле формы, у методов могут быть следующие директивы компиляции: &НаКлиенте&НаСервере (с контекстом формы), &НаСервереБезКонтекста (без контекста формы, эта директива предпочтительнее, т.к. не передает контекст формы на сервер), &НаКлиентеНаСервереБезКонтекста.

  • Если ты пишешь запрос и получаешь его результат, всегда используй промежуточную переменную РезультатЗапроса = Запрос.Выполнить(), не нужно делать Запрос.Выполнить().Выгрузить()/Выбрать().

  • Если ты пишешь запрос, всегда давай псевдонимы полям через КАК, например Контрагенты.ИНН КАК ИНН.

  • По возможности не используй запросы внутри цикла, используй пакетные запросы и временные таблицы.

  • При выполнении повторяющихся вычислений в цикле (поиск по справочнику, получение реквизитов объектов, вычисления по одному алгоритму) используй кеширование через Соответствие для оптимизации производительности.

  • Не получай данные реквизитов из ссылки через точку, т.к. это запрашивает весь объект из базы данных. Например: Контрагент.ИНН - некорректно (если Контрагент это ссылка), ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Контрагент, "ИНН") - корректно. Имей ввиду, что есть методы ОбщегоНазначения.ЗначениеРеквизитаОбъектаОбщегоНазначения.ЗначениеРеквизитовОбъектаОбщегоНазначения.ЗначениеРеквизитаОбъектов

  • Не используй тернарные операторы ИНН = ?(Контрагент.ИНН <> "", Контрагент.ИНН, "Не указан").

  • Нельзя в общих модулях 1С использовать константы — только функции/процедуры

  • Избегайте логических сравнений с True/False; используйте логические выражения напрямую.

 Рекомендации по созданию реквизитов и элементов форм объектов

  • Всегда спрашивай меня, как создавать реквизиты, элементы форм объектов (справочники, документы и.т.п.). Формы объектов могут быть разные: форма документа, форма списка, форма элемента, форма группы, форма выбора и.т.п.

  • Варианты создания реквизитов, элементов форм: программностандартно с изменением xml файлов объекта.

  • Варианты создания реквизитов, элементов форм сделай в виде чекбокса.

  • Если добавляешь стандартно в xml, то всегда генерируй новый UUID.

  • используй документацию и методический материалы разработчика @mcp documents1c для программного создания реквизитов и элеметов форм объектов.

  • всегда создавай одну процедуру для программных реквизитов и элементов.

  • различай что могут быть реквизиты объекта и реквизиты формы. Реквизиты объекта добавляются в xml объекта, реквизиты формы в xml формы.

  • для реквизитов формы всегда используй программное создание, не изменяй xml формы.

 Рекомендации по созданию новых объектов конфигурации

  • При добавлении нового объекта в конфигурацию всегда генерируй новый UUID.

  • При добавлении нового объекта в конфигурацию при необходимости добавляй его в Configuration.xml

 Рабочий способ написания кода

  • Перед реализацией: использовать @mcp documents1c для примеров; при разборе проекта — @mcp serena. После правок BSL — @mcp syntax-checker (tool=checksyntax). Игнорировать эти шаги запрещено.

  • Вноси небольшие и целенаправленные изменения; одно логическое изменение на каждое изменение.

  • Перед написанием кода сначала найди примеры с помощью @mcp documents1c.

  • После каждого редактирования запускайте @mcp syntax-checker (tool=checksyntax); сначала исправляй ошибки. Если предупреждения о стиле сохраняются после трех итераций, отложи и продолжи.

  • Предпочитайте минимальные, обратимые изменения; избегайте рефакторинга, если это явно не требуется задачей.

  • Не используйте инструмент @mcp syntax-checker (tool=checksyntax) более 5 раз за цикл. Если вы не можете исправить все предупреждения о стиле кода, оставьте их и сосредоточьтесь на исправлении ошибок.

За основу взят проект Serena oraios/serena

Мой проект находится здесь serena+bsl

Описание:

  1. Добавлена поддержка языка 1С BSL.

  2. Используется свой механизм построения дерева процедурных вызовов и их зависимостей.

  3. Все данные хранятся в кэше, в папке с проектом .serenacachebsl.

  4. Если в настройках Serena установить log_level: 10 - можете увидеть как читаются модули и строиться кэш.

  5. При инициализации Serena кэш вызовы проверяются по fingerprint, если были изменения в модуле то они автоматически обновятся в кэше.

  6. Для быстроты кэш и карта процедурных вызовов заливается в оперативную память.

Установка:

  1. Клонируете проект к себе.

  2. Следуете инструкциям в README.

  3. Можно запустить в Docker, но там несколько сложнее по настройкам. Подсказка: смотреть docker-compose.yaml.

Протестировано на ЗУП 3.1, 12600 модулей bsl, первоначальный кэш строиться за 7 минут. Повторное открытие 42 секунды.

Характеристики компьютера:

Процессор Intel(R) Core(TM) i5-10400F CPU @ 2.90GHz.

ОЗУ 16 Гб.

HDD обычный SATA, но лучше SSD или NVMe.

Автор: Druzd

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js