--- name: pssl-library description: >- Overlay репозитория PSSL (Проектная библиотека подсистем): ядро с префиксом пбп_, конфигурация src/cf, модули пбп_Переадресация*, загрузка в ИБ, тесты YaXUnit (YAXUNIT, модули ОМ_*). Использовать при правках этой библиотеки, прогоне yaxunit/юнит/ЮТТесты, правках src/cfe/YAXUnit, локальном Vanessa MCP; не при адаптации ERP/УТ с другим префиксом. Unica — XML и поиск; 1c-pssl — карта подсистем при встраивании в чужую конфигурацию. --- # pssl-library — ядро ПБП в этом репозитории Факты проекта, запреты и правила BSL — `AGENTS.md`. Здесь — инструменты и прогоны локального Cursor с user MCP. Контракт Unica — `v8project.yaml` (в Git). ИБ и платформа — `v8project.local.yaml` и `.dev.env`. В каждом вызове Unica `cwd` = `WORKSPACE_ROOT` из `.dev.env`: без `cwd` сессия видит каталог профиля пользователя. ## Правки - XML форм и метаданных — Unica leaf (`form-*`, `meta-*`). Поиск — `unica_code_search` / `unica_source_resolve`. - Правка BSL — `unica_code_patch` после `unica_source_resolve`. Не `StrReplace` / `Write` / `Shell` по `src/cf/**/*.bsl` и `src/cfe/YAXUnit/**/*.bsl`, пока `user-unica` готов. - После правки BSL: `unica_code_diagnostics` `findings` по модулю (`sourceSet=YAXUNIT` для тестов); если Unica недоступен — LS. Затем Напарник `check_1c_code` → `review_1c_code`, без двойного синтаксиса на одном файле. ## Загрузка в ИБ Прогон — фаза тестировщика в `pssl-pr-flow`, в той же сессии сразу после записи запрошенного объёма в исходники или после законченного круга правок. Пока код ещё пишется, базу не обновлять и тесты не запускать. Отдельную фразу пользователя не ждать. Основная конфигурация — каталог `src/cf`, source-set `main`. Расширение — `src/cfe/YAXUnit`, source-set `YAXUNIT`. Каждый изменившийся source-set — своим `build`; без изменений повторно не грузить. YaXUnit — если менялась основная конфигурация или расширение YAXUNIT. Фичи Vanessa — если менялась основная конфигурация или `features/`. 1. Исключение к user rule `ui-testing-tools` (не завершать `1cv8` / `1cv8c`): Designer занимает файловую базу эксклюзивно. Перед `build` закрыть только сеансы, у которых `/F` совпадает с `INFOBASE_PATH`. После загрузки Vanessa MCP поднимать снова по `ui-testing-tools`. 2. Для каждого изменившегося source-set — свой вызов `unica_runtime_job_start` `operation=build` `sourceSet=` `dryRun=false`; если менялись оба — сначала `main`, затем `YAXUNIT`. Неизменившийся source-set не грузить. `fullRebuild=true` — только после переключения ветки, rebase, merge `origin/develop`, крупного переноса объектов или подозрения на испорченное инкрементальное состояние; иначе без него. В `build` передавать `sourceSet`, не `extension`. Не один `build` «на все расширения», не `-AllExtensions`. 3. Наблюдать `unica_runtime_job_wait` (`timeoutSeconds` до 60) / `unica_runtime_job_logs`. Пустой лог до конца у обычного build — норма. 4. Итог базы — журнал `build/logs/platform/build-00--update.log`. Строка «Обновление конфигурации успешно завершено» — source-set обновлён, тот же `build` повторно не запускать. Не вызывать `unica_build_*`. Не обходить `unica_runtime_*` прямым `v8-runner.exe`. Длинный build — только `job.start`, не синхронный `unica_runtime_execute`. Applied `launch` `mcp-va` / thin — fail-closed. После `/LoadCfg` в Конфигураторе: `/UpdateDBCfg` без `-Extension` для основной конфигурации, затем `/UpdateDBCfg -Extension YAXUNIT` для расширения (не безопасный режим). ### Сбои задания - Exit 3 и `unica-recovery` / «Отказано в доступе» (os error 5) — обход каталога исходников после Конфигуратора (облачный диск). Итог — по журналу из п. 4. `1CD` не удалять, takeown не вызывать. - Фаза `lost`, предупреждение `stale worker heartbeat`, `exitCode` пустой; новый `job.start` отвечает «workspace already has active runtime job». `job.cancel` и перезапуск MCP блокировку не снимают. Если pid задания мёртв и нет `v8-runner` / `1cv8` / `1cv8c` этой базы — удалить `.build/unica/jobs/active.lock`, `build/.v8-runner.workspace.lock` и `build/.v8-runner.workspace.lock.json`. Живой Конфигуратор этой базы — ждать. Итог задания судить по журналу (п. 4) или по `stdout.log` YaXUnit; успешный шаг не повторять. ## YaXUnit — написание Канон: `docs/РуководствоПоНаписаниюТестовYAxUnit.md` + [features](https://bia-technologies.github.io/yaxunit/docs/features). Дизайн тестов Unica `test-authoring` — общее; пины и запуск — здесь. - Модуль теста: `ОМ_<Объект>` (один `_` после `ОМ`; существующие: `ОМ_ПредопределенныеЗначения`, `ОМ_КоннекторHTTP`, …). - Экспорт `ИсполняемыеСценарии()` — только регистрация через `ЮТТесты` (`ДобавитьТестовыйНабор` / `ДобавитьТест` / `СПараметрами` / `ВТранзакции`); без создания данных в этой процедуре. - Утверждения и данные: `ЮТест.ОжидаетЧто(...)`, `ЮТест.Данные()`, при необходимости `ЮТест.Варианты` / `ЮТест.Предикат` / `Мокито`. - В новых тестах `НеЗаполнено()`, не `Пусто()` (алиас совместимости 25.x). - Флаги `ОМ_*` для пакетного прогона: обычно `Server=true`, `ExternalConnection=true`; клиентские флаги — только если тест реально клиентский. `ДобавитьКлиентскийТест` выбирает клиентский контекст лишь среди доступных модулю по метаданным; `Server` сам по себе клиент не даёт. ## YaXUnit — запуск Только фаза тестировщика `pssl-pr-flow` или явная просьба пользователя. Preview (`dryRun=true`) прогоном не считать. Сначала раздел «Загрузка в ИБ». `unica_runtime_job_start` `operation=test` `testRunner=yaxunit` `testScope=all` `fullOutput=true` `dryRun=false`: - охват только `testScope=all`. На движке 25.12 `testScope=module` с `CommonModule.ОМ_…` кладёт в фильтр ключ с точкой, `ЮТКоллекции` отвечает «Задано неправильное имя атрибута структуры», дальше зацикливание. Один модуль всё равно гонять как `all`. Модули `ЮТ*` не патчить; - `fullOutput=true` — полный вывод раннера (это не `fullRebuild`). Зелёный прогон — в `stdout.log` задания (`.build/unica/jobs//stdout.log`) есть `Tests completed` и `summary: … failed=0, … errors=0`, а `total` больше нуля. Код выхода 0 без этой строки зелёным не считать. Отчёт `tools/yaxunit.json` (`./build/out/yaxunit/`) — для CI; Unica его не создаёт, его отсутствие локально — не ошибка. Не `testRunner=va`. Если Unica недоступен и пользователь просил прогон: параметры `tools/yaxunit.json`, подключение ИБ из `.dev.env` / `tools/vrunner.json`. Не выдумывать ключи платформы. ## Vanessa Automation (MCP) Протокол сессии — user rule `ui-testing-tools` и skill `vanessa-automation`. Старт — общий `Start-VanessaMcp.ps1 -RepoRoot` (корень клона). Живой MCP — `tools/VAParams.json` (`ВыполнитьСценарии` = false), CI — `tools/VBParams.json`, пакетный Unica `test` `va` — `tools/VBParams.local.json` (gitignore). Фичи — через Vanessa MCP, не через Unica `test` `va`. Не использовать Vanessa MCP для фактов конфигурации (это Unica). ## Vanessa — написание фич (PSSL) Дополняет skill `vanessa-automation` (шаги и MCP). Отличия Jenkins — `.cursor/rules/vanessa-jenkins.mdc` (единственный источник). Здесь — каталог и приёмы этого репозитория. Эталон в репозитории: `features/Создание и пометка на удаление настройки отбора объектов.feature`. Шаги не выдумывать — копировать оттуда и из `search_for_steps_by_keywords`. - Каталог `features/`. Порядок прогона — `СписокФичДляВыполнения` в `tools/VBParams.json`; тот же массив в `tools/VAParams.json`. Новую фичу добавлять в конец обоих списков, существующие строки не переставлять. Новую фичу класть на ветку PR, не в `develop` «заодно». Прогон MCP — `run_scenario` в этом порядке. - Каждый **сценарий** самодостаточен: сам ищет и чистит свои данные, сам создаёт ссылки. Не открывать элемент, созданный предыдущим сценарием (CI может прогнать один сценарий). - Имена `ВА_…`, уникальные на сценарий (`ВА_PR376_Очистка`, не одно имя на всю фичу). - Очистка: `ФормаНайти` (FieldSelector «Наименование», не CompareType) → «По точному совпадению» → `пока в таблице "Список" количество строк ">" 0`. Если текущая строка **уже помечена на удаление** — `я прерываю цикл` (иначе `я удаляю строку` часто не открывает `1С:Предприятие`). Непомеченные: `я меняю пометку удаления строки` и `Button0`. Не заменять это на одиночный `Если в таблице есть строка` — при перезапуске остаются дубли. - Выбор после очистки: последняя строка поиска и `текущая строка не помечена на удаление`. - Заголовок списка = ListPresentation (`Настройки интеграции`), форма элемента = ObjectPresentation (`Настройка интеграции (создание)`). Не подставлять заголовок списка в окно создания. - Перед `ФормаЗаписатьИЗакрыть` заполнить обязательные поля. Пометка удаления / «1С:Предприятие» — `Button0`; вопрос формы (`Да`/`Нет`) — по заголовку кнопки. - «Кнопка не найдена» или «недоступный элемент»: сначала `unica_form_info` (элемент Button, родитель, `commandBarLocation`). Кнопка — элемент Button, не запись в командах. Команда без кнопки и панель таблицы с `CommandBarLocation` `None` кликом не лечатся; видимые команды — на командной панели формы. `close_function_panel`, `УстановитьПривилегированныйРежим` и выдача ролей — только когда кнопка в форме уже есть. - После правки: `open_feature_file` → `load_features` → `check_syntax` → `run_scenario` изменённых сценариев. Без зелёного прогона фича не готова. Если сценарий пишет справочники — прогнать фичу **второй раз**.