Модель приложения и структура модулей
Платформа описывает всё приложение как набор модулей. Ниже — рабочая модель, а также практические признаки того, что модуль собран правильно.
Общие принципы модулей
Типичные узлы верхнего уровня:
Module— контейнер конкретного объекта в приложении.Application/Manifest— общий файл состояния (собирается из архивов).
Типы модулей:
TableReferenceFormMainMenuRoleStoredModule(служебный прикладной модуль)AutoViewPrintForm
Каждый модуль имеет минимум:
Type— тип модуля.Name— внутреннее имя (используется вCommand, ссылках, командах).Description— человекочитаемое имя.Parent(дляForm/Reference) — имя связанногоTable.Packet— пакет приложения (если используется).
MainMenu
Пример структуры:
<Module Type="MainMenu" Name="EmployeeMenu" Description="Меню для сотрудников">
<Menu>
<Popup Text="Задачи">
<Item Text="Общий список" Command="taskReference"/>
<Item Text="Архив" Command="tm_dirTaskArhiveReference"/>
</Popup>
<Item Text="Дашборды" Command="dashboardForm"/>
</Menu>
</Module>
В Menu поддерживаются:
<Popup Text="..." ...>— ветка.<Item Text="..." Command="...">— рабочий пункт.<Separator/>— разделитель.
Для вложенных пунктов задавайте Popup, у которого могут быть Item/Popup.
В MainMenu возможны свойства на уровне модуля (внутри Menu рендерятся
по-умолчанию):
NoSearch="1"— отключить поиск.NoFavorites="1"— отключить избранное.Mode="Compact|Full"— компактный/обычный режим.Background="0xRRGGBB"— фон.
Table
Минимальная сущность:
<Module Type="Table" Name="task" Description="Задачи">
<Fields CounterFieldUsed="1" DescriptionField="Header" PrimaryKeyField="Id">
<Field Name="Id" Type="Integer"/>
<Field Name="Header" Type="String"/>
</Fields>
<Dependencies/>
<Permissions>
<Role Name="Manager" Select="Yes" Insert="Yes" Update="Yes" Delete="Yes"/>
</Permissions>
</Module>
Атрибуты Fields:
PrimaryKeyField— обязательный ключ.DescriptionField— поле «показа».CounterFieldUsed— автонумерация.
Атрибуты Field:
Name,Description,Type.Typeможет быть примитивным (String,Datetime,Memo,Integer) или ссылочным (*employeeи т.д.).FkTable/FkToTable/FkToFieldдля ссылочных полей.Null="0|1",OnUpdate,OnDelete,Default,Min,Max.
Permissions определяют доступ на уровне роли (Select/Insert/Update/Delete).
Reference
Reference — это типовой экран списка + форма карточки для заданной таблицы.
<Module Type="Reference" Name="taskReference" Parent="task" Description="Задачи">
<Form Width="760" Height="520"/>
<Programm Language="Similar Pascal"/>
</Module>
Для некоторых модулей Parent используется для автосвязки со Table.
Form
Form — экран карточки/редактирования.
<Module Type="Form" Name="taskForm" Parent="task" Description="Задача">
<Form Width="780" Height="560">
<!-- controls -->
</Form>
<Programm Language="Similar Pascal"/>
</Module>
Для Form и Reference полезно проверять:
- уникальность
Nameу контролов (иначе runtime не найдет элементы), - наличие обязательных полей (
id, поля списков/карточек) через привязки кDataType.
Что хранится в module.xml (на уровне приложения)
Помимо описанных структур есть общие узлы:
Permissions— роли по модулю,Dependencies— зависимости,Triggers/Triggers-атрибуты (BeforeInsertTrigger,AfterUpdateTriggerи т.д.),- служебные поля для синхронизации.
Связь формы и таблицы
Для Form/Reference важно правильно настроить Parent=...:
- через это платформа знает, к какой таблице относится экран,
- lookup-контролы (
DataType="*someTable") будут пытаться разрешить справочники по этому связыванию, - в
ReferenceTableNameиспользуется для работы сTable-данными.
Практика редактирования через архив
Архив приложения состоит из:
manifest.jsonapplication.xmlmodules/<type>/<module-name>--<hash>/с файламиmodule.xml,form.xml,program.pas,triggers/*,notes.md,resources.
Для изменения только нескольких модулей используйте фильтр --module или --type
при экспорте.
Важные ошибки структуры
Частые причины «тихих» падений:
- Пункт меню без корректного
Command/Name(поиск обработчика не происходит). - Несовпадение регистра или опечатка в
Command. - Повторяющиеся имена контролов внутри формы.
- Не тот
ParentдляReference. - Неразрешимые типы полей (
Type="String"с данными lookup и пр.) без преобразования.
Проверка перед выгрузкой
Перед pack убедитесь:
verifyпроходит без ошибок,module.xmlмодулей консистентен с их подпапкой (module.xml+form.xml+program.pas),- все модифицированные триггеры внесены синхронно (
.pas+.sqlесли есть).