502 lines
19 KiB
Markdown
502 lines
19 KiB
Markdown
# ТЗ — Accounting Analytics Layer Architecture
|
||
|
||
## 1. Назначение документа
|
||
|
||
Документ фиксирует архитектуру следующего слоя системы после успешного PoC runtime-моста к 1С.
|
||
|
||
Цель этапа:
|
||
- спроектировать **полный аналитический контур** поверх живого read-only runtime bridge;
|
||
- развести **live-доступ к 1С** и **тяжёлую аналитику**;
|
||
- исключить ошибочную архитектуру, при которой LLM в реальном времени пытается анализировать всю бухгалтерию напрямую через 1С;
|
||
- определить слои, режимы работы, refresh-модель, canonical schema, anomaly engine и роль ассистента.
|
||
|
||
---
|
||
|
||
## 2. Контекст
|
||
|
||
На предыдущем этапе подтверждён рабочий runtime semantic bridge к 1С:
|
||
- read-only контур поднят;
|
||
- доказаны цепочки `document -> posting -> account`;
|
||
- доказаны цепочки `posting -> subconto[1..3]`;
|
||
- доказана расшифровка saldo через движения;
|
||
- bridge принят со статусом `adopt with restrictions`.
|
||
|
||
Это означает:
|
||
- живой доступ к бухгалтерскому смыслу есть;
|
||
- но **полный аналитический контур нельзя строить как чатовый runtime-проход по всей 1С**;
|
||
- нужен отдельный слой аналитики, кэша, baseline, anomaly detection и исторического анализа.
|
||
|
||
---
|
||
|
||
## 3. Главный архитектурный принцип
|
||
|
||
Система должна быть разделена на **разные режимы работы**, а не пытаться решать всё одной и той же цепочкой `LLM -> 1С -> JSON -> LLM`.
|
||
|
||
### 3.1. Режим A — Live Query
|
||
Используется для:
|
||
- точечных запросов;
|
||
- drill-down;
|
||
- проверки одного факта;
|
||
- открытия документа;
|
||
- расшифровки проводки;
|
||
- объяснения сальдо;
|
||
- прохода по конкретной цепочке связей.
|
||
|
||
### 3.2. Режим B — Batch Analytics
|
||
Используется для:
|
||
- анализа всего периода;
|
||
- анализа всех счетов;
|
||
- поиска аномалий;
|
||
- сравнения закрытых и открытых периодов;
|
||
- поиска поведенческих паттернов;
|
||
- выявления разрывов, дыр, хвостов и коллизий;
|
||
- исторического анализа по месяцам/кварталам/годам.
|
||
|
||
### 3.3. Режим C — Interactive Assistant
|
||
Используется для общения с пользователем:
|
||
- понимает намерение;
|
||
- определяет, нужен live-доступ или уже есть готовый аналитический результат;
|
||
- маршрутизирует запрос;
|
||
- объясняет результат человеку.
|
||
|
||
---
|
||
|
||
## 4. Целевая архитектура
|
||
|
||
## Layer 1. 1С Source Layer
|
||
|
||
Источник истины:
|
||
- документы;
|
||
- проводки;
|
||
- регистры;
|
||
- планы счетов;
|
||
- субконто;
|
||
- остатки;
|
||
- обороты;
|
||
- закрытые и открытые периоды.
|
||
|
||
### Жёсткое правило
|
||
**Ничего в клиентскую 1С не пишем.**
|
||
- не редактируем документы;
|
||
- не проводим документы;
|
||
- не меняем регистры;
|
||
- не меняем конфигурацию ради аналитики;
|
||
- не строим операционный write-layer.
|
||
|
||
---
|
||
|
||
## Layer 2. Runtime Semantic Bridge
|
||
|
||
Основной live-мост к 1С.
|
||
|
||
На текущем этапе:
|
||
- `1c-mcp-toolkit`
|
||
- только read-only
|
||
- только локально / в изоляции
|
||
- без `execute_code`
|
||
- только approved read methods
|
||
|
||
### Назначение слоя
|
||
- читать метаданные;
|
||
- выполнять безопасные read-only запросы;
|
||
- читать документы, объекты, движения, счета, субконто;
|
||
- обеспечивать live drill-down по конкретным фактам.
|
||
|
||
### Не назначение слоя
|
||
- не использовать как движок тяжёлой аналитики по всей компании в реальном времени;
|
||
- не использовать как единственное хранилище семантики;
|
||
- не использовать как вычислительный комбайн для whole-slice анализа.
|
||
|
||
---
|
||
|
||
## Layer 3. Extraction / Refresh Layer
|
||
|
||
Контролируемый слой извлечения данных из 1С в аналитическое хранилище.
|
||
|
||
### Задачи
|
||
- запускать штатные extraction jobs;
|
||
- читать данные из 1С пакетно и инкрементально;
|
||
- формировать canonical payloads;
|
||
- обновлять аналитическое хранилище;
|
||
- минимизировать нагрузку на live-runtime.
|
||
|
||
### Режимы извлечения
|
||
1. **Initial Historical Load**
|
||
- первичная загрузка истории;
|
||
- по месяцам / кварталам / годам;
|
||
- по закрытым периодам.
|
||
|
||
2. **Incremental Refresh**
|
||
- догрузка изменений по открытому периоду;
|
||
- обновление новых и изменившихся документов и движений.
|
||
|
||
3. **Targeted Refresh**
|
||
- загрузка конкретного счета;
|
||
- загрузка конкретного контрагента;
|
||
- загрузка конкретного периода;
|
||
- загрузка конкретного документа.
|
||
|
||
### Требование
|
||
Extraction layer должен быть:
|
||
- воспроизводимым;
|
||
- логируемым;
|
||
- перезапускаемым;
|
||
- устойчивым к частичным сбоям.
|
||
|
||
---
|
||
|
||
## Layer 4. Canonical Accounting Store
|
||
|
||
Нормализованное хранилище бухгалтерского смысла.
|
||
|
||
Это не “снапшот ради снапшота”, а основной аналитический слой.
|
||
|
||
### Базовые сущности
|
||
- `Document`
|
||
- `Posting`
|
||
- `RegisterMovement`
|
||
- `Account`
|
||
- `SubcontoEntity`
|
||
- `Counterparty`
|
||
- `Contract`
|
||
- `Organization`
|
||
- `Item`
|
||
- `Warehouse`
|
||
- `Period`
|
||
- `BalanceSnapshot`
|
||
- `TurnoverSnapshot`
|
||
- `EntityState`
|
||
- `AnomalySignal`
|
||
- `RiskPattern`
|
||
|
||
### Базовые связи
|
||
- `Document -> creates -> Posting`
|
||
- `Posting -> debit -> Account`
|
||
- `Posting -> credit -> Account`
|
||
- `Posting -> hasSubconto1 -> SubcontoEntity`
|
||
- `Posting -> hasSubconto2 -> SubcontoEntity`
|
||
- `Posting -> hasSubconto3 -> SubcontoEntity`
|
||
- `Posting -> belongsTo -> Organization`
|
||
- `Posting -> belongsToPeriod -> Period`
|
||
- `Counterparty -> hasContract -> Contract`
|
||
- `Account -> hasBalanceSnapshot -> BalanceSnapshot`
|
||
- `Period -> hasTurnoverSnapshot -> TurnoverSnapshot`
|
||
|
||
### Требование
|
||
Canonical store должен быть:
|
||
- семантически стабильным;
|
||
- независимым от сырой структуры 1С;
|
||
- пригодным для SQL/graph/pattern-анализа;
|
||
- пригодным для feed в feature/anomaly engine.
|
||
|
||
---
|
||
|
||
## Layer 5. Feature Store / Analytics Store
|
||
|
||
Слой производных признаков, baseline и аналитических индикаторов.
|
||
|
||
### Что здесь хранится
|
||
- признаки по счетам;
|
||
- признаки по контрагентам;
|
||
- признаки по документам;
|
||
- частотные поведенческие паттерны;
|
||
- baseline по периодам;
|
||
- отклонения от baseline;
|
||
- anomaly flags;
|
||
- drift signals;
|
||
- risk score;
|
||
- derived relation signals.
|
||
|
||
### Примеры признаков
|
||
- нетипичная корреспонденция счетов;
|
||
- новый тип субконто в периоде;
|
||
- резкий рост активности по счету;
|
||
- аномальное увеличение оборота;
|
||
- повторяющиеся нестандартные проводки;
|
||
- контрагент, резко изменивший тип операций;
|
||
- хвосты и незакрытые цепочки;
|
||
- проводки, не похожие на исторический baseline.
|
||
|
||
---
|
||
|
||
## Layer 6. Analytical Engine
|
||
|
||
Вычислительный слой, который считает и сравнивает, но не является LLM.
|
||
|
||
### Что делает engine
|
||
- rule-based проверки;
|
||
- статистические проверки;
|
||
- anomaly detection;
|
||
- baseline modelling;
|
||
- drift analysis;
|
||
- pattern mining;
|
||
- graph analysis;
|
||
- scoring;
|
||
- объяснение причинности через расчётные модели.
|
||
|
||
### Что engine не делает
|
||
- не общается с пользователем напрямую;
|
||
- не генерирует красивый текст ответа;
|
||
- не выполняет роль conversational assistant.
|
||
|
||
### Режимы работы
|
||
- по расписанию;
|
||
- по ручному запуску;
|
||
- по триггеру;
|
||
- по событию;
|
||
- по запросу от assistant-layer, если нет свежего результата.
|
||
|
||
---
|
||
|
||
## Layer 7. Assistant / Orchestrator Layer
|
||
|
||
LLM-слой и логика маршрутизации.
|
||
|
||
### Роль слоя
|
||
- принимать пользовательский вопрос;
|
||
- определять тип вопроса;
|
||
- решать, где лежит ответ:
|
||
- в analytics store,
|
||
- в live bridge,
|
||
- или нужен новый batch-run;
|
||
- объяснять результат человеку.
|
||
|
||
### Что LLM не должна делать
|
||
- не должна перебирать всю 1С в реальном времени;
|
||
- не должна сама быть anomaly engine;
|
||
- не должна получать целиком весь срез компании в промпт;
|
||
- не должна по каждому тяжёлому вопросу инициировать полное живое сканирование 1С.
|
||
|
||
### Что LLM должна делать
|
||
- классифицировать вопрос;
|
||
- маршрутизировать запрос;
|
||
- выбирать инструменты;
|
||
- суммировать результаты;
|
||
- превращать аналитические факты в понятный ответ.
|
||
|
||
---
|
||
|
||
## 5. Почему нельзя делать всё через live bridge
|
||
|
||
### Проблема
|
||
Если делать всё как:
|
||
`LLM -> toolkit -> 1С -> JSON -> LLM`
|
||
|
||
то на тяжёлых вопросах система будет:
|
||
- медленной;
|
||
- дорогой;
|
||
- хрупкой;
|
||
- плохо воспроизводимой;
|
||
- чувствительной к latency;
|
||
- зависимой от размера данных и количества round-trip операций.
|
||
|
||
### Особенно плохо это работает для запросов типа:
|
||
- “проанализируй весь срез на сегодня”;
|
||
- “найди все аномалии по всем счетам”;
|
||
- “сравни компанию за 10 лет по месяцам”;
|
||
- “найди все техкомпании-прокладки и аномальные паттерны”.
|
||
|
||
### Следствие
|
||
Live bridge должен использоваться **точечно**, а тяжёлый анализ должен идти через отдельный аналитический слой.
|
||
|
||
---
|
||
|
||
## 6. Как должна работать система на практике
|
||
|
||
### Сценарий 1. Точечный вопрос
|
||
Пользователь:
|
||
> Что по счёту 68.02?
|
||
|
||
Маршрут:
|
||
1. assistant проверяет analytics store;
|
||
2. если есть готовый balance/anomaly context — использует его;
|
||
3. если нужен drill-down — идёт через runtime bridge;
|
||
4. возвращает объяснение.
|
||
|
||
### Сценарий 2. Массовый анализ
|
||
Пользователь:
|
||
> Проанализируй весь текущий срез и найди аномалии.
|
||
|
||
Маршрут:
|
||
1. assistant не идёт напрямую в 1С по всей базе;
|
||
2. проверяет, есть ли свежий batch-run;
|
||
3. если есть — отдаёт summary;
|
||
4. если нет — запускает analytic job;
|
||
5. после завершения показывает результаты и даёт drill-down.
|
||
|
||
### Сценарий 3. Историческое сравнение
|
||
Пользователь:
|
||
> Сравни поведение компании по кварталам за 5 лет.
|
||
|
||
Маршрут:
|
||
1. используются historical baseline и snapshots;
|
||
2. analytical engine считает изменения;
|
||
3. assistant объясняет выводы.
|
||
|
||
---
|
||
|
||
## 7. Модель обновления данных
|
||
|
||
### 7.1. Закрытые периоды
|
||
- загружаются один раз;
|
||
- считаются эталоном;
|
||
- меняются только по отдельному регламенту.
|
||
|
||
### 7.2. Открытые периоды
|
||
- обновляются инкрементально;
|
||
- по расписанию;
|
||
- по событию;
|
||
- по ручной кнопке;
|
||
- по запросу при необходимости.
|
||
|
||
### 7.3. Refresh granularity
|
||
Поддержать:
|
||
- period-level refresh;
|
||
- account-level refresh;
|
||
- document-level refresh;
|
||
- counterparty-level refresh.
|
||
|
||
---
|
||
|
||
## 8. Что хранить и что не хранить
|
||
|
||
### Хранить
|
||
- canonical facts;
|
||
- balance snapshots;
|
||
- turnover snapshots;
|
||
- derived features;
|
||
- anomaly signals;
|
||
- relation graph edges;
|
||
- baseline state;
|
||
- analytical summaries.
|
||
|
||
### Не хранить бездумно
|
||
- полный сырой JSON от каждого live-вызова навсегда;
|
||
- дубли всей 1С на каждый пользовательский запрос;
|
||
- полный срез компании в контексте LLM.
|
||
|
||
---
|
||
|
||
## 9. Технологический стек (рекомендуемый уровень)
|
||
|
||
### Runtime bridge
|
||
- `1c-mcp-toolkit`
|
||
|
||
### Extraction / jobs
|
||
- Python
|
||
- job runner / scheduler
|
||
- очередь задач по необходимости
|
||
|
||
### Canonical store
|
||
- PostgreSQL как основной store
|
||
|
||
### Heavy analytics
|
||
- DuckDB / Polars / Pandas для batch-прогонов
|
||
- при росте объёмов — возможен переход на более тяжёлый аналитический backend
|
||
|
||
### Assistant layer
|
||
- OpenAI / локальная LLM
|
||
- tool calling
|
||
- оркестрация между analytics store и runtime bridge
|
||
|
||
---
|
||
|
||
## 10. Ограничения безопасности
|
||
|
||
### Жёсткие ограничения
|
||
- только read-only доступ к 1С;
|
||
- никакого `execute_code`;
|
||
- никакой записи в 1С;
|
||
- никакой модификации конфигурации продовой 1С;
|
||
- endpoint не публикуется наружу;
|
||
- доступ только из локального / доверенного контура;
|
||
- отдельный технический пользователь 1С.
|
||
|
||
### Важно
|
||
Этот проект является **аналитической надстройкой**, а не операционным контуром.
|
||
|
||
---
|
||
|
||
## 11. Этапы реализации
|
||
|
||
## Stage 1. Фиксация runtime bridge
|
||
- зафиксировать `1c-mcp-toolkit` как основной live semantic bridge;
|
||
- описать approved methods;
|
||
- зафиксировать guardrails.
|
||
|
||
## Stage 2. Canonical schema
|
||
- спроектировать canonical accounting schema;
|
||
- описать сущности, связи, ключи и snapshots.
|
||
|
||
## Stage 3. Historical loader
|
||
- реализовать initial historical load;
|
||
- загрузить закрытые периоды;
|
||
- собрать baseline history.
|
||
|
||
## Stage 4. Incremental refresh
|
||
- реализовать обновление открытого периода;
|
||
- определить правила инкрементальной синхронизации.
|
||
|
||
## Stage 5. Feature / anomaly engine
|
||
- реализовать rule engine;
|
||
- реализовать baseline comparison;
|
||
- реализовать anomaly signals и risk patterns.
|
||
|
||
## Stage 6. Assistant orchestration
|
||
- реализовать маршрутизацию вопроса;
|
||
- выбор между analytics store и live bridge;
|
||
- сформировать интерактивный слой ответов.
|
||
|
||
---
|
||
|
||
## 12. Deliverables
|
||
|
||
На выходе этапа должны появиться:
|
||
|
||
1. `accounting_canonical_schema.md`
|
||
2. `analytics_store_design.md`
|
||
3. `refresh_strategy.md`
|
||
4. `historical_load_plan.md`
|
||
5. `incremental_refresh_plan.md`
|
||
6. `anomaly_engine_spec.md`
|
||
7. `assistant_orchestration_spec.md`
|
||
8. `security_guardrails_readonly.md`
|
||
|
||
---
|
||
|
||
## 13. Критерии приёмки
|
||
|
||
Этап считается успешным, если:
|
||
|
||
1. live bridge используется только для точечных запросов и drill-down;
|
||
2. тяжёлая аналитика вынесена в отдельный analytical layer;
|
||
3. закрытые периоды загружаются как baseline;
|
||
4. открытые периоды обновляются инкрементально;
|
||
5. аномалии и паттерны считаются вне LLM;
|
||
6. assistant отвечает быстро на типовые вопросы за счёт analytics store;
|
||
7. assistant может идти в live bridge только по необходимости;
|
||
8. система не требует write-доступа в 1С.
|
||
|
||
---
|
||
|
||
## 14. Резюме
|
||
|
||
`1c-mcp-toolkit` решает важнейшую задачу:
|
||
он даёт **живой runtime semantic bridge** к 1С.
|
||
|
||
Но он **не должен** быть единственным аналитическим слоем.
|
||
|
||
Полный аналитический контур строится так:
|
||
|
||
**1С -> Runtime Semantic Bridge -> Canonical Accounting Store -> Feature / Anomaly Engine -> Assistant Orchestrator**
|
||
|
||
И рядом:
|
||
**1С -> OData Discovery Layer**
|
||
|
||
Именно такая архитектура:
|
||
- масштабируется;
|
||
- не убивает производительность;
|
||
- не делает LLM вычислительным ядром;
|
||
- позволяет анализировать большие срезы, периоды и паттерны;
|
||
- сохраняет живой доступ к актуальной 1С для точечных drill-down сценариев.
|