使用说明
BSL Atlas
Публичный MCP-сервер для быстрой индексации и поиска по исходникам 1С. Работает с XML/BSL-выгрузкой конфигурации или расширения и отдает структурный и, при необходимости, семантический поиск для AI-ассистентов.
Что умеет
- искать функции, процедуры и модули через SQLite/FTS
- искать объекты метаданных, реквизиты и связи
- строить контекст по вызовам и структуре модулей
- работать в
fastрежиме без внешних embedding API - переиндексировать проект после новой выгрузки
Режимы
| Режим | Что дает | Что нужно |
|---|---|---|
fast |
быстрый структурный поиск | Docker и выгруженные исходники 1С |
full |
структурный + семантический поиск | Docker, исходники и embedding backend/API key |
fast — основной и рекомендуемый стартовый режим.
Важно: mount исходников обязателен
Если вы запускаете bsl-atlas в Docker, контейнер обязан видеть реальные исходники проекта через bind mount SOURCE_PATH -> /data/source.
SOURCE_PATHнужен для индексации файлов- если bind mount настроен неверно,
/data/sourceвнутри контейнера может существовать, но будет пустым - в этом случае Atlas честно сообщит, что каталог исходников пустой
Это отдельная тема от RLM: Atlas читает файлы проекта напрямую, поэтому без source mount индексировать нечего.
Быстрый старт
1. Выгрузите исходники 1С
В конфигураторе используйте Конфигурация -> Выгрузить конфигурацию в файлы и укажите пустой каталог.
2. Скачайте конфиги
curl -O https://raw.githubusercontent.com/Arman-Kudaibergenov/bsl-atlas/master/docker-compose.yml
curl -O https://raw.githubusercontent.com/Arman-Kudaibergenov/bsl-atlas/master/.env.example
cp .env.example .env
3. Заполните .env
SOURCE_PATH=C:\bsl-src
INDEXING_MODE=fast
Для full режима дополнительно укажите embedding provider и нужные ключи.
4. Запустите контейнер
docker compose up -d
5. Подключите MCP в Claude
Добавьте в claude_desktop_config.json или в .mcp.json проекта:
{
"mcpServers": {
"bsl-atlas": {
"type": "http",
"url": "http://localhost:8000/mcp"
}
}
}
Windows: что важно
Docker Desktop на Windows часто ломается на путях с пробелами или кириллицей. Если реальный путь выглядит как C:\1С\Выгрузки\МояКонфигурация, лучше сначала сделать ASCII-алиас.
cmd /c mklink /D C:\bsl-src "C:\1С\Выгрузки\МояКонфигурация"
После этого в .env используйте:
SOURCE_PATH=C:\bsl-src
Если Atlas пишет, что SOURCE_PATH пустой, проблема почти всегда в bind mount, а не в самом приложении.
Поддерживаемые структуры
Каталог исходников может выглядеть так:
SOURCE_PATH/
cf/
Catalogs/
Documents/
CommonModules/
или так:
SOURCE_PATH/
Catalogs/
Documents/
CommonModules/
или так:
SOURCE_PATH/
cfe/
MyExtension/
Catalogs/
CommonModules/
Основные инструменты
search_function(name)— найти функцию или процедуру по имениget_module_functions(path)— список функций модуляget_function_context(name)— контекст вызововmetadatasearch(query)— поиск по объектам метаданныхget_object_details(full_name)— структура объектаcodesearch(query)— семантический поиск вfullрежимеhelpsearch(query)— поиск по help/knowledge слою вfullрежимеreindex(force_chromadb)— переиндексация после измененийstats()— статистика индекса
Переиндексация
После новой выгрузки исходников:
curl -X POST http://localhost:8000/reindex
Embedding defaults
- рекомендуемое семейство:
qwen3-embedding-8b - OpenRouter:
qwen/qwen3-embedding-8b - Ollama:
qwen3-embedding:8b
LLM-стикеры функций
Стикер — короткое русское описание назначения BSL-функции: что она делает,
что возвращает и какой имеет побочный эффект. Он помогает найти функцию по
смыслу, когда точное имя неизвестно. Стикеры хранятся в
symbols.doc_generated и добавляются к карточке функции при следующей
векторной индексации.
Генерировать стикеры стоит только для функций без хорошего //-комментария:
экспортных методов, обработчиков, точек входа и центральных узлов графа.
Формы и очевидные вспомогательные функции обычно не окупают стоимость генерации.
Пример генерации через Claude Haiku
Актуальный закреплённый ID модели — claude-haiku-4-5-20251001.
import json
import os
from anthropic import Anthropic
client = Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"])
function = {
"id": 42,
"name": "ОбработкаПроведения",
"module": "Документы/ЗаказКлиента/Ext/ObjectModule.bsl",
"signature": "Процедура ОбработкаПроведения(Отказ, РежимПроведения)",
"body": "Движения.Взаиморасчеты.Записать();",
}
response = client.messages.create(
model="claude-haiku-4-5-20251001",
temperature=0,
max_tokens=200,
system=(
"Создай один русский стикер для поиска по BSL-коду. "
"Укажи назначение, возвращаемое значение и побочный эффект, если они видны. "
"Не выдумывай объекты и бизнес-смысл. Не более 160 символов. "
"Верни только JSON: {\"id\": число, \"description\": \"текст\"}."
),
messages=[{
"role": "user",
"content": json.dumps(function, ensure_ascii=False),
}],
)
print(response.content[0].text)
Ожидаемый результат:
{"id": 42, "description": "Проводит заказ клиента и записывает движения по взаиморасчётам."}
Для массовой генерации используйте Anthropic Message Batches: пакетный API
дешевле обычных синхронных запросов. Сохраняйте результат как JSON
{symbol_id: description}:
{"42": "Проводит заказ клиента и записывает движения по взаиморасчётам."}
Импорт:
python scripts/import_generated_docs.py descriptions.json --db data/bsl_index.db
После импорта выполните reindex_changed, чтобы обновить векторы затронутых
модулей. Скрипт не принимает и не хранит токены LLM.
