Представляем развитие проекта MCP-сервера для поиска метаданных 1С для программирования с LLM.
Ускорение разработки
Быстрое и простое развертывание в контейнерах
Уменьшение затрат на LLM
В новой версии ряд важных изменений
Выдача результатов поиска теперь максимально компактная
- • только идентификаторы и наименования объектов метаданных (внутреннее наименование и синоним).
- • Результаты возвращаются в двух форматах: и в структурированном json'е и плоским текстом.
- • Первый хорошо понимают современные клиенты типа cursor'а, а обычный текст пока оставлен для обратной совместимости с mcp-клиентами, которые не поддерживают структурированный ответ.
- • На моем опыте - современные llm'ки отлично сами понимают какой из результатов поиска наиболее релевантный, без необходимости подключать реранкер. Такой подход дает лучшую предсказуемость и, самое главное, - не засоряет контекстное окно лишними данными.
Переработан гибридный поиск
- • Теперь семантический поиск по обычным векторам можно смешивать с поиском по разреженным или sparse-векторам, в которые по алгоритму bm25 кодируются ключевые слова всего тела описания объекта метаданных.
- • Для каких-то конфигураций 1С с использованием какой-то особой терминологии в названиях реквизитов - подключение поиска по разреженным векторам даст заметный прирост качества поиска.
- • Для типовых же конфигураций особого улучшения поиска не будет, потому что "специфичные" ключевые слова и так обычно фигурирую в наименовании объекта. Например, если нужно найти документ или справочник связанный с работой с ЕГАИС, то слово ЕГАИС и так присутствует в названии.
Бонусом добавил mcp для проверки синтаксиса и поиска по справке синтакс-помощника
- • Бонусом, потому что эти mcp основаны на чужих решениях (в частности справка по синтаксису от Алексея Корякина), я же оборачиваю это в удобный запуск в docker-контейнерах.
- • Для проверки синтаксиса сделал так, чтобы BSL Language Server запускался в websocket-режиме, чтобы каждое обращение mcp на проверку синтаксиса не переподнимало каждый раз java-приложение (это не мгновенно).
Если детализировать схему до конкретных контейнеров, то получается такая схема:
Именно mcp тут три контейнера, остальные вспомогательные.
Может возникнуть резонный вопрос: зачем такая фрагментация?
Потому что микросервисную архитектуру проще разрабатывать, тестировать и, самое главное, эти сервисы можно переиспользовать.
Достоинства и преимущества решения
Компактный вывод результатов
Минимизирует нагрузку на контекстное окно LLM, ускоряя обработку запросов и снижая затраты на API.
Гибридный поиск
Семантический + BM25 повышает точность для нестандартных конфигураций 1С, где ключевые слова в описаниях не совпадают с названиями.
Выбор моделей векторизации
Включая легковесные, обеспечивая быстрый отклик — идеально для локального развертывания без облачных затрат.
Поддержка нескольких конфигураций 1С
В одной БД позволяет работать с разными проектами одновременно, без переключений.
Микросервисная архитектура
Упрощает масштабирование и интеграцию: каждый компонент можно использовать отдельно в других проектах.
Переработанный с нуля MCP для проверки синтаксиса
LLM-агенты IDE общаются с MCP только текстом. Из-за этого наивный подход к проверке синтаксиса работает плохо, потому что LLM'ке нужно сформировать для MCP запрос с текстом модуля, а модули в 1С бывают гигантские. Да, LLM-агенты умеют сами понять, что можно проверять только одну процедуру/функцию, но это все равно дорогие выходные (output) токены.
Намного экономнее, быстрее и правильнее передавать для проверки в MCP имя файла. Это потребует сделать для MCP-сервера "видимой" папку с исходниками 1С, но при работе с docker это не проблема. При таком подходе практически не тратятся output токены.
Кроме этого получились дополнительные преимущества:
- Для bsl language server можно указать
configurationRoot
и инициализировать рабочее пространство. Да, первый запуск будет долгим, но последующие проверки быстрыми с более глубокими с анализом (с учетом общих модулей). - Включена по умолчанию опция выводить результаты проверки только с ошибками, скрывая предупреждения и рекомендации. Это сильно уменьшает засорение контекста (услышал недавно красивый термин "context poisoning" или отравление контекста).
- Сокращен формат ответа, сохраняя структурность. Опять же - ради экономии окна контекста.
- Разные LLM-агенты по разному передают имя файла, некоторые полный путь, некоторые относительный. MCP автоматически понимает оба варианта.
- MCP можно запустить с выбором транспортного протокола: Streamable HTTP или SSE. Ранее казалось, что уже все поддерживают Streamable HTTP, но нет, тот же Gemini CLI работает только по SSE, хотя бы ради него добавлена совместимость с SSE.
- Для больших кодовых баз, типа ERP можно опционально указать параметры памяти Java (Xms/Xmx) для bsl language server.
Остался для меня открытым вопрос, а кто экранирует текст модулей для JSON-RPC вызова? Не смог найти убедительной информации о логике работы агентов типа Cline, RooCode или Copilot, скорее всего экранирование делает фреймворк агента (не тратя токены).
Пример работы:
Схема работы:
Пример результатов проверки:
{
"ok": true,
"file": "/src/DataProcessors/СинхронизацияЭДО/Ext/ManagerModule.bsl",
"count": 1,
"summary": {"errors": 1, "warnings": 0, "information": 0, "hints": 0 },
"diagnostics": [
{
"range": [[34,7], [34,43]],
"severity": "error",
"code": "IdenticalExpressions",
"msg": "Слева и справа от оператора \"<>\" находятся одинаковые подвыражения: \"ИдентификаторЭДО\""
}
],
"elapsed_ms": 61,
"source": "mcp"
}
- Останавливаем предыдущие два контейнера:
docker compose stop mcp-bsl-check docker compose stop bsl-language-server
- Скачиваем новую версию файлов.
- Для нового
docker-compose.yaml
указываем свои настройки проекта:volumes
— папка исходников 1С с хоста в контейнерBSL_ONLY_ERRORS
— выводить ли все диагностики или только ошибкиHOST_WORKSPACE_DIR
— путь к папке исходников 1С на хосте, для правильной обработки в MCP как абсолютных так и относительных путейBSL_SKIP_WORKSPACE_INIT
— пропускать или нет инициализацию рабочего пространстваMCP_TRANSPORT
— вариант транспортного протокола для MCP (sse
илиhttp
)
... mcp-bsl-checker: image: ghcr.io/fserg/mcp-bsl-checker:v1.1 container_name: mcp-bsl-checker ports: - "9004:8000" volumes: # Проброс папки исходников 1С в контейнер - C:/1C_Base/vs-test/1c-src-ut:/src:ro # Проброс файла конфигурации bsl language server - ./bsl-ls/.bsl-language-server.json:/config/.bsl-language-server.json:ro environment: # --- Core settings --- BSL_JAR_PATH: "bsl-ls/bsl-language-server-0.24.2-exec.jar" BSL_ONLY_ERRORS: 1 # "0" или "1" - показывать только ошибки или включая предупреждения и рекомендации ... # --- Workspace / paths --- HOST_WORKSPACE_DIR: "C:/1C_Base/vs-test/1c-src-ut" # Путь к папке исходников 1С на хосте BSL_LS_WORKSPACE_DIR: "/src" # Выполнять ли инициализацию рабочего пространства (долгий запуск, но более глубокие проверки) BSL_SKIP_WORKSPACE_INIT: 0 # "1" - пропустить инициализацию, "0" - выполнять инициализацию # --- MCP --- MCP_TRANSPORT: "http" # "sse" или "http" для Streamable HTTP ... # в файле .bsl-language-server.json все так же можно выключить или поменять настройки каких-либо диагностик
- Запускаем новый вариант проверки синтаксиса:
docker compose up -d mcp-bsl-checker
Комплект поставки
Решение поставляется в виде нескольких файлов:
- Docker-compose файл описывающего запуск всех контейнеров
- Большинство настроек задаются в нем же. Пояснения к настройкам будут в текстовой версии публикации.
- В отдельный файлик вынесены настройки сервера, чтобы можно было выключать/выключать опции проверок, например оставить только критичные тем самым сэкономив еще немного контекста.
- Обработка выгрузки описания метаданных
- Примеров файлов конфигурации mcp для cursor и vs code (для других IDE конфигурации аналогичны)
Под вопросом доступ к исходникам. Мне кажется, их глупо скрывать - они доступны внутри контенейров. Но и просто публично размещать их на гитхабе не хочется - тогда теряется мотивация к покупке.
Запуск
Копируете файлы поставки в любую удобную папку, например: C:\mcp\
В консоли выполняете:
cd C:\mcp
docker compose up -d
Дольше всего будет запускаться контейнер embedding-service
, он объемные (4+Гб) и при первом запуске будет скачивать модель векторизации.
Проверить запуск можно в логах контейнера:
docker compose logs embedding-service -f
После запуска можно переходить к выгрузке / загрузке метаданных:
- Внешней обработкой выгружаем описания из 1С.
- Открываем веб-страничку сервиса загрузки описаний в векторную БД http://localhost:8501. При загрузке указываем название коллекции в БД. Это позволяет одним mcp одновременно работать с описаниями метаданных нескольких разных конфигураций 1С.
Все. Можем открывать IDE и прописывать параметры подключения mcp.
Пример для Cursor:
"mcpServers": {
"1c-metadata": {
"timeout": 60,
"headers": {
"x-collection-name": "1c_ut"
},
"url": "http://172.25.48.1:9001/mcp",
"disabled": false
},
"1c-check": {
"timeout": 60,
"url": "http://172.25.48.1:9002/mcp",
"disabled": false
},
"bsl-context": {
"command": "docker",
"args": [
"exec",
"-i",
"mcp-bsl-context-stdio",
"java",
"-jar",
"/app/mcp-bsl-context.jar",
"--mode",
"stdio",
"--platform-path",
"/app/1c-platform"
]
}
}
x-collection-name
меняете на название коллекции, которое указали при первичной загрузки в векторную БД.
Доступные настройки
Через переменные окружения можно указать модель и размерность ее векторов:
MODEL_NAME=sergeyzh/BERTA
- модель по умолчаниюVEC_DIM=768
- размерность векторов
По умолчанию указана sergeyzh/BERTA - она маленькая, быстрая и при этом дает хорошие результаты. Контейнер с ней утилизирует буквально 400Мб RAM.
Можно пробовать и другие модели:
intfloat/multilingual-e5-base
| 768intfloat/multilingual-e5-small
| 384Alibaba-NLP/gte-multilingual-base
| 768Qwen/Qwen3-Embedding-0.6B
| 1024ai-forever/FRIDA
| 1536
Qwen/Qwen3-Embedding-0.6B - дает отличные результаты, но это уже 1,5-2Гб RAM и в несколько раз медленнее.
Доступные настройки:
ROW_BATCH_SIZE
- количество объектов метаданных обрабатывать за итерациюEMBEDDING_BATCH_SIZE
- размер батча векторизации, сколько одним запросом получать векторов от сервиса векторизации
Доступные настройки:
TOPK_LITE_SEARCH_LIMIT
- количество объектов в результатах поискаUSE_HYBRID_SEARCH
- использовать ли гибридный поиск (добавлять ли поиск по ключевым словам)
В блоке подключения томов volumes
нужно указать путь к папке с платформой 1С, например:
C:/Program Files/1cv8/8.3.27.1644/bin
Остались вопросы?
Для получения дополнительной информации и помощи в настройке модуля под нужды вашего бизнеса — оставьте заявку
