unica-dev · git:20261016.bbd6457 · 2026-10-16 · sha256 e7d878a76e45846c

unica-dev git:20261016.bbd6457A

Immutable. This exact content never changes and is served at /api/v1/blob/e7d878a76e45846c.

---
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.<op>`. Один и тот же `op` на форме и на объекте может принимать
разные аргументы. Не переноси схему соседа.

`implemented: true` означает готовность операции к исполнению, но подробный
дескриптор аргументов может быть ещё недоступен. Если запрос контракта
отказал, прочитай причину и предложенный маршрут. Для операций BSL
используй [code-patch](../code-patch/SKILL.md) и фактическую схему `apply`;
не выдумывай недостающий контракт и не называй такую операцию
нереализованной. Операцию с `implemented: false` не исполняй.

Сначала подготовь изменение вызовом `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.