code-search · diff
git:20261012.8ad02ec to git:20261012.c1cbcc4
22 added, 8 removed. Audit A to A.
---
name: code-search
description: "Поиск и исследование BSL-кода и точек входа 1С. Используй когда нужно найти реализацию, вызовы, обработчики, модули, поток выполнения или быстро разобраться в механизме конфигурации."
---
# 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`
и адресом модуля совпадения `at`: `unica.view` по `<at>.Body` показывает ту
же строку. Совпадение без доказанного модуля (файл вне раскладки,
незарегистрированный владелец) приходит без `at`, с причиной
`unaddressed` и `fileId`. С `corpus: "names"` ищет по именам и синонимам метаданных и отвечает `at`,
`kind`, `title`. Физического пути нет ни у одного свода — работа идёт
адресами.
- **Чем искать** выбирает `role` в текстовом своде: `lexical` совпадает
буквально, `symbol` идёт по индексу символов, `semantic` — по смыслу. Без
`role` Unica ищет литерал сама и провайдеров не поднимает.
- Если `symbol` завершён со `status: "empty"` и `searchComplete: true`,
поставщик не нашёл символ. Это успешный пустой результат. Ожидание индекса
с `dependencyPending` требует повторить тот же запрос; оно не доказывает
отсутствия символа. `indexFreshness: "unknown"` сохраняет предел актуальности.
- `scope` сужает поиск до одного логического поддерева. У локального поиска
по тексту и именам `limit` задаёт размер страницы (по умолчанию 20,
максимум 50). Пока есть `cursor`, продолжай с теми же аргументами поиска.
`page.stoppedBy: "complete"` означает конец полученного потока. Если прочитанный
ответ изменился, курсор отвечает `stale_cursor`; начни поиск заново. Роли
провайдеров дают страницы только внутри полученного окна: если секция
сообщает `limitReached`, последняя страница не доказывает полноту поиска.
При 200 полученных совпадениях попроси пользователя уточнить искомое, прежде
чем искать снова; `scope` предлагай только для `lexical`, поскольку `symbol`
и `semantic` пока не поддерживают ограничение логическим поддеревом.
Меньшие пределы `bsl-analyzer` и RLM сохраняй как неполный результат, не
называя запрос слишком широким только по этому признаку.
- Признак `approximate` у попадания по имени означает совпадение по близости,
а не точное. Проверяй `sourceCoverage`: при `complete: false` часть
дескрипторов не прочитана, `omitted` и `details` называют число и причину
пропусков. Даже пустая выдача тогда не доказывает отсутствия объекта.
- **Читать узел** — `unica.view {at}`. У владельца есть ветвь `Module`, у
модуля — `Method`, у метода — подпись, контекст компиляции, собственные
строки и ветвь `Body` парами `{line, text}`. Это дешевле, чем читать модуль
целиком, и точнее, чем догадываться по совпадению.
+ - **Граф вызовов** — ветви `Caller` и `Callee`, которые узел метода называет
+ в `branches` без счёта. Читай их адресом ветви:
+ `unica.view {at: "<метод>.Caller"}`. Секции `callGraph` у `view` нет.
+ Ответ ветви называет состояние графа в `props.callGraph`: страница соседей
+ приходит только при `ready`, а `indexing` просит повторить позже. Если
+ анализатора нет, ветвь поставляет его этим же вызовом: при
+ `delivery_in_progress` повтори тот же вызов, провал поставки назови
+ пользователю как отсутствие движка.
- Профиль объекта метаданных — тот же `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",
"limit": 25
}
+ }
+ }
+ ```
+
+ Кто вызывает метод — ветвь графа:
+
+ ```json
+ {
+ "jsonrpc": "2.0",
+ "method": "tools/call",
+ "params": {
+ "name": "unica.view",
+ "arguments": { "at": "main:CommonModule.ПроведениеСервер.Method.ОбработкаПроведения.Caller" }
}
}
```
Профиль объекта метаданных:
```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.ОбработкаПроведения" }
}
}
```