unica-dev · diff
git:20261016.bbd6457 to git:20261026.37524f0
5 added, 9 removed. Audit A to A.
---
name: unica-dev
description: "Разработка на 1С через Unica: обнаружить исходники, найти и прочитать цель по логическому адресу, узнать доступные операции, подготовить изменение и получить результат. Используй как точку входа при начале работы с проектом 1С или когда неясно, какой инструмент либо предметный навык выбрать."
---
# Работа с 1С через Unica
Начни с цели пользователя: что нужно узнать или изменить и как проверить
результат. Для работы с проектом используй публичный MCP `unica`. Схемы
доступных инструментов и возвращённые ими адреса относятся к подключённой
сборке; проверяй их перед вызовом. Внутренние адаптеры и упакованные скрипты
не являются дополнительными публичными инструментами.
## Найти и прочитать цель
1. Если набор исходников неизвестен, вызови `unica.view {}` в рабочем
пространстве проекта. В ответе найди наборы, их состояние и дальнейшие
проверки. Префикс набора бери из ответа: `main` не является умолчанием.
2. Найди объект по имени или синониму через `unica.search` со сводом `names`.
Для фрагмента BSL используй текстовый поиск. Прочитай схему инструмента,
чтобы выбрать поддерживаемые область и способ поиска.
3. Открой возвращённый `at` через `unica.view`. Спускайся по адресам
`branches` и `items`; не собирай физический путь вместо логической цели.
Проверь `limits` и полноту результата: пустая неполная выдача не доказывает
отсутствие предмета.
4. `unica.check` проверяет выбранный предмет; содержание проверок зависит
от адреса. Результат чтения не означает, что выполнены все проверки
изменения или поставки.
Для перевода пути из внешнего лога или diff используй `unica.resolve`:
либо `path`, либо `at`, без второго аргумента. В обычной навигации путь
не нужен. Разрешение файла не восстанавливает каждый вложенный символ:
элементы одной формы находятся в одном XML, а методы — в одном BSL.
Подробный порядок чтения, страницы и экранирование описаны в
[source-access](../source-access/SKILL.md), поиск кода — в
[code-search](../code-search/SKILL.md).
## Что называет адрес
Адрес включает набор и логический предмет: `<набор>:<Вид>.<Имя>…`.
Например, у объекта есть собственные реквизиты, формы и роли модулей;
у формы — её элементы и события. Это разные узлы с разными операциями.
Прикладное имя, похожее на название вида, не меняет смысл адреса.
Адреса из ответа передавай без изменений, включая `\.` внутри имени.
В JSON обратная косая черта удваивается.
У формы различаются три ресурса. Если `formAt` — полученный адрес формы,
то сама форма читает её структуру, `formAt.Metadata` — локальную декларацию,
а `formAt.Module.Form` — её BSL-модуль. Это пояснение формы адреса,
а не три обязательных успешных вызова: бери доступные продолжения из ответа.
У заимствованной формы расширения может быть локальная декларация без
локального содержимого. Признак `content: "inherited"` не означает пустую
форму и не разрешает подставлять элементы или модуль родителя.
Текстовый результат поиска с адресом `…Body#L<n>` открывай непосредственно.
`#L<a>-L<b>` выбирает включительный диапазон абсолютных строк файла.
Диапазон предназначен для чтения; перед изменением прочитай целый
содержащий метод или другой узел, названный `next`, и узнай его операции.
При невозможности доказать границы метода ответ может дать строку Body
модуля с ограничением. Это не доказывает, что строка находится вне метода:
в больших модулях границы метода могут быть недоступны текущей проекции.
Различай узел, страницу и исходный текст. У узла есть факты и ветви;
страница содержит `items` и может иметь `cursor`; Body BSL возвращает
конверт и сам текст отдельными текстовыми блоками. Не ожидай построчного
JSON там, где пришёл исходный текст. При `result_too_large` используй
предложенный читаемый диапазон или структурное продолжение из `next`.
## Узнать операцию и внести изменение
- Открой целевой узел и прочитай его `can`. Проверяй `implemented`:
- название операции само по себе не подтверждает готовность исполнения.
- Подробности выбранной операции запрашивай через `unica.view` по адресу
+ Открой целевой узел и прочитай его `can`: в нём только операции, которые
+ этот узел исполняет. Подробности выбранной операции запрашивай через `unica.view` по адресу
`<узел>.Can.<op>`. Один и тот же `op` на форме и на объекте может принимать
разные аргументы. Не переноси схему соседа.
- `implemented: true` означает готовность операции к исполнению, но подробный
- дескриптор аргументов может быть ещё недоступен. Если запрос контракта
- отказал, прочитай причину и предложенный маршрут. Для операций BSL
- используй [code-patch](../code-patch/SKILL.md) и фактическую схему `apply`;
- не выдумывай недостающий контракт и не называй такую операцию
- нереализованной. Операцию с `implemented: false` не исполняй.
+ Если запрос контракта отказал, прочитай причину и предложенный маршрут;
+ не выдумывай недостающий контракт. Для операций BSL используй
+ [code-patch](../code-patch/SKILL.md).
Сначала подготовь изменение вызовом `unica.apply` с адресом и операциями.
Проверь план: какие входы прочитаны, какие файлы и эффекты изменятся.
Предпросмотр не меняет исходники. Когда внесение именно этой правки
входит в поручение пользователя, исполни полученный план отдельным
`unica.apply` только с `executionToken` из успешного результата.
Для другого изменения нужен другой план. При устаревании входов перечитай
цель и подготовь новый план; не обходи отказ токена прямой записью.
После исполнения проверь фактический результат чтением и подходящей
проверкой `unica.check`; предметный навык уточняет необходимую приёмку.
Поддержку поставщика и унаследованное содержимое учитывай до правки.
## Отказ и отложенный результат
Прочитай `summary`, `diagnostics` и ограничения ответа. `next` описывает
дальнейший вызов, а не уже выполненное действие: проверь его смысл
относительно задачи и передай возвращённые аргументы подходящему инструменту.
Не превращай отказ или неполноту в успешное отсутствие объекта.
Если вместо предметного результата пришло задание Task, сохрани его
идентификатор. Не запускай исходный инструмент заново ради ожидания.
Способ наблюдения определяет доступный профиль клиента:
- при native Tasks используй предоставленные хостом операции MCP Tasks;
- при режиме совместимости используй обнаруженные `unica.task.get`
для состояния и `unica.task.result` для ограниченного ожидания результата.
Следуй интервалу опроса и срокам из ответа. Получение результата задания
продолжает тот же вызов; не исполняй план повторно после его завершения.
Отмена запрашивается через доступный профиль Task. Запрос отмены
не означает, что задание уже отменено или процессы уже завершены:
проверь сохранённое состояние и терминальный результат.
## Выбрать предметный навык
| Задача | Продолжение |
| --- | --- |
| Прочитать состав и перейти по адресам | [source-access](../source-access/SKILL.md) |
| Найти реализацию, вызовы или обработчик | [code-search](../code-search/SKILL.md) |
| Изменить BSL | [code-patch](../code-patch/SKILL.md) |
| Создать или изменить метаданные | [meta-add](../meta-add/SKILL.md), [meta-edit](../meta-edit/SKILL.md) |
| Изменить форму или её обработчики | [form-edit](../form-edit/SKILL.md), [form-events](../form-events/SKILL.md) |
| Проверить BSL или провести ревью | [code-diagnostics](../code-diagnostics/SKILL.md), [code-review](../code-review/SKILL.md) |
| Поддержка поставщика и обновление | [release-support](../release-support/SKILL.md) |
Для остальных предметов выбери профильный навык по его описанию.
Работа над кодом самого Unica выполняется по инструкциям его репозитория.
## Пример маршрута
Условия иллюстративного примера: отдельный XML-проект, набор `main`,
общий модуль `Probe`, метод `Ping`, исходная строка
`Сообщить("probe")`. В другом проекте получи свои адреса через инструменты.
Эти имена не задают умолчания продукта.
1. `unica.view {}` — обнаружить набор; найти `Probe` через поиск имён
и открыть возвращённый адрес модуля.
2. `unica.search {"query":"Сообщить(\"probe\")","scope":"main:CommonModule.Probe"}` —
получить `at` совпадения, затем передать его в `unica.view` и `unica.resolve`.
В этом примере это `main:CommonModule.Probe.Method.Ping.Body#L4`.
3. Если нужна правка, перейти к целому методу и его словарю `can`.
Для `code.replace` прочитать [code-patch](../code-patch/SKILL.md),
фактическую схему `apply` и весь заменяемый участок. Подготовить план
и проверить, что исходный файл ещё не изменился.
4. Исполнить токен принятого плана и снова прочитать изменённую строку.
Правка по диапазону `#L…` получает отказ и продолжение к целому узлу.
Пример исполняется в отдельной копии проекта при поручении внести правку.
Отказ с `next` и отложенный Task проверяются отдельными управляемыми
сценариями; быстрый ответ этого примера сам по себе не доказывает Task.