Модель приложения и структура модулей

Платформа описывает всё приложение как набор модулей. Ниже — рабочая модель, а также практические признаки того, что модуль собран правильно.

Общие принципы модулей

Типичные узлы верхнего уровня:

  • Module — контейнер конкретного объекта в приложении.
  • Application/Manifest — общий файл состояния (собирается из архивов).

Типы модулей:

  • Table
  • Reference
  • Form
  • MainMenu
  • Role
  • Stored
  • Module (служебный прикладной модуль)
  • AutoView
  • PrintForm

Каждый модуль имеет минимум:

  • Type — тип модуля.
  • Name — внутреннее имя (используется в Command, ссылках, командах).
  • Description — человекочитаемое имя.
  • Parent (для Form/Reference) — имя связанного Table.
  • Packet — пакет приложения (если используется).

Пример структуры:

<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") будут пытаться разрешить справочники по этому связыванию,
  • в Reference TableName используется для работы с Table-данными.

Практика редактирования через архив

Архив приложения состоит из:

  • manifest.json
  • application.xml
  • modules/<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 если есть).