Дверная система ARLINE — архитектура

Сущности, слои и процессы нового DoorSys после решений ДАРа 21–22.10.2026: один прототип, своя карточка редактирования, отдельный редактор составов, правила — из технологических описаний систем, геометрия — по оракулу LeroyProtoLIB.

Контур: внутренний
Версия 1.0 · 22.10.2026 15:12
Координатор: arline-1d
Статус: концепция к обсуждению

0Концепция в пяти пунктах

1Слои и компоненты

Стрелки — направление зависимости и потока данных. Пунктир — сверка, а не вызов.

flowchart LR
  subgraph USER["Пользователь"]
    W["Мастер установки<br/>команда меню + ниша mbget door"]
    C["Карточка системы<br/>C# CardForm, модально"]
    R["Редактор составов<br/>аналог DoorSys63Form07"]
  end
  subgraph BRIDGE["Мост UI ↔ Python"]
    SH["shim.c + Entry.cs<br/>ProtoDLL, protoobj edit"]
    CB["card_bridge.py<br/>JSON в %TEMP%"]
  end
  subgraph DOMAIN["Предметная логика · чистый Python, без k3"]
    SPEC["DoorSystemSpec<br/>DoorSpec v2"]
    FG["flapgraph<br/>граф делителей, округление"]
    RULES["Правила систем<br/>формулы описаний"]
    RES["Резолвер ролей<br/>контракт 083 §4"]
    CAT["catalog083<br/>носители справочника"]
  end
  subgraph BUILD["Построение в K3"]
    BLD["mDoorSysLIB<br/>system_props_from_spec"]
    PARTS["Узлы: трек · створка · фурнитура"]
    RX["reactor<br/>reconcile + K3Renderer"]
  end
  subgraph DATA["Данные"]
    NG[("Справочник K3<br/>СИС · СЕЧ · РОЛ · СНП")]
    ATTR[("Атрибут прототипа<br/>DoorSpec v2")]
  end
  ORA["Оракул LeroyProtoLIB<br/>DoorSysLM → DOORS63"]
  W --> SH
  C --> SH
  SH --> CB --> SPEC
  CB --> FG
  R --> CAT
  SPEC --> FG
  SPEC --> RULES
  SPEC --> RES --> CAT --> NG
  SPEC --> BLD
  FG --> BLD
  RES --> BLD
  BLD --> PARTS --> RX --> SCENE["Сцена K3<br/>один объект системы"]
  BLD --> ATTR
  SCENE -.-> ORA
  

2Сущности предметной области

Левая часть — каталог (что бывает), правая — экземпляр (что стоит в заказе). Связь между ними — ссылка экземпляра на систему каталога.

classDiagram
  direction LR
  class Система {
    СИС · NGoods вид 98
    зазоры SlipTop/Bot/Left/Right/Doors
    тип движения TypeFlap
    пределы ширины и высоты
    наложение створок
  }
  class Сечение {
    СЕЧ · NGoods
    назначение uDS_Function
    геометрия ProfileType
    w h s zh zw zhg Nbreak K3File
  }
  class Роль {
    РОЛ · NGoods
    закон расстановки FixOrder
    смещения FixDetail
    режим установки install_mode
    маска типов створки
    отдельной строкой IsCalc
  }
  class СистемаНаправляющих {
    СНП · «Italum 34»
    номинал uDS_SizeRail
    сечения трека верх/низ по рядам
  }
  class Артикул {
    позиция номенклатуры
    цвет uProfColor
    модель k3file, вес
    потомки ParentID
  }
  class ЦветПрофиля {
    Г1: цвет профиля → цвет комплектующих
  }
  Система "1" --> "*" Сечение : состав
  Система "1" --> "*" Роль : фурнитура
  Система "1" --> "1" СистемаНаправляющих
  Сечение "1" --> "*" Артикул : палитра ListMat
  Роль "1" --> "*" Артикул : кандидаты ListMat
  Артикул --> ЦветПрофиля

  class ДвернаяСистема {
    один прототип в сцене
    атрибут DoorSpec v2
  }
  class Проём {
    x1 y1 z1
    анкер xb yb zb
    из ниши mbget door + отступы
  }
  class Направляющая {
    ряд, верх/низ
    длина = ширина проёма − 1
  }
  class Створка {
    номер, ручей, сторона
    габарит по правилам системы
  }
  class Раскладка {
    граф делителей
    устойчивые id
  }
  class Делитель {
    H или V
    врезной или накладной
    позиция в мм
  }
  class Секция {
    устойчивый id
    пакет вставки или наследует общий
  }
  class ГруппаДеления {
    разделить на N
    умное округление
  }
  class ПакетВставки {
    слои от A к F
    материал, толщина 4/8/10
    отделки
  }
  class Фурнитура {
    роль → артикул
    ролики, стопор, шлегель, доводчик
  }
  ДвернаяСистема "1" --> "1" Проём
  ДвернаяСистема "1" --> "1..*" Направляющая
  ДвернаяСистема "1" --> "2..8" Створка
  ДвернаяСистема ..> Система : тип из каталога
  Створка "1" --> "1" Раскладка
  Раскладка "1" --> "*" Делитель
  Раскладка "1" --> "1..*" Секция
  Раскладка "1" --> "*" ГруппаДеления
  Секция "1" --> "0..1" ПакетВставки
  Створка "1" --> "*" Фурнитура
  Фурнитура ..> Роль : резолв
  

3Редактирование экземпляра — карточка системы

Основа уже есть у Дениса: tools/doorsys_proto_card — shim.c, Entry.cs, CardForm.cs, K3Python.cs. Пересчёт идёт в Python, пока форма открыта; сцена перестраивается после «ОК».

sequenceDiagram
  actor П as Пользователь
  participant K3 as K3
  participant SH as shim + Entry.cs
  participant F as CardForm (C#)
  participant PY as card_bridge.py + doorsys
  participant RX as reactor
  П->>K3: двойной клик по системе
  K3->>SH: protoobj edit → ProtoDLL
  SH->>PY: прочитать DoorSpec v2 из атрибута
  PY-->>F: модель вкладок: Система · Трек · Створка 1..N
  loop каждая правка в форме
    П->>F: делитель, материал, число створок
    F->>PY: edit(правка, контекст формы)
    PY-->>F: новая раскладка, размеры, предупреждения
  end
  П->>F: ОК
  F-->>SH: результат, K3 получает «отмену»
  SH->>PY: post_later: применить
  PY->>RX: reconcile одного прототипа
  RX->>K3: изменить только затронутые узлы
  

Двойной клик по створке должен открывать вкладку этой створки — без доработки ядра у вендора. Способ ещё не выбран: K3 не передаёт в колбэк, какой ребёнок кликнут; искать обходной путь на нашей стороне.

4Редактор составов систем

Что он ведёт

  • системы и их состав: сечения, роли, направляющие;
  • палитры профилей и кандидаты фурнитуры по цвету;
  • законы расстановки и смещения фурнитуры;
  • зазоры, пределы, наложения, правила вставок 4/8/10 мм;
  • историю изменений и проверку целостности до записи.

Как пишет

  • в штатный справочник K3, одной транзакцией;
  • по результату спайка DS-10: своё соединение, проверка каждого оператора, затем nprefresh;
  • предметная логика — общий Python с построителем, чтобы редактор и построение видели одно и то же;
  • обновления — через k3upd, помощь F1 — внутренний сайт.

Решение ДАРа 22.10: отдельная форма, не обязательно из K3. Цель — правка значения в форме сразу видна в окне K3. Схема: форма пишет в справочник той базы, в которую смотрит K3, затем через мост шлёт K3 команду обновить справочник (nprefresh, по спайку 6–9 с) и перестроить выбранную систему. Время отклика и перестроение по внешнему сигналу проверяем зондом.

sequenceDiagram
  actor И as Инженер
  participant E as Редактор составов (своё окно)
  participant DB as Справочник K3
  participant B as Мост WM_COPYDATA
  participant K3 as K3 (открыт заказ)
  И->>E: меняет значение (зазор, смещение, артикул)
  E->>E: проверка целостности
  E->>DB: транзакция, проверка каждого оператора
  E->>B: «обновить справочник и перестроить систему N»
  B->>K3: nprefresh + reconcile выбранной системы
  K3-->>И: новая геометрия в окне
  

5Откуда берутся правила и чем сверяемся

ИсточникРольКак используем
Технологические описания систем (43 файла, Битрикс)правила, утверждённые ДАРомпубликуем серией odocs/doorsys-rules-*: формула, переменные, источник, страница
Оракул LeroyProtoLIB → DOORS63эталон геометрии и габаритовсверка позиций треков, створок, роликов на одном входе
История репозитория и задачи Битриксаобъяснение расхожденийесли описание и оракул расходятся — ищем, что менялось, фиксируем оба значения
Схемы teoria_*.k3замысел и сеченияпонимание конструкции, размеры не переносим без сверки
Решения и тесты Денисапринятая реализацияменяем только с объяснением расхождения с оракулом

6Где мы сейчас

ЧастьСостояниеЧто дальше
Каталог 751 в копии базы стендаперенесён с дефектомубрать или дополнить 3 записи FixDetail без K3File
Резолвер ролей по схеме 083работаетубрать 360 ошибочных запросов NomID7–9
Граф делителей, материалы секцийпринято—
Направляющие в сценене на местепоставить в анкер проёма как у оракула
Ролики и стопорне на местесмещения считать от рамки, не от габарита с роликами
Один прототиптолько зондэтапы I–II зонда, затем перевод построения
Карточка системыкаркас Денисавкладки «Створка N» с 2D-редактором по плану 085
Мастер установкине начатвторая точка входа в форму, ниша как сейчас
Редактор составовне начатрешить место окна, затем экраны master–detail
Приёмка живых прогоновбыла слепойжурнал Mebel.jou и позы всех узлов обязательны