Поиск и исследование BSL-кода и точек входа 1С. Используй когда нужно найти реализацию, вызовы, обработчики, модули, поток выполнения или быстро разобраться в механизме конфигурации.
Installs into .claude/skills of the current project.
Are you the author of Code Search?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/ingvarconsulting-code-search)
---
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`.
С `corpus: "names"` ищет по именам и синонимам метаданных и отвечает `at`,
`kind`, `title`. Физического пути нет ни у одного свода — работа идёт
адресами.
- **Чем искать** выбирает `role` в текстовом своде: `lexical` совпадает
буквально, `symbol` идёт по индексу символов, `semantic` — по смыслу. Без
`role` Unica ищет литерал сама и провайдеров не поднимает.
- `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}`. Это дешевле, чем читать модуль
целиком, и точнее, чем догадываться по совпадению.
- Профиль объекта метаданных — тот же `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:Document.Заказ" }
}
}
```
Метод целиком: подпись в узле, текст в ветви `Body`:
```json
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "unica.view",
"arguments": { "at": "main:CommonModule.Продажи.Method.ОбработкаПроведения" }
}
}
```