Skip to main content
Glama
ASGDeveloper

onec-config-mcp

by ASGDeveloper
README.md
# onec-config-mcp

MCP-сервер для поиска по исходному коду конфигураций 1С:Предприятие прямо из [Claude Code](https://claude.ai/code).

Индексирует выгрузки конфигураций (XML + BSL) в локальную SQLite-базу с полнотекстовым поиском (FTS5) и предоставляет 11 инструментов для поиска кода, объектов метаданных, процедур и функций.

## Возможности

- Полнотекстовый поиск по BSL-коду с поддержкой FTS5-синтаксиса (`AND`, `OR`, `NOT`, `"фраза"`)
- Поиск объектов метаданных по имени (общие модули, справочники, документы и т.д.)
- Получение полного кода модуля по имени объекта
- Поиск определения процедуры или функции с номером строки
- Получение тела процедуры/функции и карты модуля (список процедур без исходника) без чтения всего файла
- Граф вызовов: кто вызывает процедуру / что вызывает она сама
- Автоматическая переиндексация при изменении файлов (watchdog)
- Поддержка нескольких конфигураций одновременно

## Требования

- Python 3.11+
- Выгруженные конфигурации 1С в формате XML+BSL (через [Конфигуратор](https://v8.1c.ru/platforma/) или [1C:EDT](https://edt.1c.ru/))

## Установка

```bash
git clone https://github.com/ASGDeveloper/onec-config-mcp
cd onec-config-mcp
pip install -e .
```

## Настройка

Отредактируйте `config.json`:

```json
{
  "db_path": "C:/Users/user/Documents/GitHub/onec-config-mcp/index.db",
  "configs": [
    {
      "name": "МояКонфигурация",
      "path": "C:/path/to/exported/config",
      "object_types": "all",
      "index_forms": true,
      "watch": true
    },
    {
      "name": "БП",
      "path": "C:/path/to/exported/acc30",
      "object_types": "base",
      "index_forms": false
    }
  ]
}
```

| Поле | Описание |
|------|----------|
| `db_path` | Путь к файлу базы данных SQLite (будет создан автоматически) |
| `name` | Имя конфигурации (используется как фильтр в инструментах) |
| `path` | Путь к корню выгруженной конфигурации |
| `object_types` | Какие типы объектов индексировать: `"all"` (по умолчанию, все типы из списка ниже), `"base"` (только `Catalogs`, `Documents`, `InformationRegisters`, `Enums`) или явный список, например `["Catalogs", "Documents", "CommonModules"]` |
| `index_forms` | `true` (по умолчанию) — индексировать формы (код и метаданные); `false` — полностью пропускать формы для этой конфигурации |
| `watch` | `true` — автоматически переиндексировать при изменении файлов |

Типовые конфигурации (БП, БГУ, УТ, УНФ и т.п.), используемые в основном как справочник данных, обычно достаточно индексировать с `"object_types": "base", "index_forms": false` — это заметно уменьшает размер базы. Для своей конфигурации и библиотек, по которым нужен полный поиск кода (БСП и т.п.), используйте `"object_types": "all", "index_forms": true`.

**Важно:** `db_path` не должен находиться в `AppData\Local` — Claude Code работает в UWP-sandbox и перенаправляет этот путь. Используйте папку `Documents` или другое место.

## Индексирование

```bash
# Проиндексировать все конфигурации
python indexer.py

# Проиндексировать только одну конфигурацию
python indexer.py --only МояКонфигурация

# Показать статистику индекса
python indexer.py --stats
```

При повторном запуске данные конфигурации полностью перезаписываются.

**После обновления схемы БД** (например, при обновлении самого `onec-config-mcp`) удалите `index.db` и файлы `index.db-wal`/`index.db-shm` перед запуском `indexer.py` — старая база несовместима с новой схемой и не мигрируется автоматически.

## Подключение к Claude Code

Добавьте сервер в глобальный файл `~/.claude/.mcp.json`:

```json
{
  "mcpServers": {
    "onec-config-mcp": {
      "command": "python",
      "args": ["C:/path/to/onec-config-mcp/server.py"]
    }
  }
}
```

Перезапустите Claude Code. Сервер запустится автоматически и будет доступен во всех проектах.

Разрешения для проекта (`.claude/settings.local.json`):

```json
{
  "allowedTools": [
    "mcp__onec-config-mcp__search_code",
    "mcp__onec-config-mcp__find_object",
    "mcp__onec-config-mcp__get_module",
    "mcp__onec-config-mcp__list_objects",
    "mcp__onec-config-mcp__find_procedure",
    "mcp__onec-config-mcp__list_configs",
    "mcp__onec-config-mcp__get_object_metadata",
    "mcp__onec-config-mcp__get_procedure_body",
    "mcp__onec-config-mcp__get_module_outline",
    "mcp__onec-config-mcp__get_callers",
    "mcp__onec-config-mcp__get_callees"
  ]
}
```

## Инструменты

### `search_code`
Полнотекстовый поиск по BSL-коду. Возвращает сниппеты с контекстом.

```
query       — текст или FTS5-выражение ("ПроверитьПрава" OR "CheckRights")
config_name — фильтр по конфигурации (опционально)
obj_type    — фильтр по типу объекта: CommonModules, Catalogs, Documents, ...
limit       — максимум результатов (по умолчанию 20)
```

### `find_procedure`
Найти определение процедуры или функции по имени. Возвращает файл и номер строки, а также признак устаревания.

```
proc_name   — имя процедуры/функции
config_name — конфигурация (опционально)
```

`is_deprecated` — true, если комментарий над процедурой начинается с "Устарела." или процедура лежит в области `#Область УстаревшиеПроцедурыИФункции`. `deprecated_since_region` — сработал ли именно признак области. `deprecated_alternatives` — список альтернатив, извлечённых из строк "Следует использовать ..." / "См. ..." сразу после "Устарела." в комментарии.

### `get_module`
Получить полный код BSL-модуля. При размере >200 КБ — усекается с предупреждением.

```
obj_name    — имя объекта (например, Доки_Авторизация)
config_name — конфигурация (опционально)
module_type — Module / ObjectModule / ManagerModule / FormModule
form_name   — имя формы (при module_type=FormModule)
```

### `find_object`
Полнотекстовый поиск по именам объектов метаданных. Возвращает xml_summary с синонимом и флагами.

### `list_objects`
Список объектов по типу и/или конфигурации.

### `get_object_metadata`
Метаданные объекта: xml_summary, индексация полей (`index_info`) и список модулей с количеством строк.

`index_info` показывает, какие поля объекта индексированы (для проверки `WHERE`/условий соединения на предмет неиндексированных полей). Логика соответствует официальному описанию "Индексы таблиц базы данных" (its.1c.ru/db/metod8dev#content:1590):

```
indexed_fields       — для регистров: измерения всегда образуют базовый составной индекс
                        в порядке объявления, поэтому первое измерение (reason:
                        leading_dimension) эффективно фильтруется само по себе всегда.
                        Остальные измерения, а также ресурсы и реквизиты регистра,
                        попадают в выдачу только если явно включена индексация
                        (<Indexing> = Index/IndexWithAdditionalOrder, reason = само
                        значение) — иначе поле участвует только в составном индексе по
                        порядку слева направо и не может быть отфильтровано отдельно.
                        Каждая запись: field/kind (dimension|resource|attribute)/reason.

auto_indexed_fields  — для справочников/документов и производных типов: стандартные
                        реквизиты, индексируемые платформой автоматически.
                        Справочники/ПланВидовРасчёта: Ссылка всегда, Код — только если
                        CodeLength≠0, Наименование — только если DescriptionLength≠0.
                        ПланВидовХарактеристик/ПланСчетов/ПланОбмена: Ссылка+Код+
                        Наименование всегда (платформа не допускает у них нулевую длину).
                        Документы/БизнесПроцессы/Задачи: Ссылка+Дата всегда, Номер —
                        только если NumberLength≠0; Задачи дополнительно всегда получают
                        Наименование.
```

Не реализовано: доп. индексы для иерархических/подчинённых справочников (Родитель/Владелец/ЭтоГруппа) и аналогичные ветвления для БизнесПроцессов/Задач/ПланСчетов, а также составные ("дополнительные") индексы `Indexes` — это функциональность только КОРП-лицензии платформы, реальных образцов с ней не нашлось ни в одной из доступных конфигураций.

### `list_configs`
Показать проиндексированные конфигурации с датой и статистикой.

### `get_procedure_body`
Получить исходный текст тела процедуры/функции по точному имени, без чтения всего модуля. Возвращает те же поля признака устаревания, что и `find_procedure` (см. выше).

```
proc_name   — имя процедуры/функции
config_name — конфигурация (опционально)
```

### `get_module_outline`
Карта модуля: список процедур/функций (имя, тип, признак Экспорт, номер строки) без вывода исходника.

```
obj_name    — имя объекта
config_name — конфигурация (опционально)
module_type — Module / ObjectModule / ManagerModule / FormModule
form_name   — имя формы (при module_type=FormModule)
```

### `get_callers`
Найти все места вызова процедуры/функции — кто её вызывает.

```
proc_name   — имя процедуры/функции
config_name — конфигурация (опционально)
```

### `get_callees`
Найти, какие процедуры/функции вызываются внутри заданной. Эвристика на regex — не различает вызовы методов объекта (`Объект.Метод()`) от вызовов глобальных функций модуля.

```
proc_name   — имя процедуры/функции
config_name — конфигурация (опционально)
```

## Структура проекта

```
onec-config-mcp/
  server.py       # MCP-сервер (stdio transport) + watchdog
  indexer.py      # CLI для индексирования
  db.py           # Схема SQLite, FTS5-триггеры
  parser.py       # Парсер XML+BSL
  tools.py        # Обработчики MCP-инструментов
  config.json     # Конфигурация путей (не коммитить!)
  pyproject.toml  # Зависимости
```

## Поддерживаемые типы объектов

`CommonModules`, `Catalogs`, `Documents`, `DataProcessors`, `Reports`,
`InformationRegisters`, `AccumulationRegisters`, `AccountingRegisters`,
`BusinessProcesses`, `Tasks`, `ExchangePlans`, `CommonForms`, `Constants`,
`Enums`, `ChartOfCharacteristicTypes`, `ChartOfAccounts`, `ScheduledJobs`

## Логирование

Сервер пишет лог в `server.log` рядом с `server.py`. Там же отображаются события watchdog и ошибки переиндексации.

```bash
# Следить за логом в реальном времени
Get-Content server.log -Wait -Tail 20
```

## Лицензия

MIT