Сущности, слои и процессы нового DoorSys после решений ДАРа 21–22.10.2026: один прототип, своя карточка редактирования, отдельный редактор составов, правила — из технологических описаний систем, геометрия — по оракулу LeroyProtoLIB.
DoorSpec v2 в атрибуте прототипа: система, проём, число створок, раскладки всех створок (граф делителей), материалы и отделки, опции фурнитуры.DoorSys63.mdb — только исторический источник для переноса. решение ДАРа 21.10doorsys + построитель mDoorSysLIB. C#-формы ничего не считают, только показывают и передают правки.DoorSys63Form07.accdb.Стрелки — направление зависимости и потока данных. Пунктир — сверка, а не вызов.
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
Левая часть — каталог (что бывает), правая — экземпляр (что стоит в заказе). Связь между ними — ссылка экземпляра на систему каталога.
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" --> "*" Фурнитура
Фурнитура ..> Роль : резолв
Основа уже есть у Дениса: 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 не передаёт в колбэк, какой ребёнок кликнут; искать обходной путь на нашей стороне.
nprefresh;Решение ДАРа 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-->>И: новая геометрия в окне
| Источник | Роль | Как используем |
|---|---|---|
| Технологические описания систем (43 файла, Битрикс) | правила, утверждённые ДАРом | публикуем серией odocs/doorsys-rules-*: формула, переменные, источник, страница |
| Оракул LeroyProtoLIB → DOORS63 | эталон геометрии и габаритов | сверка позиций треков, створок, роликов на одном входе |
| История репозитория и задачи Битрикса | объяснение расхождений | если описание и оракул расходятся — ищем, что менялось, фиксируем оба значения |
Схемы teoria_*.k3 | замысел и сечения | понимание конструкции, размеры не переносим без сверки |
| Решения и тесты Дениса | принятая реализация | меняем только с объяснением расхождения с оракулом |
| Часть | Состояние | Что дальше |
|---|---|---|
| Каталог 751 в копии базы стенда | перенесён с дефектом | убрать или дополнить 3 записи FixDetail без K3File |
| Резолвер ролей по схеме 083 | работает | убрать 360 ошибочных запросов NomID7–9 |
| Граф делителей, материалы секций | принято | — |
| Направляющие в сцене | не на месте | поставить в анкер проёма как у оракула |
| Ролики и стопор | не на месте | смещения считать от рамки, не от габарита с роликами |
| Один прототип | только зонд | этапы I–II зонда, затем перевод построения |
| Карточка системы | каркас Дениса | вкладки «Створка N» с 2D-редактором по плану 085 |
| Мастер установки | не начат | вторая точка входа в форму, ниша как сейчас |
| Редактор составов | не начат | решить место окна, затем экраны master–detail |
| Приёмка живых прогонов | была слепой | журнал Mebel.jou и позы всех узлов обязательны |