Формы и справочники: практическая часть

Практический разбор структуры и работы экранов, если нужно быстро доводить карточки/списки до корректного поведения.

Формат модулей

Form

Form обычно используется для редактирования одной записи.

<Module Type="Form" Name="taskForm" Parent="task" Description="Задача">
  <Form Width="780" Height="560" Icon="-1">
    <edit Left="80" Top="8" Name="Header" DataType="String" Width="300"/>
    <button Left="520" Top="520" Name="ok" Caption="ОК"/>
  </Form>
  <Programm Language="Similar Pascal"/>
</Module>

Reference

Reference — справочник (табличный список + карточка).

<Module Type="Reference" Name="taskReference" Parent="task" Description="Задачи"
        Fields="..." TopHeight="56" ManualRequery="0" LookupOptimization="0">
  <Form Width="760" Height="520"/>
  <Programm Language="Similar Pascal"/>
</Module>

Атрибут Fields для Reference можно хранить в сериализованном виде: вложенные строки с типами/названиями полей; это удобный быстрый путь для UI.

Что проверять в форме, чтобы она была рабочей

  • Каждая сущность имеет стабильный Name (без пробелов и совпадений).
  • Для lookup-полей ставьте корректный DataType="*TableName".
  • Для обязательных вычисляемых полей задайте правильную последовательность инициализации (OnCreate/OnShow), иначе может попасть null/пустой ключ.
  • Уровень доступов у таблицы и полей должен соответствовать роли пользователя.

Доступ к контролам в скрипте

Для большинства экранов доступны методы Item, ItemCount, ItemExists.

Procedure OnCreate;
Begin
  If Form.ItemExists('ok') Then
    Form.Item('ok').Enabled := 0;
End;

Procedure OnSomeFlagChange;
Begin
  If Reference.ItemExists('SomeField') Then
    Reference.Item('SomeField').Enabled := 1;
End;

Для доступа по индексу/по имени Item может быть вызван:

  • Item(0) — индекс,
  • Item('Name') — имя.

Табличный уровень в справочниках

У справочника есть основной табличный dataset (например, для списка записей):

  • Count — количество строк,
  • Find(...) — поиск,
  • Append, Remove, Clear,
  • Sort, SortColumn, SortDesc,
  • CursorX, CursorY.

Дополнительно:

  • FixedLeft — закреплённая часть слева,
  • AddPopup, Table для расширений интерфейса,
  • Filter/ExtFilter для сохранённых фильтров.

Фильтры и интервалы

SetInterval(From, To) и Filter используются в типовых шаблонах для списка:

  • ExtFilter — дополнительный служебный фильтр,
  • ResultFilter — подготовленный финальный фильтр,
  • ColumnFormula — формулы по колонкам.

Если фильтры странно конфликтуют, сперва проверьте:

  1. какой Filter установлен в форме,
  2. какой в коде в Form.OnCreate или Reference.OnShow,
  3. есть ли глобальные фильтры в приложении/на уровне таблицы.

Типовые операции через кнопку «Сохранить»

Обычно достаточно вызывать:

  • Form.Apply — сохранить текущую карточку,
  • Form.Close — закрыть,
  • проверять DontAskDelete при удалении.
Procedure OnSaveBtnClick;
Begin
  Form.Apply;
  Form.Close;
End;

Команды для Reference и их эффекты

  • ModalForm(Name) — открыть форму как модальное окно.
  • ModalReference(Name) — открыть справочник как выбор из диалога.

Распространённые ошибки в UI

  • Нажатия на разные кнопки не срабатывают как ожидается:
  • проверьте имена обработчиков (Name ↔ On<Name>Click),
  • проверьте что обработчик в program.pas объявлен Procedure OnXxxClick;.
  • «пустые» формы и неверные значения:
  • проверьте DataType и Parent в module.xml,
  • проверьте Mode/Readonly и права доступа таблицы.
  • Неправильные lookup значения:
  • убедитесь что FkToTable и FkToField у Field на Table валидны.

Как читать form.xml и module.xml быстро

  1. Сначала откройте module.xml — проверьте метаданные и типы.
  2. Если есть form.xml, смотрите координаты и Name всех контролов.
  3. Смотрите, что program.pas использует только существующие Name.
  4. Только после этого тестируйте UI.

Что важно для производительности

  • Убеждайтесь, что в Reference/Form не создается лишний повторный requery без нужды.
  • Не дёргайте все данные в OnShow без условий — используйте параметры, если нужен узкий срез.

Небольшой шаблон для базового рефреша справочника

Procedure OnAfterApply;
Begin
  Reference.Requery;
End;

Procedure OnResetFilters;
Begin
  Reference.ResetFilters;
End;