# Code Search

> Поиск и исследование BSL-кода и точек входа 1С. Используй когда нужно найти реализацию, вызовы, обработчики, модули, поток выполнения или быстро разобраться в механизме конфигурации.

- Skill: `ingvarconsulting/code-search` (Agent Skill)
- Install (CLI): `npx skillmds@latest add ingvarconsulting/code-search`
- Raw SKILL.md: https://api.skillmd.com/api/skills/ingvarconsulting/code-search/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: IngvarConsulting (https://skillmd.com/u/ingvarconsulting)
- Updated: 2026-09-21
- Page: https://skillmd.com/skills/ingvarconsulting/code-search

---


# Code Search

## MCP routing

- Preferred path: use MCP `unica` tools `unica.search`, `unica.view`, and and.
  `unica.check`.
- Не зови индекс кода, анализатор или пакетные адаптеры напрямую: они спрятаны
  за MCP `unica`.
- Имя набора исходников — не константа. Его называет `unica.view {}`;
  `"main"` в примерах ниже иллюстрация, а не умолчание. В адресе имя стоит до
  двоеточия: `main:Document.Заказ`.

## Tool choice

- MCP-first discipline: держись публичных `unica.*` до того, как спускаться к
  оболочке. К поиску по файлам переходи, только когда вызовы выше не закрыли
  пробел, и сообщай what was tried, если это важно для ответа.
- **Что искать** выбирает свод. `unica.search` с `corpus: "text"` (умолчание)
  ищет по тексту модулей BSL и отвечает `scope`, `line`, `column`, `snippet`.
  С `corpus: "names"` ищет по именам и синонимам метаданных и отвечает `at`,
  `kind`, `title`. Физического пути нет ни у одного свода — работа идёт
  адресами.
- **Чем искать** выбирает `role` в текстовом своде: `lexical` совпадает
  буквально, `symbol` идёт по индексу символов, `semantic` — по смыслу. Без
  `role` Unica ищет литерал сама и провайдеров не поднимает.
- `scope` сужает поиск до одного логического поддерева; `limit` ограничивает
  выдачу.
- Признак `approximate` у попадания по имени означает совпадение по близости,
  а не точное. Пустая выдача — это ноль, а не отказ.
- **Читать узел** — `unica.view {at}`. У владельца есть ветвь `Module`, у
  модуля — `Method`, у метода — подпись, контекст компиляции, собственные
  строки и ветвь `Body` парами `{line, text}`. Это дешевле, чем читать модуль
  целиком, и точнее, чем догадываться по совпадению.
- Профиль объекта метаданных — тот же `unica.view {at}`: состав, модули, права,
  подписки и функциональные опции лежат в его `props` и ветвях.
- Путь к файлу нужен только когда он пришёл снаружи — из диффа, лога сборки
  или трассы. Тогда его переводит в адрес аварийный `unica.resolve`. В обычном
  ходе работы он не нужен.

### Чего на канонической поверхности пока нет

- **граф вызовов и impact analysis** — ветвей `Caller`/`Callee` у узла метода
  ещё нет. Пока доказательством потока служит `unica.search` с
  `role: "symbol"` по имени метода, и это доказательство неполное: скажи об
  этом, а не выдавай его за полный обход вызовов.

## Workflow

1. Разметь пространство: `unica.view {}` называет наборы исходников и их
   формат, когда набор или формат неясен.
2. Найди предмет по имени: `unica.search {corpus: "names"}` с необязательным
   `kind`. Точное имя объекта закрывает вопрос быстрее любого текстового
   поиска.
3. Прочти узел: `unica.view {at}`. Ветвь `Module` ведёт к модулям владельца,
   ветвь `Method` — к его методам; узел метода даёт подпись и строки.
4. Ищи по тексту то, что именем не находится: фрагменты запросов, строковые
   литералы, заголовки, нестандартные токены. `role` выбирай под вопрос.
5. Расширяй только после неудачи точного поиска: синонимы, деловые термины,
   префиксы общих модулей, заголовки команд форм.
6. К локальному `rg` спускайся только за файлами вне индекса Unica или когда
   попытки выше не закрыли пробел — и скажи, что было испробовано.
7. Разделяй объявление, вызов, обработчик и мёртвое совпадение. Поток по
   одному попаданию не выводится.
8. Отчитывайся логическими адресами и строками внутри узла, а не путями к
   файлам; приводи запрос, которым получено важное попадание.

## Common searches

- Object lifecycle: `ОбработкаПроведения`, `ПередЗаписью`, `ПриЗаписи`, `ПриСозданииНаСервере`.
- Managed form flow: command handler, server procedure, client wrapper, form attribute name.
- Integrations: HTTP service root URL, method name, header name, endpoint path, exchange plan node.
- BSP entry points: exported common-module procedure plus surrounding callers.

## MCP examples

```jsonc
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "unica.view",
    "arguments": {}
  }
}
```

Объект по имени:

```json
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "unica.search",
    "arguments": {
      "query": "Заказ",
      "corpus": "names",
      "kind": "Document",
      "limit": 20
    }
  }
}
```

Текст внутри поддерева:

```json
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "unica.search",
    "arguments": {
      "query": "ОбработкаПроведения",
      "scope": "main:Configuration",
      "limit": 20
    }
  }
}
```

Символ по индексу — ближайшее, чем сегодня заменяется граф вызовов:

```json
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "unica.search",
    "arguments": {
      "query": "ОбработкаПроведения",
      "role": "symbol",
      "scope": "main:Configuration",
      "limit": 25
    }
  }
}
```

Профиль объекта метаданных:

```json
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "unica.view",
    "arguments": { "at": "main:Document.Заказ" }
  }
}
```

Метод целиком: подпись в узле, текст в ветви `Body`:

```json
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "unica.view",
    "arguments": { "at": "main:CommonModule.Продажи.Method.ОбработкаПроведения" }
  }
}
```

