# Диаграммы в md2gost — справочник нотаций Конвертер сам отрисовывает исходники диаграмм и вставляет их как Рисунок. Экспортировать схему в PNG вручную не нужно и вредно: картинка не пересобирается при правке. --- ## 1. Общие правила ```markdown Диаграмма прецедентов приведена на @Рисунок:uc_main. %uc_main Диаграмма прецедентов ``` …и сразу после — fenced-блок с исходником. | Элемент | Правило | |---------|---------| | Метка и подпись | строка `%id Подпись` **перед** блоком | | Ссылка в тексте | `@Рисунок:id` в предложении **до** блока | | `id` | латиница, цифры, `_`; начинается с буквы; без дефисов | | `+listing` в подписи | дополнительно выводит исходник схемы как Листинг со своим номером | | `+landscape` в подписи | размещает рисунок на альбомной странице | Подпись не должна содержать самостоятельных слов `listing` и `landscape` — они будут вырезаны как флаги. Внутри блоков диаграмм типографская автозамена **не** работает, поэтому двойные кавычки и дефисы в синтаксисе схем сохраняются как есть. Это единственные защищённые блоки: в блоках кода кавычки заменяются. --- ## 2. Таблица оградок | Оградка | Тело | Движок | |---------|------|--------| | ` ```uml `, ` ```plantuml ` | полный PlantUML с `@startuml` … `@enduml` | PlantUML | | ` ```uml-c4 `, ` ```c4 ` | макросы C4 Container, без обёртки | PlantUML + stdlib C4 | | ` ```uml-c4context ` | макросы C4 System Context | PlantUML + stdlib C4 | | ` ```uml-c4component ` | макросы C4 Component | PlantUML + stdlib C4 | | ` ```usecase `, ` ```uml-usecase ` | `actor`, `usecase`, связи, без обёртки | PlantUML | | ` ```archimate `, ` ```uml-archimate ` | макросы ArchiMate 3.2, без обёртки | PlantUML + stdlib ArchiMate | | ` ```mermaid `, ` ```mmd ` | синтаксис Mermaid | локальный Mermaid или Kroki | | ` ```idef0 `, ` ```uml-idef0 ` | DSL IDEF0 | локальный рендер (Pillow) | | ` ```dfd `, ` ```uml-dfd `, ` ```data-flow-diagram `, ` ```yourdon ` | DSL потоков данных (Йордон) | Graphviz или Kroki | | ` ```dfd-gs `, ` ```gane-sarson ` | DSL потоков данных (Гейн–Сарсон) | локальный рендер (Pillow) | Правило про обёртку: в ` ```uml ` пишешь `@startuml` … `@enduml` **обязательно**; в схемах (`c4`, `usecase`, `archimate` и любых из `md2gost.schemes.json`) — **никогда**, схема подставит обёртку и `!include` сама. --- ## 3. PlantUML: готовые каркасы ### Диаграмма прецедентов ~~~markdown %uc_main Диаграмма прецедентов системы ```uml @startuml left to right direction skinparam packageStyle rectangle actor "Студент" as student actor "Преподаватель" as teacher actor "Администратор" as admin rectangle "Портал заявок" { usecase "Подать заявку" as UC1 usecase "Проверить статус" as UC2 usecase "Согласовать заявку" as UC3 usecase "Аутентифицироваться" as UC4 usecase "Управлять справочниками" as UC5 } student --> UC1 student --> UC2 teacher --> UC3 admin --> UC5 UC1 ..> UC4 : <> UC3 ..> UC4 : <> @enduml ``` ~~~ ### Диаграмма классов ~~~markdown %class_domain Диаграмма классов предметной области ```uml @startuml skinparam classAttributeIconSize 0 class Request { - id: int - createdAt: datetime - status: Status + submit(): void + cancel(): void } class Client { - id: int - name: str - inn: str } enum Status { NEW IN_PROGRESS DONE } class RequestService { + create(client: Client): Request + close(request: Request): void } Client "1" *-- "0..*" Request Request --> Status RequestService ..> Request @enduml ``` ~~~ ### Диаграмма последовательности ~~~markdown %seq_submit Последовательность обработки заявки ```uml @startuml autonumber actor Студент as s participant "Веб-клиент" as web participant "Сервис заявок" as api database "PostgreSQL" as db s -> web : заполняет форму web -> api : POST /requests api -> db : INSERT request db --> api : id api --> web : 201 Created web --> s : номер заявки @enduml ``` ~~~ ### Диаграмма деятельности ~~~markdown %act_flow Алгоритм обработки заявки ```uml @startuml start :Принять заявку; if (Данные полные?) then (да) :Зарегистрировать; :Назначить исполнителя; else (нет) :Вернуть на доработку; stop endif :Исполнить заявку; :Уведомить клиента; stop @enduml ``` ~~~ ### Диаграмма состояний ~~~markdown %state_req Состояния заявки ```uml @startuml [*] --> Новая Новая --> ВРаботе : назначен исполнитель ВРаботе --> Исполнена : работы завершены ВРаботе --> Отклонена : отказ Исполнена --> [*] Отклонена --> [*] @enduml ``` ~~~ ### ER-диаграмма ~~~markdown %erd_main Логическая модель данных ```uml @startuml hide circle skinparam linetype ortho entity "Клиент" as client { * id : bigint <> -- * name : varchar(255) inn : varchar(12) } entity "Заявка" as request { * id : bigint <> -- * client_id : bigint <> * created_at : timestamp * status : varchar(32) } entity "Позиция заявки" as item { * id : bigint <> -- * request_id : bigint <> * product : varchar(255) * qty : int } client ||--o{ request request ||--o{ item @enduml ``` ~~~ ### Диаграмма компонентов и развёртывания ~~~markdown %deploy_prod Схема развёртывания ```uml @startuml node "Сервер приложений" { component "API заявок" as api component "Планировщик" as sched } node "Сервер БД" { database "PostgreSQL" as db } node "Рабочее место" { component "Браузер" as browser } browser --> api : HTTPS api --> db : SQL sched --> db : SQL @enduml ``` ~~~ --- ## 4. C4 Три уровня — три оградки. В теле только макросы; обёртка и `!include` добавляются схемой. ### Уровень 1: контекст ~~~markdown %c4ctx Диаграмма контекста системы ```uml-c4context Person(student, "Студент", "Подаёт заявки и отслеживает статус") Person(staff, "Сотрудник деканата", "Обрабатывает заявки") System(portal, "Портал заявок", "Приём и обработка заявок студентов") System_Ext(sso, "Корпоративный SSO", "Единая аутентификация") System_Ext(mail, "Почтовый сервис", "Уведомления") Rel(student, portal, "Подаёт заявку", "HTTPS") Rel(staff, portal, "Обрабатывает заявки", "HTTPS") Rel(portal, sso, "Аутентифицирует пользователей", "OIDC") Rel(portal, mail, "Отправляет уведомления", "SMTP") ``` ~~~ ### Уровень 2: контейнеры ~~~markdown %c4cont Диаграмма контейнеров +landscape ```uml-c4 Person(student, "Студент", "Подаёт заявки") System_Boundary(portal, "Портал заявок") { Container(spa, "Веб-приложение", "React", "Интерфейс пользователя") Container(api, "Сервис заявок", "FastAPI", "Бизнес-логика и валидация") Container(worker, "Обработчик очереди", "Python", "Асинхронные задачи") ContainerDb(db, "Основная БД", "PostgreSQL", "Заявки, клиенты, история") ContainerDb(queue, "Очередь", "RabbitMQ", "Задачи на обработку") } System_Ext(sso, "Корпоративный SSO", "Аутентификация") Rel(student, spa, "Работает с заявками", "HTTPS") Rel(spa, api, "Вызывает методы", "REST/JSON") Rel(api, db, "Читает и пишет", "SQL") Rel(api, queue, "Публикует задачи", "AMQP") Rel(worker, queue, "Читает задачи", "AMQP") Rel(worker, db, "Обновляет статусы", "SQL") Rel(spa, sso, "Аутентифицируется", "OIDC") ``` ~~~ ### Уровень 3: компоненты ~~~markdown %c4comp Компоненты сервиса заявок ```uml-c4component Container_Boundary(api, "Сервис заявок") { Component(ctrl, "Контроллер заявок", "FastAPI Router", "Обработка HTTP-запросов") Component(svc, "Служба заявок", "Python", "Правила обработки и переходы статусов") Component(repo, "Репозиторий заявок", "SQLAlchemy", "Доступ к данным") Component(auth, "Модуль авторизации", "Python", "Проверка прав по роли") } ContainerDb(db, "Основная БД", "PostgreSQL", "Заявки и клиенты") Rel(ctrl, auth, "Проверяет права") Rel(ctrl, svc, "Вызывает") Rel(svc, repo, "Читает и пишет") Rel(repo, db, "SQL-запросы") ``` ~~~ ### Основные макросы C4 | Макрос | Назначение | |--------|------------| | `Person(alias, "Имя", "Описание")` | пользователь-человек | | `Person_Ext(...)` | внешний пользователь | | `System(alias, "Имя", "Описание")` | система целиком | | `System_Ext(...)` | внешняя система | | `System_Boundary(alias, "Имя") { … }` | граница системы | | `Container(alias, "Имя", "Технология", "Описание")` | контейнер | | `ContainerDb(...)`, `ContainerQueue(...)` | база данных, очередь | | `Container_Boundary(alias, "Имя") { … }` | граница контейнера | | `Component(alias, "Имя", "Технология", "Описание")` | компонент | | `Rel(from, to, "Действие", "Технология")` | связь | | `Rel_U/D/L/R(...)` | связь с направлением раскладки | | `LAYOUT_WITH_LEGEND()`, `LAYOUT_TOP_DOWN()`, `LAYOUT_LEFT_RIGHT()` | раскладка | Правила качества: описания на русском, технологии — как принято (`PostgreSQL`, `React`); один уровень абстракции на диаграмму; 6–15 элементов; связи подписаны действием, а не «использует». --- ## 5. Mermaid Идёт через локальный рендер (системный Chrome/Edge, Playwright Chromium или QuickJS) либо через Kroki. ~~~markdown %mmd_flow Схема процесса согласования ```mermaid flowchart TD A[Заявка поступила] --> B{Данные полные?} B -- да --> C[Регистрация] B -- нет --> D[Возврат на доработку] C --> E[Назначение исполнителя] E --> F[Исполнение] F --> G[Уведомление клиента] D --> A ``` ~~~ Поддерживаются `flowchart`, `sequenceDiagram`, `classDiagram`, `stateDiagram-v2`, `erDiagram`, `gantt`, `journey`, `pie`. Для отчёта по ГОСТ надёжнее PlantUML: Mermaid требует браузера или сети. --- ## 6. IDEF0 (FIPS 183) Оградка ` ```idef0 `. Тело — не XML и не PlantUML, а собственный DSL. Рендер локальный, Java и сеть не нужны. ### Шапка формы | Ключ | Значение | |------|----------| | `title` | название диаграммы | | `node` | узел: `A-0`, `A0`, `A1` | | `number` | номер листа | | `author`, `project`, `date`, `rev` | поля NIST-формы | | `status` | `WORKING`, `DRAFT`, `RECOMMENDED`, `PUBLICATION` | | `context` | `TOP` для контекстной A-0, иначе родительский узел | | `purpose`, `viewpoint` | цель и точка зрения модели | | `used_at`, `reader`, `reader_date`, `notes`, `page` | необязательные поля формы | | `form` | `kit` (по умолчанию, с рамкой) или `plain` | ### Боксы и стрелки | Запись | Смысл | |--------|-------| | `[A0] Имя функции` или `box A0 Имя` | бокс функции | | `<- Название` или `in` | вход (слева) | | `^ Название` или `control` | управление (сверху) | | `-> Название` или `out` | выход (справа) | | `v Название` или `mech` | механизм (снизу) | | `A1 <- Заявка [I1]` | явное указание бокса и код ICOM | | `A1 -> A2 : план закупок` | внутренняя связь между боксами | | `A1 -> A2.C : график` | связь в конкретный порт (`.I`, `.C`, `.O`, `.M`) | | `A1, A2, A3 ^ Регламент [C1]` | одна стрелка в несколько боксов | | `(in Секрет` | туннель на границе листа | | `in) Локальный` | туннель у бокса | | `call ИмяМодели` | вызов другой модели | Стрелки без явного бокса относятся к последнему объявленному боксу. ### Контекстная диаграмма A-0 ~~~markdown %idef_a0 Контекстная диаграмма A-0 ```idef0 title Распорядиться товаром node A-0 number 1 author Иванов И. И. project Модель торгового предприятия date 08.02.2026 status PUBLICATION context TOP [A0] Распорядиться товаром <- Спрос ^ Нормативная документация -> Товар v Персонал ``` ~~~ ### Декомпозиция A0 ~~~markdown %idef_a0d Декомпозиция A0 ```idef0 title Распорядиться товаром node A0 number 2 author Иванов И. И. project Модель торгового предприятия context A-0 purpose Обеспечить наличие товара и его отпуск покупателю viewpoint Руководитель торгового предприятия [A1] Принять и оценить спрос [A2] Закупить и хранить [A3] Отгрузить товар A1 <- Спрос [I1] A2 <- Предложения поставщиков [I2] A1, A2, A3 ^ Нормативная документация [C1] A1 ^ Ассортиментная политика [C2] A3 ^ Условия поставки [C3] A1 -> A2 : план закупок A1 -> A2.C : график поставок A2 -> A3 : товар к отгрузке A3 -> Товар [O1] A3 -> Акт отгрузки [O2] A1, A2, A3 v Персонал [M1] A2 v Склад [M2] ``` ~~~ Правила нотации: контекстная диаграмма — ровно один бокс; в декомпозиции 3–6 боксов «лесенкой» слева-сверху вниз-вправо; подписи стрелок — существительные; управление приходит сверху, механизм снизу. --- ## 7. DFD (диаграммы потоков данных) Оградка ` ```dfd `. Синтаксис пакета `data-flow-diagram`. Рендер через Graphviz (вшитый, из `PATH` или скачанный) либо Kroki. ### Узлы и потоки | Ключевое слово | Смысл | |----------------|-------| | `process Имя Подпись` | процесс | | `entity Имя Подпись` | внешняя сущность | | `store Имя Подпись` | хранилище данных | | `control Имя Подпись` | элемент управления | | `channel Имя Подпись` | канал | | `style context` | оформление контекстной диаграммы | | Поток | Смысл | |-------|-------| | `A --> B подпись` | поток данных | | `A ->> B подпись` | двойной поток | | `A <-> B подпись` | двунаправленный | | `A ::> B подпись` | сигнал | ### Контекстная диаграмма ~~~markdown %dfd_ctx Контекстная диаграмма потоков данных ```dfd style context entity Client Клиент entity Warehouse Склад process System Система учёта заявок Client --> System заявка System --> Client статус заявки System --> Warehouse накладная ``` ~~~ ### Диаграмма нулевого уровня ~~~markdown %dfd_l0 Диаграмма потоков данных нулевого уровня ```dfd entity Client Клиент entity Warehouse Склад process Accept Принять заявку process Register Зарегистрировать заявку process Ship Сформировать накладную store Orders Заявки store Log Журнал операций Client --> Accept заявка Accept --> Orders новая заявка Orders --> Register данные заявки Register --> Log запись об изменении Register --> Ship подтверждённая заявка Ship --> Warehouse накладная Ship --> Client уведомление ``` ~~~ Правила нотации: на контекстной диаграмме один процесс; хранилища не соединяются напрямую с внешними сущностями; каждый процесс имеет и вход, и выход. ### Гейн–Сарсон Оградка ` ```dfd-gs ` (то же: ` ```gane-sarson `, ` ```uml-dfd-gs `). Те же `entity` / `process` / `store` и `A --> B подпись`, но фигуры другие: сущность — прямоугольник с тенью и номером, процесс — скруглённый прямоугольник с номером внизу справа, хранилище — прямоугольник с полосой и кодом `D1`. Рендер локальный, Graphviz не нужен. Номер процесса — сам id, если это `1` или `3.1`, иначе порядок объявления. Код хранилища — id вида `D2`, иначе `D1`, `D2`, … по порядку. У сущности номер в углу — порядок объявления. Шапка листа, как у Ramus: `title`, `node`, `number`, `author`, `project`, `date`, `rev`, `status`, `used_at`. `form kit` (по умолчанию, со штампом) или `form plain`. Раскладка сама: сущности слева, процессы в центре, хранилища справа. Стрелка между соседними колонками идёт по зазору. Координат в тексте нет. ~~~markdown %dfd_gs Приёмка работы ```dfd-gs title Зафиксировать решение приёмки node A44 number 1 author Иванов И. И. project ИС ArtFreelance entity Artist Художник process 1 Принять файлы результата store D2 Файлы работ Artist --> 1 файлы работы 1 --> D2 превью и хеш ``` ~~~ --- ## 8. Что нужно для отрисовки | Нотация | Требования | Запасной вариант | |---------|------------|------------------| | PlantUML, C4, ArchiMate, Use Case | Java и `plantuml.jar` (вшит в exe-сборку) | локальный Kroki, затем `kroki.io` при `--diagram-fallback remote` | | Mermaid | системный Chrome или Edge; либо скачанный Chromium; либо QuickJS | Kroki | | IDEF0 | ничего, локальный рендер | не требуется | | DFD (Йордон, ` ```dfd `) | Graphviz (вшитый, из `PATH` или кнопка «Скачать Graphviz») | Kroki | | DFD Гейна–Сарсона (` ```dfd-gs `) | ничего, локальный рендер | не требуется | Ключи: `--plantuml-jar`, `--kroki-url`, `--diagram-fallback local|remote|off`, `--diagram-format png|svg`, `--diagram-scale N` (по умолчанию 2 — качество растра). Кэш готовых картинок — каталог `.md2gost-cache` рядом с `.md`; при правке исходника схемы картинка пересобирается автоматически. --- ## 9. Иерархическая оргсхема и читаемость Рисунок, который нельзя прочитать при масштабе 100 % в Word, при проверке равен отсутствию рисунка. Широкие схемы помечай `+landscape`. Кегль подписей после вставки на лист — не меньше 10–11 пт. Если встроенный PlantUML или Mermaid даёт мелкую схему, сдавай PNG высокого разрешения. На оргмодели из одного узла выходит **одна** связь, затем развязка на подчинённых (горизонтальная шина). Пачка независимых линий `ceo -- a`, `ceo -- b`, `ceo -- c` — ошибка. Стрелки не используются. У каждого показанного отдела есть руководитель и специалисты операционного уровня. Нельзя оставлять бокс направления с одним специалистом или без людей. Должности обезличены. Каркас развязки: ```text [Родитель] | ---------+--------- | | | [Доч.1] [Доч.2] [Доч.3] ``` Карта процессов верхнего уровня — группы без стрелок последовательности. ## 10. Свои схемы Файл `md2gost.schemes.json` (рядом с приложением, рядом с `.md` или путь в `--schemes`) задаёт новые оградки: ```json { "bpmn_like": { "title": "Процессная схема", "docs": "Шпаргалка макросов для подсказки в интерфейсе", "ai-prompt": "Фрагмент, который дописывается в промпт для ИИ", "includes": ["https://example.org/macros.puml"], "prefix": "@startuml\n", "postfix": "\n@enduml", "theme": "" } } ``` `id` схемы: строчная латиница, цифры, `_`, начинается с буквы. После добавления доступны оградки ` ```bpmn_like ` и ` ```uml-bpmn_like `; в теле пишутся только макросы. Слои загрузки, где каждый следующий сильнее: встроенный шаблон → файл рядом с приложением → файл рядом с `.md` → `--schemes`.