---
name: pssl-library
description: >-
  Overlay репозитория PSSL (Проектная библиотека подсистем): ядро с префиксом
  пбп_, конфигурация src/cf, модули пбп_Переадресация*, загрузка в ИБ, тесты YaXUnit
  (YAXUNIT, модули ОМ_*). Использовать при правках этой библиотеки, прогоне
  yaxunit/юнит/ЮТТесты, правках src/cfe/YAXUnit, локальном Vanessa MCP;
  не при адаптации ERP/УТ с другим префиксом. Unica — XML и поиск;
  1c-pssl — карта подсистем при встраивании в чужую КФ.
---

# pssl-library — ядро ПБП в этом репозитории

Конфигурация: `src/cf` (source-set `main`). Имя `ПроектнаяБиблиотекаПодсистем` (vendor Первый БИТ). Префикс **`пбп_`**. Разработка на платформе **8.3.27**, режим совместимости **8.3.24**.

Расширение тестов: `src/cfe/YAXUnit`, имя в метаданных `YAXUNIT` (source-set `YAXUNIT`). Версия движка — **25.12** (`Configuration.xml` → `Version`). Это не `tools-download` артефакт. Канон API: [Возможности YAxUnit](https://bia-technologies.github.io/yaxunit/docs/features); пины ПБП — `docs/РуководствоПоНаписаниюТестовYAxUnit.md`.

Режим БСП: модули `пбп_Переадресация`, `пбп_ПереадресацияКлиент`, `пбп_ПереадресацияКлиентСервер` и ПовтИсп **есть**. Новые вызовы сервисов БСП в этой конфигурации — через переадресацию (`docs/ПереопределениеМетодовБСП.md`), не напрямую `ОбщегоНазначения.*`, если для метода есть обёртка.

Это **исходники библиотеки**, не готовое внедрение в типовую конфигурацию.

Общий контракт Unica — `v8project.yaml`. ИБ и платформа — только `v8project.local.yaml`. Те же пины в `.dev.env`. Аргумент `cwd` не дублировать, если процесс уже в каталоге с `v8project.yaml` (skill `unica-mcp`).

## Куда класть правки

- Новые объекты и общие модули ядра — с префиксом `пбп_`, в существующих подсистемах ПБП (`docs/*.md`).
- Формы и подписки библиотеки — по документации подсистем и user skill `1c-pssl` (имена с `пбп_`).
- Обработка первого внедрения — `src/epf`, не смешивать с конфигурацией без нужды.
- 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` готов.
- Сценарии YaXUnit — в `src/cfe/YAXUnit`, не в `src/cf`.

## Запреты для этого репозитория

- Не создавать объекты без префикса `пбп_`, если это не заимствованный код (Connector, DFI и т.п. уже в составе).
- Не удалять `пбп_Переадресация*` «как в конфигурации на полной БСП».
- Не копировать в модули пути локальной ИБ и не писать машинно-зависимые константы.

После правки BSL: Unica `unica_code_diagnostics` `findings` по модулю (`sourceSet=YAXUNIT` для тестов), если `user-unica` готов; иначе LS. Затем Напарник `check_1c_code` → `review_1c_code`, без двойного синтаксиса на одном файле.

## Загрузка в ИБ

В `build` передавать `sourceSet`, не параметр `extension`.

1. Исключение к user rule `ui-testing-tools` (не завершать `1cv8` / `1cv8c`): только если пользователь явно просил загрузить конфигурацию. Designer занимает файловую базу эксклюзивно, поэтому перед `build` закрыть тест-клиент и тест-менеджер. После загрузки Vanessa MCP поднимать снова по `ui-testing-tools`.
2. Пользователь явно просил загрузить. КФ: `unica_runtime_job_start` `operation=build` `sourceSet=main` `fullRebuild=true` `dryRun=false`.
3. Затем тесты: тот же вызов с `sourceSet=YAXUNIT` `fullRebuild=true`. Не один `build` «на все расширения».
4. Смотреть `unica_runtime_job_wait` / `unica_runtime_job_logs`. Пустой лог до конца у обычного build — норма.

`build` грузит XML и обновляет конфигурацию БД **этого** source-set. Не вызывать `unica_build_*`. Не обходить `unica_runtime_*` прямым `v8-runner.exe`. Длинный build — только `job.start`, не синхронный `unica_runtime_execute`.

После `/LoadCfg` в Конфигураторе: `/UpdateDBCfg` без `-Extension` для основной КФ, затем `/UpdateDBCfg -Extension YAXUNIT` (не безопасный режим). Флаг `-AllExtensions` не использовать.

## YaXUnit — написание

Канон: `docs/РуководствоПоНаписаниюТестовYAxUnit.md` + [features](https://bia-technologies.github.io/yaxunit/docs/features). Параметры CI: `tools/yaxunit.json`. Дизайн тестов Unica `test-authoring` — общее; пины и запуск — здесь.

- Модуль теста: `ОМ_<Объект>` (один `_` после `ОМ`; существующие: `ОМ_ПредопределенныеЗначения`, `ОМ_КоннекторHTTP`, …).
- Экспорт `ИсполняемыеСценарии()` — только регистрация через `ЮТТесты` (`ДобавитьТестовыйНабор` / `ДобавитьТест` / `СПараметрами` / `ВТранзакции`); без создания данных в этой процедуре.
- Утверждения и данные: `ЮТест.ОжидаетЧто(...)`, `ЮТест.Данные()`, при необходимости `ЮТест.Варианты` / `ЮТест.Предикат` / `Мокито`.
- В новых тестах `НеЗаполнено()`, не `Пусто()` (алиас совместимости 25.x).
- Флаги `ОМ_*` для пакетного прогона: обычно `Server=true`, `ExternalConnection=true`; клиентские флаги — только если тест реально клиентский. `ДобавитьКлиентскийТест` выбирает клиентский контекст лишь среди доступных модулю по метаданным; `Server` сам по себе клиент не даёт.
- Не менять движок `ЮТ*` без явной просьбы на обновление YAxUnit.

## YaXUnit — applied-запуск

Только если пользователь просил выполнить тесты. Preview (`dryRun=true`) не считать прогоном. Сначала загрузить `main` и `YAXUNIT` (раздел выше).

`unica_runtime_job_start` `operation=test` `testRunner=yaxunit` `dryRun=false`:

- весь набор: `testScope=all`;
- модуль: `testScope=module`, `module=CommonModule.ОМ_…` (например `CommonModule.ОМ_ПредопределенныеЗначения`);
- `fullOutput=true` — полный вывод раннера (это не `fullRebuild`).

Наблюдать `unica_runtime_job_wait` / `unica_runtime_job_logs`. Артефакты: `tools/yaxunit.json` → `./build/out/yaxunit/`. Сохранить путь при падении.

Не `testRunner=va`, если речь про YaXUnit. Не выдумывать пути фич.

Если Unica недоступен и пользователь просил прогон: параметры `tools/yaxunit.json`, подключение ИБ из `.dev.env` / `tools/vrunner.json`. Не выдумывать ключи платформы.

## Vanessa Automation (MCP)

Протокол сессии — user rule `ui-testing-tools` и skill `vanessa-automation`.

Пины этого репозитория: CI `tools/VBParams.json`, пакетный Unica `test` `va` — `tools/VBParams.local.json` (gitignore), живой MCP — `tools/va/VAParams.json` (`ВыполнитьСценарии` = false), старт `tools/va/Start-VanessaMcp.ps1`. Stdio-мост — пользовательский инструмент, не файл репозитория. Не использовать Vanessa MCP для фактов конфигурации (это Unica).

## Vanessa — написание фич (PSSL)

Дополняет skill `vanessa-automation` (шаги и MCP). Здесь — каталог и приёмы этого репозитория.

Эталон в репозитории: `features/Создание и пометка на удаление настройки отбора объектов.feature`. Шаги не выдумывать — копировать оттуда и из `search_for_steps_by_keywords`.

- Каталог `features/`. CI (`tools/VBParams.json`) гоняет все фичи. Новую фичу класть на ветку PR, не в `develop` «заодно».
- Каждый **сценарий** самодостаточен: сам ищет и чистит свои данные, сам создаёт ссылки. Не открывать элемент, созданный предыдущим сценарием (CI может прогнать один сценарий).
- Имена `ВА_…`, уникальные на сценарий (`ВА_PR376_Очистка`, не одно имя на всю фичу).
- Очистка: `ФормаНайти` → «По точному совпадению» → `пока в таблице "Список" количество строк ">" 0`. Если текущая строка **уже помечена на удаление** — `я прерываю цикл` (иначе `я удаляю строку` часто не открывает `1С:Предприятие`). Непомеченные: `я меняю пометку удаления строки` и `Button0`. Не заменять это на одиночный `Если в таблице есть строка` — при перезапуске остаются дубли.
- Выбор после очистки: последняя строка поиска и `текущая строка не помечена на удаление`.
- Заголовок списка = ListPresentation (`Настройки интеграции`), форма элемента = ObjectPresentation (`Настройка интеграции (создание)`). Не подставлять заголовок списка в окно создания.
- Перед `ФормаЗаписатьИЗакрыть` заполнить обязательные поля. Пометка удаления / «1С:Предприятие» — `Button0`; вопрос формы (`Да`/`Нет`) — по заголовку кнопки.
- Если клик срывается с текстом про панель функций — `manage_command_interface` `close_function_panel`, затем шаг, не invent Gherkin.
- После правки: `open_feature_file` → `load_features` → `check_syntax` → `run_scenario` изменённых сценариев. Без зелёного прогона фича не готова. Если сценарий пишет справочники — прогнать фичу **второй раз**.

## Vanessa — CI/Jenkins

Параметры: `tools/VBParams.json`. Отличия от локального MCP (проверено на PR порта в потоке): TestClient часто `/N""`, `ИскатьЭлементыФормыПоИмени=false`, `ЗапускатьТестКлиентВРежимеОтладки` + `-http`, `ОтключитьЗапускРеглЗаданийВФайловойБазе` не включали, полный набор фич до текущей. Правило при открытой фиче: `.cursor/rules/vanessa-jenkins.mdc`.

- Требование «поле видно / не доступно / принимает ввод» — **не** заканчивать `ФормаЗаписатьИЗакрыть` + `я жду закрытия окна '… (создание)*'`. После проверки: нужный ввод и `я закрываю все окна клиентского приложения` (как в Контексте). Эталон удачного обхода: `features/Порт в интеграционном потоке.feature`, сценарий видимости порта на форме потока.
- `ЗаписатьИЗакрыть` только если сценарий проверяет именно запись. Канон VA: `'Имя (создание) *'` с пробелом перед `*`. Не копировать wait-close с уже записанного элемента (`Имя (Тип)*`, смоук интеграций) на форму создания.
- Если после записи заголовок всё ещё `… (создание) *` — объект не записался (FillChecking, фокус в TextDocumentField/числе, вопрос «Записать?» у флажка регламентного задания). Не увеличивать таймаут. Не добавлять вслепую `Если появилось предупреждение` + `Button0`: на закрытии это «Да, сохранить», на вопросе формы — чужой диалог.
- Не `я перехожу к следующему реквизиту` после `Порт` / флага, если Tab может попасть на `ИспользоватьРегламентноеЗадание` (для нового элемента — вопрос «Записать?»).
- Не заполнять `ТочкаВхода` и прочие поля, если они не входят в проверяемое требование.
- Find: FieldSelector «Наименование», не CompareType. После очистки — последняя строка поиска, `текущая строка не помечена на удаление`.
- Таблица с `Доступность=Нет` — не `количество строк`; кнопка с `Доступность=Нет` — шаг «не доступен», не «отсутствует».
- Выпадающий список (`ТипАвторизации` и аналоги): после выбора не вводить наименование. На CI `-http` шаг выбора проходит, значение остаётся пустым. Выбирать последним, `по строке`, затем активировать уже заполненное поле, сразу `стал равен`. Эталон: `features/Тип авторизации без авторизации.feature`.
- Не `ВвестиТекст` в `СписокНастроекЗначение` / `…ЗначениеПредставление` (`PasswordMode`, составной тип). На CI поиск по заголовку попадает в поле пароля. Не заполнять такие колонки; не ждать вопрос OnChange, если в коде смотрят `ЗначениеЗаполнено`. Не менять модуль формы, чтобы шаг стал зелёным, если пользователь держит текущий код.
