Release 0.2.0: object tree, refs/modules options, docs

Add query object (--clear), modules -n, composite refs labels,
FillChecking/TypeSet parsing, VERSION/CHANGELOG and --version.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
mihailkudravcev
2026-07-16 16:37:41 +03:00
parent 88a3737078
commit a9d1215820
9 changed files with 837 additions and 117 deletions
+151 -84
View File
@@ -1,45 +1,61 @@
# Индекс метаданных и модулей конфигураций 1С
Единый кэш: **`cache/1c_meta/index.sqlite`** — все выгрузки 1С проекта в одной БД (FTS5).
**Версия:** см. [`VERSION`](VERSION) (текущая: **0.2.0**) · [CHANGELOG](CHANGELOG.md)
Единый кэш проекта: **`cache/1c_meta/index.sqlite`** — все выгрузки 1С в одной БД (SQLite FTS5).
| Скрипт | Назначение |
|--------|------------|
| [`index_1c.py`](index_1c.py) | построение и обновление индекса |
| [`query_1c.py`](query_1c.py) | поиск по готовому индексу |
| [`query_1c.py`](query_1c.py) | поиск и просмотр по готовому индексу |
Документация для Cursor: [`.cursor/rules/1c-meta-index.mdc`](../.cursor/rules/1c-meta-index.mdc)
Репозиторий утилиты: <https://git.p7net.ru/1c/index.git>
Правило для Cursor (в корне CRM3-26): `.cursor/rules/1c-meta-index.mdc`
---
## Параметры командной строки
| Параметр | Короткий | Что это |
|----------|----------|---------|
| `--config` | `-c` | **Файл настроек утилиты** (JSON), см. [`config.example.json`](config.example.json). Не конфигурация 1С. |
| `--root` | `-r` | Корень проекта CRM3-26 (если скрипт запущен не из дерева проекта). |
| `--baseconf` | `-b` | **Выгрузка конфигурации 1С** в репозитории — папка `<name>/src/`. Можно указывать несколько раз. |
### Алиасы `--baseconf`
| Алиас | Папка в репозитории |
|-------|---------------------|
| `target`, `crm3_26` | `crm3-26` |
| `source`, `crm3_old`, `crm3-old`, `crm3_dev` | `crm3-dev` |
Список выгрузок и алиасов: `python tools/index/index_1c.py list`
```bash
python tools/index/index_1c.py --version
python tools/index/query_1c.py --version
```
---
## Зачем это нужно
При работе в Cursor поиск по XML/BSL всего дерева `crm3-26/src` (десятки тысяч файлов) медленный. Индекс один раз разбирает метаданные и модули и даёт:
Обход десятков тысяч XML/BSL в `crm3-26/src` и соседних выгрузках через Grep в Cursor медленный. Индекс один раз разбирает метаданные и модули и даёт:
- поиск объектов по имени, синониму, полям;
- обратный индекс ссылок (`refs`);
- поиск по BSL (процедуры, фрагменты кода);
- фильтр по конкретной выгрузке (`-b crm3-26`).
| Задача | Команда |
|--------|---------|
| Найти объект по имени/синониму | `query_1c.py search` / `object` |
| Структура реквизитов, обязательность, типы | `query_1c.py object` |
| Кто ссылается на справочник/документ | `query_1c.py refs` |
| Найти процедуру/фрагмент в BSL | `query_1c.py modules` |
| Сравнить целевую и исходную конфигурацию | `-b target` / `-b source` |
**Типичный workflow агента:** `query_1c.py search``show` / `refs` → открыть конкретный `.bsl` или `.xml`, без полного Grep по конфигурации.
**Типичный workflow агента:**
`reindex` (после выгрузки) → `object` / `search``refs` / `modules` → открыть конкретный `.xml` / `.bsl`.
---
## Параметры командной строки (общие)
| Параметр | Короткий | Назначение |
|----------|----------|------------|
| `--config` | `-c` | Файл **настроек утилиты** (JSON). **Не** конфигурация 1С. См. [`config.example.json`](config.example.json). |
| `--root` | `-r` | Корень проекта CRM3-26 (если запуск не из дерева проекта). |
| `--baseconf` | `-b` | Выгрузка конфигурации 1С: папка `<name>/src/` в репозитории. Можно несколько раз. |
| `--version` | | Версия утилиты. |
Приоритет корня проекта: `--root` > `project_root` в `--config` > авто из расположения `tools/index/`.
### Алиасы `--baseconf`
| Алиас | Папка |
|-------|-------|
| `target`, `crm3_26` | `crm3-26` |
| `source`, `crm3_old`, `crm3-old`, `crm3_dev` | `crm3-dev` |
Другие выгрузки без алиаса: `crm3-26.rhana`, `crm3-dev.rhana`, `ws-rhana`, `bu-corp`, …
Полный список: `python tools/index/index_1c.py list`
---
@@ -49,107 +65,158 @@
| Команда | Описание |
|---------|----------|
| `reindex` | обновить индекс (по умолчанию только изменившиеся файлы) |
| `status` | размер БД, метаданные, список проиндексированных baseconf |
| `list` | какие `<name>/src/` есть в репозитории и что уже в индексе |
| `reindex` | обновить индекс |
| `status` | размер БД, meta, список проиндексированных baseconf |
| `list` | выгрузки с `src/` в репозитории + что уже в индексе |
### Режимы `reindex`
| Вызов | Поведение |
|-------|-----------|
| `reindex -j 12` | инкремент всех известных выгрузок с `src/` |
| `reindex --full -j 12` | удалить `index.sqlite` и собрать заново |
| `reindex --full -b crm3-26` | пересобрать только `crm3-26` (остальные в БД сохраняются) |
| `reindex -b target -t Documents,Catalogs` | только документы и справочники целевой конфигурации |
| `reindex -b ws-rhana --no-modules` | только XML метаданных, без `.bsl` |
| `reindex -j 12` | инкремент: только файлы с изменившимися `mtime`/`size` |
| `reindex --full -j 12` | удалить всю БД и собрать заново все известные выгрузки |
| `reindex --full -b crm3-26` | пересобрать только указанную конфигурацию |
| `reindex -b target -t Documents,Catalogs` | только выбранные типы объектов |
| `reindex -b ws-rhana --no-modules` | метаданные без BSL |
| `reindex --md` | дополнительно Markdown в `cache/1c_meta/md/<baseconf>/` |
Дополнительно: `--md` — экспорт Markdown в `cache/1c_meta/md/<baseconf>/` для `@` в чате.
`-j` / `--workers` — число потоков (по умолчанию 4–16).
### Что попадает в индекс
### Что индексируется
- **Метаданные:** `src/<ТипObjects>/*.xml` имя, синоним, реквизиты, измерения, типы, ссылки.
- **Модули:** все `**/*.bsl` путь, владелец (`Document.ЗаказКлиента`), процедуры/функции, тело (до 200 КБ в FTS).
- **Метаданные** `src/<Тип>/*.xml`: имя, синоним, комментарий, реквизиты / измерения / ресурсы / ТЧ, типы (в т.ч. `TypeSet`), ссылки, `FillChecking`.
- **Модули** `**/*.bsl`: путь, owner (`Document.X`), вид модуля, имена процедур/функций, тело (до 200 КБ в FTS).
Пропускаются по умолчанию: картинки, стили, XDTO, шаблоны, языки.
По умолчанию пропускаются: `CommonPicture`, `StyleItem`, `XDTOPackage`, `CommonTemplate`, `Language`, `Bot`.
### Примеры переиндексации
```bash
# после обновления выгрузки целевой конфигурации
python tools/index/index_1c.py reindex -b target -j 12
# полная пересборка всего проекта
python tools/index/index_1c.py reindex --full -j 12
# только документы и справочники исходной + расширения
python tools/index/index_1c.py reindex -b source -b crm3-dev.rhana -t Documents,Catalogs -j 8
python tools/index/index_1c.py status
python tools/index/index_1c.py list
```
---
## `query_1c.py` — поиск
Требует готовый `cache/1c_meta/index.sqlite` (см. `index_1c.py reindex`).
Нужен готовый `cache/1c_meta/index.sqlite`.
### Команды
| Команда | Аргумент | Результат |
|---------|----------|-----------|
| `search` | строка запроса | объекты метаданных (FTS) |
| `show` | имя объекта | полная карточка JSON |
| `refs` | `Catalog.Партнеры` | кто ссылается полем-ссылкой |
| `modules` | строка | поиск по BSL |
| `module` | путь или owner | метаданные модуля (символы, строки) |
| Команда | Аргумент | Результат | Полезные опции |
|---------|----------|-----------|----------------|
| `search` | строка | объекты метаданных (FTS) | `-b`, `--type`, `--limit` |
| `object` | имя/синоним объекта **или** реквизита | дерево структуры | `-b`, `--type`, `--clear`, `--limit` |
| `show` | имя объекта | полная карточка JSON | `-b` |
| `refs` | `Catalog.Партнеры` / `ЗаказКлиента` | обратные ссылки полей | `-b`, `--limit` (на каждую baseconf) |
| `modules` | строка | поиск по BSL | `-b`, `-n` / `--names-only`, `--limit` |
| `module` | путь или owner | символы модуля, строки | `-b` |
### Примеры
### `object` — дерево реквизитов
```bash
# все конфигурации в индексе
python tools/index/query_1c.py search "ЗаказКлиента"
# полная структура документа
python tools/index/query_1c.py object ЗаказКлиента -b target
# только целевая (алиас target)
python tools/index/query_1c.py show ЗаказКлиента -b target
python tools/index/query_1c.py show Document.ЗаказКлиента -b crm3-26
# только реквизиты с именем/синонимом «Партнер» в документах
python tools/index/query_1c.py object Партнер -b target --type Document --clear
# исходная + расширение
python tools/index/query_1c.py search "Партнер" -b source -b crm3-dev.rhana
# модули ws-rhana
python tools/index/query_1c.py modules "ОбработатьHealth" -b ws-rhana
# обратные ссылки в целевой
python tools/index/query_1c.py refs Catalog.Партнеры -b target --limit 20
# совпал сам объект → --clear печатает только заголовок
python tools/index/query_1c.py object ЗаказКлиента -b target --clear
```
### Ошибки
Формат строки реквизита:
- **Нет индекса** — подсказка запустить `index_1c.py reindex`.
- **`-b unknown`** — список папок в репозитории и алиасы.
- **`-b crm3-26`, но не проиндексировано** — список того, что есть в БД, и команда переиндексации.
- **`show` не нашёл объект** — похожие имена из индекса.
```text
├── `Attribute.Партнер` — Клиент [обяз.] : CatalogRef.Партнеры
├── `Attribute.СуммаДокумента` — … [необяз.] : DefinedType.ДенежнаяСуммаЛюбогоЗнака
├── `TabularSection.Товары` — Товары
│ └── `Column.Номенклатура` — … [обяз.] : CatalogRef.Номенклатура
```
- **[обяз.]** — `FillChecking=ShowError`; **[необяз.]** — `DontCheck`
- составной тип: несколько вариантов через `|`
- при наличии XML структура подтягивается с диска (актуальный `FillChecking`)
### `refs` — кто ссылается
```bash
python tools/index/query_1c.py refs "ЗаказКлиента"
python tools/index/query_1c.py refs Catalog.Партнеры -b target --limit 50
python tools/index/query_1c.py refs Document.ЗаказКлиента -b source
```
Без `-b` — все конфигурации в индексе; `--limit` действует **на каждую**.
Составной тип поля: `→ DocumentRef.ЗаказКлиента (среди прочего: DocumentRef.…)`.
### `modules` / `module`
```bash
python tools/index/query_1c.py modules "ОбработатьHealth" -b ws-rhana
python tools/index/query_1c.py modules "РВС_Transfer" -b ws-rhana -n
python tools/index/query_1c.py module CommonModules/РВС_TransferAPIДокументы -b ws-rhana
```
### Прочие примеры
```bash
python tools/index/query_1c.py search "ЗаказКлиента"
python tools/index/query_1c.py search "Партнер" --type Document -b crm3-26
python tools/index/query_1c.py show Document.ЗаказКлиента -b target
python tools/index/query_1c.py search "Партнер" -b source -b crm3-dev.rhana
```
### Ошибки и подсказки
| Ситуация | Поведение |
|----------|-----------|
| Нет `index.sqlite` | подсказка `index_1c.py reindex --full` |
| `-b` без папки `src/` | список доступных выгрузок + алиасы |
| `-b` есть в репо, нет в индексе | список проиндексированных + команда `reindex -b …` |
| `show` / `object` не нашли | похожие имена из индекса |
---
## Файл настроек утилиты (`--config`)
Для нестандартного расположения проекта:
```bash
cp tools/index/config.example.json tools/index/config.local.json
# отредактировать project_root
# project_root: "/path/to/crm3-26"
python tools/index/query_1c.py --config tools/index/config.local.json search "Заказ"
```
Приоритет корня: `--root` > `project_root` в JSON > автоопределение от `tools/index/`.
`config.local.json` в `.gitignore` (локальные пути).
---
## Применение в Cursor
1. После выгрузки из EDT/конфигуратора:
`python tools/index/index_1c.py reindex -j 12`
или `reindex -b target` если менялась только целевая.
2. Агент ищет через `query_1c.py`, не через Grep по `src/`.
3. Уточнение контекста: `-b target` / `-b source` чтобы не смешивать старую и новую конфигурацию.
4. Для кода: `modules` → открыть найденный `rel_path` в репозитории.
1. После выгрузки из EDT/конфигуратора: `python tools/index/index_1c.py reindex -j 12` (или `-b target`).
2. Метаданные и связи — через `query_1c.py`, не Grep по всему `src/`.
3. Разделять контекст: `-b target` vs `-b source`.
4. Код: `modules` → открыть `rel_path`; структура документа: `object`.
5. Правило агента: `.cursor/rules/1c-meta-index.mdc`.
---
## Артефакты
## Артефакты кэша
```
cache/1c_meta/
index.sqlite # единая БД
INDEX.md # сводка последнего reindex
```text
cache/1c_meta/ # в корне проекта CRM3-26 (gitignore)
index.sqlite # единая БД
INDEX.md
manifest.json
md/<baseconf>/ # опционально (--md)
md/<baseconf>/ # опционально (--md)
```
Старые per-config `search.sqlite` в подкаталогах не используются.
Per-config `search.sqlite` устарели и не используются.