From 24c7e48600e356d584279afa2d8a5ce4f651cdf3 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Mon, 12 Oct 2026 19:18:01 +0400 Subject: [PATCH 1/3] =?UTF-8?q?docs:=20OQ-161=20=D0=B8=20=D0=B2=D1=80?= =?UTF-8?q?=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD=D1=8B=D0=B9=20=D1=80=D0=B5=D0=B6?= =?UTF-8?q?=D0=B8=D0=BC=20=C2=AB=D0=BF=D0=B5=D1=80=D0=B8=D0=BE=D0=B4=20?= =?UTF-8?q?=D0=9E=D0=A1=D0=92=20=D0=B8=D0=B7=20=D0=B2=D0=B5=D1=80=D1=81?= =?UTF-8?q?=D0=B8=D0=B8=20=D0=BA=D0=BE=D0=BD=D1=81=D0=BE=D0=BB=D0=B8=D0=B4?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D0=B8=C2=BB=20(#96)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 07-open-questions.md: OQ-161 — документ с периодом не той версии молча не привязывается; временное допущение CONSOLIDATION_PERIOD_FROM_VERSION (arm-core#103), постоянное решение открыто - qa-guide.md: §7.4 — как включить режим локально и в контуре, ограничения; строка в §9 - contour-transfer-guide.md: OPENBAO__APP__CONSOLIDATION_PERIOD_FROM_VERSION=true на период тестов Co-Authored-By: Claude Opus 5.5 --- context/07-open-questions.md | 1 + dev/contour-transfer-guide.md | 2 +- dev/qa-guide.md | 20 ++++++++++++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/context/07-open-questions.md b/context/07-open-questions.md index 2b820be..4ded9a2 100644 --- a/context/07-open-questions.md +++ b/context/07-open-questions.md @@ -166,6 +166,7 @@ | OQ-158 | В «Осталось N» (строки свода без ЮЛ и без ИНН) попадают строки аналитики, которые не являются контрагентами-организациями: «Ведомость в счет з/платы», подотчётные лица, физлица и т. п. — на РБ 2025 К1 таких большинство из 1291 строки без ИНН, и довести баннер до нуля сопоставлением с ЮЛ нельзя. Нужно ли отличать такие строки (признак «не организация» вручную / по словарю / по счёту) и исключать их из «Осталось N» и предупреждения [31-00] | жалоба владельца на «Указать» в сводной ОСВ (08.10.2026), RSHB/arm-core#74 | arm-core `domain/consolidated_osv.needs_mapping`, §3, экраны [30], [32-osv-no-inn], [31-00] | открыт: до решения такие строки считаются несопоставленными (EXTERNAL), переход к следующему шагу ими не блокируется — блокировки в API нет | | OQ-159 | Note DBML `recognition_job.reply_deadline` «таймаут ожидания (OCR — 5 мин)» расходится с решением владельца 09.10.2026: срок ответа OCR — 20 мин (`DEFAULT_REPLY_TIMEOUT` в arm-core, `SCAN_TIMEOUT_SECONDS=1200` в scan-gateway). Поправить note при следующей версии DBML | решение владельца 09.10.2026 (не выпускать версию DBML ради note); arm-core #87, arm-scan-gateway #26, arm-ka-docs #84 | DBML `recognition_job`, `05-domain-rules.md` §9.4 | **закрыт 09.10.2026:** note исправлен в DBML v5.18 (docs #90) | | OQ-160 | Целевая модель версий консолидации (владелец, 09.10.2026): несколько рабочих версий одного периода с **разным периметром** делят первичку (рабочий стол консоли, `stored_file.consolidation_id`); после `VERIFIED` новая версия (`previous_version_id`) может менять документы при **том же** периметре. Ядро сейчас создаёт только версию 1 (`POST /consolidations`), «новая версия» и параллельные версии не реализованы. Нужны правила: создание второй рабочей версии (обязательно другой периметр?), создание версии после `VERIFIED` (копия периметра, подхват привязок), что видит панель [39] у верифицированной версии до Среза 7 (ЕХ) | brainstorming docs #90, `openspec/changes/console-files/design.md` R-6, R-7 | срез «версии консолидации» (после Среза 4), Срез 7 | открыт: модель файлов совместима; реализация — отдельный срез | +| OQ-161 | Документ, период которого не совпадает с периодом консолидации, молча не привязывается к версии: ручное подтверждение проходит (200), а `fits` (`period_year` = год версии, D-5 Среза 4) его отбрасывает, `period_check` остаётся `UNKNOWN` (OQ-120) — свод пуст без объяснения (владелец 12.10.2026: ОСВ за 1 кв. 2025 в консолидации 2026 Q1). Период ОСВ берётся из шапки и через API не правится. Нужно ли (1) предупреждение «документ не подходит ни одной версии» при загрузке или подтверждении, (2) правка периода документа аналитиком (рядом с первичкой, как `original_*`), (3) постоянный режим «период из консолидации» для файлов, загруженных в неё | разбор владельца 12.10.2026; RSHB/arm-core#103 | `fits`, свод, чек-лист (§2, §9.3), карточка документа | **временное допущение (решение владельца 12.10.2026):** настройка `CONSOLIDATION_PERIOD_FROM_VERSION` (по умолчанию `false`; в контуре — `OPENBAO__APP__CONSOLIDATION_PERIOD_FROM_VERSION`) — ОСВ, загруженная в консолидацию (`stored_file.consolidation_id`), считается нарастающей за год и квартал консолидации для привязки, свода, чек-листа и колонки «ОСВ»; документ не меняется; ББ/ОФР и файлы с рабочего стола — по шапке; склейки кварталов нет (один слот на счёт ЮЛ). Только для тестов; открыт выбор постоянного решения (1)–(3), после него режим снять | Служебные идентификаторы в DBML/аналитике: `ANL-nnn` — замечания аналитика к макету; `ARCH-nnn` — архитектурные решения; `DECISION-n` — решения по модели; `FIX-nn` — исправления дефектов v4. diff --git a/dev/contour-transfer-guide.md b/dev/contour-transfer-guide.md index eff26e7..367f1c7 100644 --- a/dev/contour-transfer-guide.md +++ b/dev/contour-transfer-guide.md @@ -183,7 +183,7 @@ issue #22; файл `api/src/core/settings_sources.py` одинаков в тр | Сервис | Секреты `OPENBAO__<ГРУППА>__*` | Настройки `OPENBAO__APP__*` | |---|---|---| -| arm-core | `OPENBAO__DATABASE__DATABASE_URL` (asyncpg, схема `dkb`), `OPENBAO__MINIO__{MINIO_URL, MINIO_ADMIN_LOGIN, MINIO_ADMIN_PASSWORD, MINIO_BUCKET}` (`MINIO_SECURE=true` по умолчанию), `OPENBAO__NATS__{NATS_URL, NATS_SEED, NATS_JWT}` | `NATS_ENABLED=true` (по умолчанию `false`: без него NATS не подключается и обмен с сервисами распознавания не работает), `DEBUG=true`, `AUTH_DEV_ISSUER=true`, `AUTH_DEV_SECRET=<случайная строка от 32 байт>` (поле верхнего уровня `Settings`, поэтому тоже через `OPENBAO__APP__`), `FORWARDED_ALLOW_IPS=<адреса прокси платформы>` (иначе IP в аудите — адрес прокси); `CORS_ORIGINS` при `DEBUG=true` не нужен. `SERVER__HOST` не задавать (платформа задаёт сама) | +| arm-core | `OPENBAO__DATABASE__DATABASE_URL` (asyncpg, схема `dkb`), `OPENBAO__MINIO__{MINIO_URL, MINIO_ADMIN_LOGIN, MINIO_ADMIN_PASSWORD, MINIO_BUCKET}` (`MINIO_SECURE=true` по умолчанию), `OPENBAO__NATS__{NATS_URL, NATS_SEED, NATS_JWT}` | `NATS_ENABLED=true` (по умолчанию `false`: без него NATS не подключается и обмен с сервисами распознавания не работает), `DEBUG=true`, `AUTH_DEV_ISSUER=true`, `AUTH_DEV_SECRET=<случайная строка от 32 байт>` (поле верхнего уровня `Settings`, поэтому тоже через `OPENBAO__APP__`), `FORWARDED_ALLOW_IPS=<адреса прокси платформы>` (иначе IP в аудите — адрес прокси); `CORS_ORIGINS` при `DEBUG=true` не нужен. `SERVER__HOST` не задавать (платформа задаёт сама). **Временно, на период тестов:** `CONSOLIDATION_PERIOD_FROM_VERSION=true` — ОСВ, загруженная в консолидацию, берёт её период (arm-core#103, OQ-161; `qa-guide.md` §7.4); после тестов убрать | | scan-gateway | `OPENBAO__MINIO__*`, `OPENBAO__NATS__*`, `OPENBAO__SMB__{SMB_HOST, SMB_PATH, SMB_LOGIN, SMB_PASSWORD}` | `SCAN_HOTFOLDER_MODE=smb` (`NATS_ENABLED` по умолчанию `true`, задавать не нужно). `SCAN_HOTFOLDER_PATH` в контуре не нужен (только режим `local`; режим `local` и эмулятор `make emulator` — для разработки) | | tabular-parser | `OPENBAO__MINIO__*`, `OPENBAO__NATS__*` | сверх секретов ничего (`NATS_ENABLED` по умолчанию `true`); при необходимости `PARSE_TIMEOUT_SECONDS` (и `PARSE_MAX_BYTES`) | diff --git a/dev/qa-guide.md b/dev/qa-guide.md index f437555..80c2bf5 100644 --- a/dev/qa-guide.md +++ b/dev/qa-guide.md @@ -725,6 +725,24 @@ Q3-only — `missing_quarters = ["Q1","Q2"]`. 6. Текст контрагента, начинающийся с `=`, `+`, `-`, `@` (сделайте такой в своём файле), в Excel показывается как текст, а не вычисляется как формула. +### 7.4 Произвольные ОСВ в консолидации другого периода (временный режим) + +Документ привязывается к версии, только если период из **шапки ОСВ** подходит периоду консолидации: ОСВ за 1 кв. 2025, +загруженная в консолидацию 2026 Q1, после подтверждения **молча** не попадает ни в версию, ни в свод (OQ-161). Для тестов на +произвольных ОСВ есть временный режим `CONSOLIDATION_PERIOD_FROM_VERSION=true` (arm-core#103): в `api/.env` локально, в контуре — +`OPENBAO__APP__CONSOLIDATION_PERIOD_FROM_VERSION=true`; после смены — перезапуск ядра. + +В режиме ОСВ, **загруженная в консолидацию** (через версию, а не с рабочего стола), считается нарастающей за год и квартал +консолидации: подтверждение привязывает её, свод, чек-лист и колонка «ОСВ» периметра её видят. Что учесть: + +1. **Один файл на счёт ЮЛ.** Склейки кварталов нет: все ОСВ одного счёта одного ЮЛ в консолидации — один слот, в своде будет + подтверждённая последней. Грузите одну ОСВ на счёт (лучше нарастающую за весь период). +2. **Подтвердить всё нужное.** Документы `NEEDS_CHECK` (в т. ч. из-за чужого ЮЛ в шапке, `counterparty_check = MISMATCH`) в свод + не идут, пока их не подтвердили. +3. **Документы, подтверждённые до включения режима**, сами не перепривязываются: уберите ЮЛ из периметра и верните (подхват + `PUT …/members`) либо создайте консолидацию заново. +4. Карточка документа по-прежнему показывает период из шапки — это не баг. ББ/ОФР режим не затрагивает. + ## 8. Сквозной сценарий в UI (arm-web) Основной путь аналитика по макету: группа компаний → новая консолидация → файлы ЮЛ → проверка ОСВ и форм ББ/ОФР → @@ -864,6 +882,8 @@ PDF из `fixtures/ocr` — отчётность других компаний ( - Консолидация (Срез 4): блокировка, периметр, статусы и сопоставление — только API (раздел 8.7); маршрут согласования (`CONSOLIDATION_RF` и далее), «Добавить версию», гудвилл, шахматка — следующие срезы; формы ББ/ОФР в сводной ОСВ не участвуют (только в чек-листе); блокировка версии не истекает по времени; `period_check` документов остаётся `UNKNOWN`; `PROCESSING` в чек-листе ставится по всем недостающим столбцам ЮЛ, пока файл не смаплен (OQ-119, OQ-120, OQ-122). +- ОСВ, период которой (из шапки) не подходит периоду консолидации, после подтверждения молча не попадает в свод (OQ-161); + для тестов на произвольных ОСВ — временный режим из раздела 7.4. - Ручное сопоставление контрагента меняет строку ОСВ для всех версий, куда входит документ (OQ-123); рекомендация кандидата — только при точном совпадении нормализованного имени (OQ-127). - PDF-путь (Срез 3a): эмулятор отвечает только на PDF из `fixtures/ocr`, остальные — -- 2.47.2 From 410e96d64313634ccf248cbc9101e50780787359 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Mon, 12 Oct 2026 19:42:31 +0400 Subject: [PATCH 2/3] =?UTF-8?q?docs:=20=D1=80=D0=B5=D0=B6=D0=B8=D0=BC=20?= =?UTF-8?q?=C2=AB=D0=BF=D0=B5=D1=80=D0=B8=D0=BE=D0=B4=20=D0=B8=D0=B7=20?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D0=B8=C2=BB=20=E2=80=94=20=D1=82?= =?UTF-8?q?=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE=20=D0=9E=D0=A1=D0=92=20=C2=AB?= =?UTF-8?q?=D0=BD=D0=B5=20=D1=82=D0=BE=D0=B3=D0=BE=C2=BB=20=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D0=B8=D0=BE=D0=B4=D0=B0=20(#96)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- context/07-open-questions.md | 2 +- dev/qa-guide.md | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/context/07-open-questions.md b/context/07-open-questions.md index 4ded9a2..b27a5c9 100644 --- a/context/07-open-questions.md +++ b/context/07-open-questions.md @@ -166,7 +166,7 @@ | OQ-158 | В «Осталось N» (строки свода без ЮЛ и без ИНН) попадают строки аналитики, которые не являются контрагентами-организациями: «Ведомость в счет з/платы», подотчётные лица, физлица и т. п. — на РБ 2025 К1 таких большинство из 1291 строки без ИНН, и довести баннер до нуля сопоставлением с ЮЛ нельзя. Нужно ли отличать такие строки (признак «не организация» вручную / по словарю / по счёту) и исключать их из «Осталось N» и предупреждения [31-00] | жалоба владельца на «Указать» в сводной ОСВ (08.10.2026), RSHB/arm-core#74 | arm-core `domain/consolidated_osv.needs_mapping`, §3, экраны [30], [32-osv-no-inn], [31-00] | открыт: до решения такие строки считаются несопоставленными (EXTERNAL), переход к следующему шагу ими не блокируется — блокировки в API нет | | OQ-159 | Note DBML `recognition_job.reply_deadline` «таймаут ожидания (OCR — 5 мин)» расходится с решением владельца 09.10.2026: срок ответа OCR — 20 мин (`DEFAULT_REPLY_TIMEOUT` в arm-core, `SCAN_TIMEOUT_SECONDS=1200` в scan-gateway). Поправить note при следующей версии DBML | решение владельца 09.10.2026 (не выпускать версию DBML ради note); arm-core #87, arm-scan-gateway #26, arm-ka-docs #84 | DBML `recognition_job`, `05-domain-rules.md` §9.4 | **закрыт 09.10.2026:** note исправлен в DBML v5.18 (docs #90) | | OQ-160 | Целевая модель версий консолидации (владелец, 09.10.2026): несколько рабочих версий одного периода с **разным периметром** делят первичку (рабочий стол консоли, `stored_file.consolidation_id`); после `VERIFIED` новая версия (`previous_version_id`) может менять документы при **том же** периметре. Ядро сейчас создаёт только версию 1 (`POST /consolidations`), «новая версия» и параллельные версии не реализованы. Нужны правила: создание второй рабочей версии (обязательно другой периметр?), создание версии после `VERIFIED` (копия периметра, подхват привязок), что видит панель [39] у верифицированной версии до Среза 7 (ЕХ) | brainstorming docs #90, `openspec/changes/console-files/design.md` R-6, R-7 | срез «версии консолидации» (после Среза 4), Срез 7 | открыт: модель файлов совместима; реализация — отдельный срез | -| OQ-161 | Документ, период которого не совпадает с периодом консолидации, молча не привязывается к версии: ручное подтверждение проходит (200), а `fits` (`period_year` = год версии, D-5 Среза 4) его отбрасывает, `period_check` остаётся `UNKNOWN` (OQ-120) — свод пуст без объяснения (владелец 12.10.2026: ОСВ за 1 кв. 2025 в консолидации 2026 Q1). Период ОСВ берётся из шапки и через API не правится. Нужно ли (1) предупреждение «документ не подходит ни одной версии» при загрузке или подтверждении, (2) правка периода документа аналитиком (рядом с первичкой, как `original_*`), (3) постоянный режим «период из консолидации» для файлов, загруженных в неё | разбор владельца 12.10.2026; RSHB/arm-core#103 | `fits`, свод, чек-лист (§2, §9.3), карточка документа | **временное допущение (решение владельца 12.10.2026):** настройка `CONSOLIDATION_PERIOD_FROM_VERSION` (по умолчанию `false`; в контуре — `OPENBAO__APP__CONSOLIDATION_PERIOD_FROM_VERSION`) — ОСВ, загруженная в консолидацию (`stored_file.consolidation_id`), считается нарастающей за год и квартал консолидации для привязки, свода, чек-листа и колонки «ОСВ»; документ не меняется; ББ/ОФР и файлы с рабочего стола — по шапке; склейки кварталов нет (один слот на счёт ЮЛ). Только для тестов; открыт выбор постоянного решения (1)–(3), после него режим снять | +| OQ-161 | Документ, период которого не совпадает с периодом консолидации, молча не привязывается к версии: ручное подтверждение проходит (200), а `fits` (`period_year` = год версии, D-5 Среза 4) его отбрасывает, `period_check` остаётся `UNKNOWN` (OQ-120) — свод пуст без объяснения (владелец 12.10.2026: ОСВ за 1 кв. 2025 в консолидации 2026 Q1). Период ОСВ берётся из шапки и через API не правится. Нужно ли (1) предупреждение «документ не подходит ни одной версии» при загрузке или подтверждении, (2) правка периода документа аналитиком (рядом с первичкой, как `original_*`), (3) постоянный режим «период из консолидации» для файлов, загруженных в неё | разбор владельца 12.10.2026; RSHB/arm-core#103 | `fits`, свод, чек-лист (§2, §9.3), карточка документа | **временное допущение (решение владельца 12.10.2026):** настройка `CONSOLIDATION_PERIOD_FROM_VERSION` (по умолчанию `false`; в контуре — `OPENBAO__APP__CONSOLIDATION_PERIOD_FROM_VERSION`) — ОСВ, загруженная в консолидацию (`stored_file.consolidation_id`) и не подходящая ей по периоду шапки, считается нарастающей за год и квартал консолидации для привязки, свода, чек-листа и колонки «ОСВ»; документ не меняется; ББ/ОФР и файлы с рабочего стола — по шапке; склейки кварталов нет (один слот на счёт ЮЛ). Только для тестов; открыт выбор постоянного решения (1)–(3), после него режим снять | Служебные идентификаторы в DBML/аналитике: `ANL-nnn` — замечания аналитика к макету; `ARCH-nnn` — архитектурные решения; `DECISION-n` — решения по модели; `FIX-nn` — исправления дефектов v4. diff --git a/dev/qa-guide.md b/dev/qa-guide.md index 80c2bf5..874f43b 100644 --- a/dev/qa-guide.md +++ b/dev/qa-guide.md @@ -732,11 +732,12 @@ Q3-only — `missing_quarters = ["Q1","Q2"]`. произвольных ОСВ есть временный режим `CONSOLIDATION_PERIOD_FROM_VERSION=true` (arm-core#103): в `api/.env` локально, в контуре — `OPENBAO__APP__CONSOLIDATION_PERIOD_FROM_VERSION=true`; после смены — перезапуск ядра. -В режиме ОСВ, **загруженная в консолидацию** (через версию, а не с рабочего стола), считается нарастающей за год и квартал -консолидации: подтверждение привязывает её, свод, чек-лист и колонка «ОСВ» периметра её видят. Что учесть: +В режиме ОСВ, **загруженная в консолидацию** (через версию, а не с рабочего стола), период шапки которой консолидации **не +подходит**, считается нарастающей за год и квартал консолидации: подтверждение привязывает её, свод, чек-лист и колонка «ОСВ» +периметра её видят. ОСВ «своего» периода режим не трогает — квартальные склеиваются как обычно. Что учесть: -1. **Один файл на счёт ЮЛ.** Склейки кварталов нет: все ОСВ одного счёта одного ЮЛ в консолидации — один слот, в своде будет - подтверждённая последней. Грузите одну ОСВ на счёт (лучше нарастающую за весь период). +1. **Один файл «чужого» периода на счёт ЮЛ.** У подменённых ОСВ склейки кварталов нет: все они по одному счёту одного ЮЛ — + один слот, в своде будет подтверждённая последней. Грузите одну ОСВ на счёт (лучше нарастающую за весь период). 2. **Подтвердить всё нужное.** Документы `NEEDS_CHECK` (в т. ч. из-за чужого ЮЛ в шапке, `counterparty_check = MISMATCH`) в свод не идут, пока их не подтвердили. 3. **Документы, подтверждённые до включения режима**, сами не перепривязываются: уберите ЮЛ из периметра и верните (подхват -- 2.47.2 From 28bb9112c7425a1c968743f63eacd226068c3e25 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Mon, 12 Oct 2026 19:44:37 +0400 Subject: [PATCH 3/3] =?UTF-8?q?docs(qa-guide):=20=D0=BF=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D0=BF=D1=80=D0=B8=D0=B2=D1=8F=D0=B7=D0=BA=D0=B0=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B8=20=D0=BF=D0=B5=D1=80=D0=B8=D0=BC=D0=B5=D1=82=D1=80=D0=B5?= =?UTF-8?q?=20=D0=B8=D0=B7=20=D0=B4=D0=B2=D1=83=D1=85=20=D0=AE=D0=9B,=20?= =?UTF-8?q?=D1=80=D0=B5=D0=B7=D1=83=D0=BB=D1=8C=D1=82=D0=B0=D1=82=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B8=20=D0=BD=D0=B0=20?= =?UTF-8?q?=D1=81=D1=82=D0=B5=D0=BD=D0=B4=D0=B5=20(#96)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- dev/qa-guide.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/dev/qa-guide.md b/dev/qa-guide.md index 874f43b..90503fe 100644 --- a/dev/qa-guide.md +++ b/dev/qa-guide.md @@ -741,7 +741,10 @@ Q3-only — `missing_quarters = ["Q1","Q2"]`. 2. **Подтвердить всё нужное.** Документы `NEEDS_CHECK` (в т. ч. из-за чужого ЮЛ в шапке, `counterparty_check = MISMATCH`) в свод не идут, пока их не подтвердили. 3. **Документы, подтверждённые до включения режима**, сами не перепривязываются: уберите ЮЛ из периметра и верните (подхват - `PUT …/members`) либо создайте консолидацию заново. + `PUT …/members` под своей блокировкой версии) либо создайте консолидацию заново. Периметр — не меньше двух ЮЛ + (`PERIMETER_TOO_SMALL`), поэтому при двух участниках меняйте ЮЛ на временное третье той же ГК и обратно: + `{А, Б} → {Б, В} → {А, Б} → {А, В} → {А, Б}` (проверено на стенде 12.10.2026: РБ 2026 Q1 из ОСВ за 1 кв. 2025 — 16 документов + привязаны, свод 1421 строка, суммы равны своду РБ 2025 Q1 из тех же файлов). 4. Карточка документа по-прежнему показывает период из шапки — это не баг. ББ/ОФР режим не затрагивает. ## 8. Сквозной сценарий в UI (arm-web) -- 2.47.2