source-access · git:20260730.517463e · 2026-07-30 · sha256 44bcc8a53a735eef
source-access git:20260730.517463eA
Immutable. This exact content is served forever at /api/v1/blob/44bcc8a53a735eef.
---
name: source-access
description: Найти логическую цель 1С, восстановить адрес по пути в исходнике и безопасно исследовать снимок ресурсов через MCP Unica
argument-hint: <sourceSet> [metadataPath|path] <resolve|inspect|locate>
allowed-tools:
- Read
- Glob
---
# /source-access — логическая навигация и чтение исходников
## MCP routing
- Preferred path: сначала выбери предметный writer MCP `unica`. Для точечной
вставки BSL используй `unica.code.patch`; для формы, DCS, MXL, роли,
подсистемы или метаданных — соответствующий `unica.*.edit` либо
`unica.*.compile`.
- Для поиска цели используй `unica.source.resolve` или
`unica.source.children`. Для исследования уже выбранной цели используй
`unica.source.resources`, затем `unica.source.read`.
- Когда на руках физический путь — из `unica.code.search`, из диффа, из лога
сборки — переведи его в логический адрес через `unica.source.locate`, а не
выводи адрес из раскладки каталогов вручную. `locate` отвечает и владельцем
файла: для модуля это его объект метаданных, для содержимого формы — сама
форма. Отказ типизирован: `outsideSourceSet`, `notAddressable` или
`ownerUnproven`.
- Ресурсная группа доступна только на чтение. Изменение BSL выполняет
`unica.code.patch`: `operation: "insert"` добавляет текст у селектора,
`operation: "replace"` переписывает выбранный метод либо вхождение якоря.
Он правит выбранный участок, а не переписывает модуль целиком, поэтому
подходит и для модулей, которые не поместились бы в один запрос.
- Не вызывай внутренние MCP/CLI-адаптеры и не подменяй логическую цель
физическим путём. Все операции идут через один MCP `unica`.
## Порядок работы
1. Выбери точный `sourceSet`. Разреши английский или русский запрос через
`unica.source.resolve`; при исследовании дерева обойди один уровень через
`unica.source.children`.
- Вид цели задаёт число сегментов адреса: `Document.ЗаказКлиента` — объект,
`Document.ЗаказКлиента.ObjectModule` — модуль. Прикладное имя, совпадающее
с названием роли, объект в модуль не превращает.
- Корень набора исходников адресуется отсутствием `metadataPath`, а корневые
модули приложения — голым терминалом, например `ManagedApplicationModule`.
- В `mode: "prefix"` неполным может быть только канонический английский
токен: `Doc`, `Su` и `Man` работают, `Документ` работает целиком, а
неполный псевдоним вроде `Док` отклоняется — у него нет единственной
канонической формы.
2. Открой `unica.source.resources` с точным `sourceSet` и `metadataPath`, когда
выбранная цель находится ниже корня набора исходников. Манифест сообщает
роль, размер, хеш и профиль текста; `access` всегда содержит только `read`.
3. Читай ресурс через `unica.source.read` фрагментами до объявленного
`limits.maxReadBytes`. Сохрани `snapshotId`, `resourceId`, полный `hash`,
`bomPrefixBytes` и профиль EOL. Продвигайся на возвращённый `length`, а не
на запрошенный `limit`: фрагмент текстового ресурса усекается до ближайшей
границы UTF-8, поэтому он бывает короче лимита. `contentEncoding: "base64"`
означает точные байты, а не текст, который можно молча перекодировать. У
текстового ресурса он остаётся как минимум там, где лимит уже одного символа
и где `offset` задан внутри многобайтового символа: `offset` адресует байты,
а не символы. Всегда смотри на возвращённый `contentEncoding`, а не
предполагай его.
4. Изменение вноси через `unica.code.patch` с `dryRun: true`, проверь diff,
диапазоны и BSL-валидацию, и только затем повтори с `dryRun: false`.
## Предпросмотр правки
```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`; изменение
селектора или содержимого требует нового предпросмотра.