Структура формы
Структура формы - это совокупность объектов, свойств, действий и связей между ними.
Объекты
При создании формы первоначально необходимо определить, какие объекты она будет отображать. Для каждого объекта формы нужно задать его класс.
Существует возможность объединять объекты в группы объектов. В этом случае в таблице будет показываться "декартово произведение" этих объектов (то есть для двух объектов - все пары, трех объе ктов - тройки и т.п.).
В соответствии с порядком добавления групп объектов на форму образуется упорядоченный список групп объектов. Соответственно, последней группой для некоторого множества групп объектов будем называть группу из этого множества с максимальным порядковым номером в этом списке (то есть максимально позднюю). Аналогичным образом определяется последняя группа для множества объектов: сначала строится множество групп объектов, в которые входят эти объекты, затем для полученного множества групп объектов определяется последняя группа.
Текущий объект
Каждый объект на форме в любой момент времени имеет текущее значение. Его изменение происходит либо в результате соответствующих действий пользователя в интерактивном представлении, либо "виртуально" в процессе чтения данных в статичном представлении.
Свойства и действия
После определения объектов на форму можно добавить свойства и действия, подставив эти объекты им на вход в качестве аргументов.
Добавление действий актуально только для интерактивного представления. В статичном представлении добавленные действия игнорируются.
Поведение свойств и действий с точки зрения их отображения на форме абсолютно одинаково, поэтому в дальнейшем в этом разделе будем использовать только термин свойство (для действий поведение абсолютно аналогично).
Группа отображения
Каждое свойство отображается ровно в одной из групп объектов на форме (будем называть ее группой отображения этого свойства). По умолчанию группой отображения является группа, последняя для множества объектов, которые передаются на вход этому свойству. При необходимости, разработчик может задать группу отображения явно (с определенными ограничениями при использовании в структурированном представлении)
Группы-в-колонки
По умолчанию, свойство отображается в своей группе отображения ровно один раз. При этом, в качестве значений объектов, который не находятся в группе отображения этого свойства (назовем их верхними), используются их текущие значения. Однако в платформе также существует возможность отображать одно свойство несколько раз таким образом, чтобы в качестве значений некоторых верхних объектов использовались не их текущие значения, а все наборы объектов (при таком отображении свойства образуется своего рода "матрица" - верхние объекты x объекты группы отображения). Соответственно, чтобы создать такую матрицу, необходимо при добавлении свойства на форму указать какие именно верхние объекты (а точнее группы объектов) необходимо использовать для создания колонок (будем называть эти группы объектов группами-в-колонки).
При определении группы отображения свойства группы-в-колонки игнорируются.
Группы свойств
Свойства на форме можно объединять в группы, которые, в свою очередь, используются в интерактивном (дизайне по умолчанию) и иерархическом представлениях формы. По умолчанию, привязка свойства к группе глобальна (то есть задается для свойства для в сех форм сразу), однако, при необходимости, для отдельных форм эту привязку можно переопределить.
Настройки по умолчанию
Для свойств на форме существует большое количество настроек отображения в различных представлениях, абсолютное большинство из которых можно задавать не только непосредственно для свойства на форме, но и для самого добавляемого свойства (при его создании). Эти настройки будут настройками по умолчанию, то есть если настройка не задается явно для конкретного свойства на форме, то используется настройка самого свойства. При этом, эти настройки по умолчанию "наследуются" при использовании операторов композиции, выбора и предыдущего значения (то есть, если скажем для свойства f(a)
задана ширина по умолчанию 10
, то и свойство g(a) = f(a) IF h(a)
, также по умолчанию будет иметь ширину 10
).
Фильтры
Для каждой формы разработчик может создать определенные фильтры, которые будут ограничивать список доступных к просмотру / выбору наборов объектов на форме.
Для задания фильтра необходимо указать свойство, которое будет использоваться в качестве критерия фильтрации. Фильтр будет применяться к таблице той группы объектов, которая является последней для множества объектов, передаваемых на вход этому свойству (то есть аналогично с определением группы отображения свойства). При этом будут показаны только те наборы объектов (ряды), для которых значения свойства не равняются NULL
.
Сортировки
По умолчанию, во всех представлениях групп объектов наборы объектов отображаются в некотором недетерминированном порядке, который определяется конкретной реализацией платформы (чаще всего в качестве порядка используются внутренние идентификаторы). При необходимости, разработчик может задать этот порядок явно, указав список свойств на форме, которые будут использоваться в качестве сортировок. При этом для каждого свойства в этом списке можно задать по возрастанию или по убыванию должна идти сортировка (по умолчанию используется опция по возрастанию).
Значение NULL
всегда считается наименьшим значением.
Язык
Для создания новой формы и описания ее структуры предназначена инструкция FORM
.
Примеры
CLASS Document;
// объявляем форму Документы
FORM documents 'Документы'
// Добавляем один объект класса Document, по этому имени объект будет доступен в операторах
// DESIGN, SHOW, EXPORT, DIALOG и др.
OBJECTS d = Document
// ... добавляем свойства и фильтры на форму
// помечаем что данная форма должна использоваться, когда необходимо выбрать документ,
// при этом объект d должен использоваться как возвращаемое значение
LIST Document OBJECT d
;
CLASS Item;
// объявляем форму Товар
FORM item 'Товар'
// добавляем объект класса Item и помечаем, что он должен отображаться в панель
// (то есть видимо только одно значение)
OBJECTS i = Item PANEL
// ... добавляем свойства и фильтры на форму
// помечаем что данная форма должна использоваться, когда необходимо добавлять или редактировать товар
EDIT Item OBJECT i
;
// объявляем форму со списком Товаров
FORM items 'Товары'
OBJECTS i = Item
// ... добавляем свойства и фильтры на форму
// добавляем кнопки, которые будут создавать и редактировать товар, используя форму item
PROPERTIES(i) NEWSESSION NEW, EDIT
;
CLASS Invoice;
CLASS InvoiceDetail;
// объявляем форму печати инвойса
FORM printInvoice
OBJECTS i = Invoice // добавляем объект класса инвойс, для которого будет идти печать
// ... добавляем свойства и фильтры на форму
;
// разбиваем определение формы на две инструкции (вторую инструкцию можно перенести в другой модуль)
EXTEND FORM printInvoice
// добавляем строки инвойса, каждая из которых будет использоваться в отчете в качестве детализации
OBJECTS d = InvoiceDetail
// ... добавляем свойства и фильтры на форму
;
// объявляем действие , при выполнении которого будет открываться форма печати инвойса
print (Invoice invoice) { PRINT printInvoice OBJECTS i = invoice; }