source-access · git:20260904.5ed75bb · 2026-09-04 · sha256 4290ee1f630f10d5
source-access git:20260904.5ed75bbA
Immutable. This exact content is served forever at /api/v1/blob/4290ee1f630f10d5.
---
name: source-access
description: Навигация по исходникам 1С логическим адресом — найти цель, прочитать узел, спуститься по ветвям, сравнить два узла. Используй когда нужно понять состав объекта, формы, роли, схемы компоновки или модуля
argument-hint: <объект|путь|адрес>
allowed-tools:
- Read
- Glob
---
# /source-access — чтение исходников логическим адресом
## MCP routing
- Всё чтение исходников идёт одним MCP `unica`: `unica.find` ищет цель,
`unica.view` читает узел по адресу, `unica.search` ищет литерал в тексте BSL,
`unica.diff` сравнивает два узла, `unica.check` отвечает о готовности набора.
- Не вызывай внутренние MCP/CLI-адаптеры и не подменяй логическую цель
физическим путём.
- Чтение не меняет исходники. Правка BSL — `unica.code.patch`, правка
предметных описаний — соответствующий `unica.*.edit` либо `unica.*.compile`,
оба сначала с `dryRun: true`.
## Адрес
```
<набор исходников>:<Вид>[.<Имя>[.<Ветвь>[.<Имя>...]]]
```
`main:Catalog.Валюты` — объект, `main:Catalog.Валюты.Form.ФормаЭлемента` — его
форма, `main:Catalog.Валюты.Module.Object.Method.ПередЗаписью` — метод модуля
объекта. Вид цели задаёт число сегментов: прикладное имя, совпадающее с
названием вида, объект в ветвь не превращает.
Префикс набора обязателен. Адрес без него отклоняется кодом `bad_value` с
подсказкой вызвать `unica.view {}`.
## Порядок работы
1. `unica.view {}` без аргументов — корень: наборы исходников, их формат,
готовность и незакрытые проверки. Отсюда берётся имя набора для префикса.
2. `unica.find` переводит в адрес имя, синоним или путь к файлу исходника.
`kind` сужает вид, `limit` ограничивает страницу.
3. `unica.view {at}` читает узел. Ответ бывает двух форм, и различать их надо
до чтения полей:
- **узел** — `props` с фактами самого узла и `branches` со счётчиками
дочерних коллекций;
- **страница коллекции** — `items`, каждый со своим `at`.
4. Спускайся по адресу из `branches`, пока не дойдёшь до нужного факта.
Содержимое лежит в листьях: текст запроса — в `...DataSet.<Набор>.Query`,
текст метода — в `...Method.<Имя>.Body`, оба построчно с `line` и `text`.
### Корень
```json
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": { "name": "unica.view", "arguments": { "cwd": "<workspace>" } }
}
```
### Поиск цели
```json
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "unica.find",
"arguments": { "cwd": "<workspace>", "query": "Валюты", "kind": "Form" }
}
}
```
Кандидат несёт `at`, `kind`, `title`, `path` и `reason` — по какому признаку он
найден. Пустой список с `nearest: true` означает «ближе ничего нет», а не отказ.
### Чтение узла
```json
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "unica.view",
"arguments": {
"cwd": "<workspace>",
"at": "main:Catalog.Валюты.Form.ФормаЭлемента"
}
}
}
```
### Спуск по ветви
```json
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "unica.view",
"arguments": {
"cwd": "<workspace>",
"at": "main:Catalog.Валюты.Form.ФормаЭлемента.Item"
}
}
}
```
## Что где лежит
| Вопрос | Адрес |
|--------|-------|
| Состав формы | `<объект>.Form.<Форма>` → ветви `Item`, `Attribute`, `Event`, `Module` |
| Права роли | `Role.<Роль>` → ветвь `Right`, объект права в `props` со счётчиками |
| Схема компоновки | `<объект>.Template.<Макет>` → `DataSet` → набор → `Field`, `Query`; варианты настроек — `Setting` |
| Пакет XDTO | `XDTOPackage.<Пакет>` → `Namespace`, `Type`, `Property` |
| Подсистема | `Subsystem.<Имя>` → `Interface` → `Command` |
| Методы модуля | `<объект>.Module.<Роль>` → `Method`, `Region`, `Event`, `Body` |
Поддержка поставщика приходит в `props.support` объекта — читай её перед любой
правкой объекта на замке и решай через release-support, а не правкой напрямую.
## Страницы
`limit` ограничивает страницу коллекции, ответ возвращает `cursor`. Курсор
непрозрачен и привязан к тому же вопросу: тот же адрес, тот же `limit`, та же
ревизия. Чужой или устаревший курсор отклоняется кодом `invalid_cursor` —
начинай обход заново, а не подставляй курсор от другого вызова.
## Проекция модуля
`filter` осмыслен только для проекций модуля и только там, где он объявлен:
| Ключ | Где применим | Что делает |
|------|--------------|------------|
| `context` | `Body`, `Method` | оставляет ветку условной компиляции одного контекста: `client`, `server`, `externalConnection`, `thinClient`, `webClient` и прочие имена профиля |
| `public` | `Method` | оставляет только экспортные методы |
На любой другой проекции фильтр отклоняется кодом `bad_value` с названием
причины — это не молчаливое игнорирование.
## Отказы
| Код | Что случилось |
|-----|---------------|
| `bad_value` | адрес без префикса набора, либо фильтр не той формы или не на той проекции |
| `provider_unavailable` | набор исходников не допущен рабочим пространством |
| `not_found` | объект не зарегистрирован в конфигурации, либо адрес не существует в профиле платформы |
| `invalid_cursor` | курсор чужой, просроченный или от другого вопроса |
## Правка
Чтение и правка разделены. Изменение BSL вносит `unica.code.patch`:
`operation: "insert"` добавляет текст у селектора, `operation: "replace"`
переписывает выбранный метод либо вхождение якоря. Он правит выбранный участок,
а не переписывает модуль целиком, поэтому годится и для модулей, которые не
поместились бы в один запрос.
```json
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "unica.code.patch",
"arguments": {
"cwd": "<workspace>",
"sourceSet": "main",
"metadataPath": "CommonModule.SourceAccessExample.Module",
"operation": "replace",
"selector": { "method": "BeforeReplacement" },
"content": "Procedure BeforeReplacement()\n\t// новое тело\nEndProcedure",
"dryRun": true
}
}
}
```
После подтверждения повтори те же аргументы с `dryRun: false`; изменение
селектора или содержимого требует нового предпросмотра.