Оператор SHOW
Оператор SHOW создаёт действие, открывающее форму в интерактивном представлении.
Синтаксис
SHOW [formId =] target
[formActionOptions]
[{initActionOperator}]
Где target — одна из двух форм. Именная форма открывает ранее объявленную форму:
formName [OBJECTS objName1 = expr1 [NULL], ..., objNameN = exprN [NULL]]
а классовая форма открывает форму выбора или редактирования класса:
classFormType className = expr [NULL]
А formActionOptions — произвольная комбинация следующих опций в любом порядке:
FILTERS filterExpr1, ..., filterExprM
syncType
windowType
manageSessionType
sessionScopeType
cancelType
READONLY
CHECK
ACTIVATE [USER]
Где windowType — одно из:
FLOAT
WINDOW [windowName]
EMBEDDED
POPUP
IN containerName
Описание
Оператор SHOW создаёт действие, которое открывает указанную форму. Блок OBJECTS задаёт начальные значения объектам формы (в классовой форме та же роль у единственного = expr, относящегося к единственному объекту формы, который неявно имеет имя object и может быть использован под этим именем внутри выражений FILTERS). Внутри formActionOptions опция FILTERS прикрепляет дополнительные фильтры, вычисляемые из контекста вызова; остальные опции управляют поведением открытия — потоком, расположением, сессией, видимостью системных действий и другими модификаторами. Завершающий блок {initActionOperator} выполняется один раз при открытии формы.
Параметры
-
formIdСтроковый литерал - метка, которую несёт открытая форма и по которой к ней обращаются последующие действия:
ACTIVATE FORMиCLOSE FORM. Одну и ту же метку могут нести несколько открытых форм:CLOSE FORMзапрашивает закрытие каждой из них, аACTIVATE FORMактивирует первую найденную в окнахFORMS. По умолчанию открытая форма метки не несёт. -
formNameИмя формы. Составной идентификатор.
-
classFormTypeТип открывающейся классовой формы. Задаётся одним из ключевых слов:
LIST— форма выбора (списка)EDIT— форма редактирования
-
classNameИмя пользовательского класса, форму выбора или редактирования которого надо открыть. Составной идентификатор.
-
objName1, ..., objNameNИмена объектов формы, для которых задаются начальные значения. Простые идентификаторы.
-
expr,expr1, ..., exprNВыражения, значения которых используются как начальные значения соответствующих объектов формы.
-
NULLпосле начального значенияКлючевое слово. Разрешает передаче начального значения быть
NULL. По умолчанию, если какое-либо передаваемое значение равноNULL, действие пропускается, и управление передаётся следующему действию. ПереданныйNULLне становится значением объекта: он равносилен отсутствию значения, и текущим становится объект по умолчанию группы. -
initActionOperatorКонтекстно-зависимый оператор-действие, выполняющийся при открытии формы, после обработчиков
EVENTS ON INITформы.
Опции
-
filterExpr1, ..., filterExprMНепустой список выражений, задающих дополнительные фильтры, применяемые к форме. Каждое выражение может использовать как параметры контекста вызова, так и собственные объекты формы.
-
syncTypeРежим управления потоком. Одно из:
WAIT— синхронный (ожидать закрытия формы)NOWAIT— асинхронный (продолжить сразу после открытия)
По умолчанию платформа выбирает
WAIT, если вызов сам сделан из модальной формы, если в этом же вызове далее потребуются дополнительные обращения к сессии или если выбранный тип окна сам модальный (FLOAT,EMBEDDED,POPUP); иначе —NOWAIT. -
windowTypeРасположение формы:
FLOATпоказывает форму как плавающее окно,WINDOW— как закладку в системном окне формSystem.formsили в окнеFORMS, которое называетwindowName, — так форма рисуется шапкой или боковой панелью, —EMBEDDEDиPOPUP— как встроенные редакторы,INпомещает форму внутрьcontainerName— компонента дизайна, квалифицированного формой (имя формы, за которым следует путь к компоненту внутри дизайна этой формы), который должен быть контейнером. По умолчанию в синхронном режиме используетсяFLOAT, в асинхронном —WINDOW. В синхронном режиме закладкаWINDOWдо своего закрытия блокирует форму, из которой открыта, а из формы, показанной окном, показывается окном, какFLOAT: чтобы из формы, показанной окном, открыть именно закладку, укажитеNOWAIT.-
windowNameИмя окна, в которое помещается форма. Составной идентификатор окна, объявленного как
WINDOW ... FORMS; любое другое окно — ошибка. Мобильный веб-клиент и десктоп-клиент рисуют одно окноSystem.forms, поэтому там форма открывается вSystem.forms, закладкой.
-
-
manageSessionTypeПереопределяет, считается ли открываемая форма собственником сессии. Одно из:
MANAGESESSION— принудительно собственникNOMANAGESESSION— принудительно не собственник
По умолчанию форма становится собственником сессии только если на момент открытия у сессии не было другого собственника.
-
sessionScopeTypeСессия, в которой открывается форма. Одно из:
NEWSESSION— новая сессия верхнего уровняNESTEDSESSION— новая вложенная сессияTHISSESSION— текущая сессия (по умолчанию)
-
cancelTypeПереопределяет, отображать ли системное действие Отменить (
System.formCancel[]) на форме. Одно из:CANCEL— принудительно показатьNOCANCEL— принудительно скрыть
По умолчанию оно отображается, если форма является собственником сессии и содержит действия, способные изменить эту сессию.
-
READONLYКлючевое слово. Если указано, форма открывается в режиме только для чтения.
-
CHECKКлючевое слово. Если указано, при нажатии пользователем системного действия OK (
System.formOk[]) платформа сначала валидирует ожидающие применения изменения сессии (выполняет проход apply — ограничения, агрегации, обработчики событий — без фиксации); форма закрывается только если валидация прошла успешно, иначе остаётся открытой. -
ACTIVATEКлючевое слово. Если указано и та же форма уже открыта в этом окне с той же меткой
formId, активируется она, а вторая не показывается; уже открытая форма показывается как есть. Открытие безformIdозначает форму, открытую без метки, а не любую из них. Так как уже открытая форма показывается без изменений,ACTIVATEуказывается только вместе сWINDOWиNOWAITи не указывается вместе сOBJECTS,FILTERS,READONLY,CHECK, опцией сессии, опцией отмены и блоком инициализации - они относятся к открываемой форме, и применить их было бы некуда.Если клиент предсказывает это открытие и находит уже открытую форму, он сразу активирует её и отправляет действие на сервер. Дойдя до соответствующего
SHOW, сервер пропускает создание формы, поэтому её события инициализации и закрытия не выполняются. Остальные операторы и обработчики событий действия выполняются как обычно.Такая ранняя активация выполняется для действия, запущенного из навигатора - щелчком или клавишей привязки, - для действия, которое свойство выполняет при обычном изменении или по привязке, если изменение не передаёт значение, и, в веб-клиенте, для события формы. Она не выполняется для значения, которое передаёт пользовательское представление (изменение из
CUSTOM-отрисовщика,changePropertyконтроллера React), для вставки и для действия, которое пользовательское представление запускает по имени: там форма создаётся на сервере и закрывается клиентом при получении, как описано ниже.Решение о повторном использовании принимается при вызове действия. Если после этого форма закрывается, это открытие не создаёт её заново. Активация сохраняется, даже если действие отклонено или не дошло до этого
SHOW.Если ранней активации не было, клиент повторяет проверку при получении новой формы. Если соответствующая форма к этому моменту уже открыта, клиент активирует её и закрывает новую; в этом случае события инициализации и закрытия новой формы выполняются.
Добавленное
USERоставляет выбор пользователю: форма активируется, только пока ему запрещены дублирующиеся формы (настройкаforbidDuplicateForms), а при вызове действия из навигатора удерживаемый Ctrl всё равно открывает второй экземпляр. БезUSERни настройка, ни Ctrl этого не меняют.USER- это то, что делает элемент формы в навигаторе.
Примеры
date = DATA DATE (Order);
FORM showForm
OBJECTS dateFrom = DATE, dateTo = DATE PANEL
PROPERTIES VALUE(dateFrom), VALUE(dateTo)
OBJECTS o = Order
FILTERS date(o) >= dateFrom, date(o) <= dateTo
;
testShow () {
// начальные значения для двух объектов, действие инициализации после открытия
SHOW showForm OBJECTS dateFrom = 2010_01_01, dateTo = 2010_12_31 { MESSAGE 'On init'; };
// открытие в новой сессии как плавающее окно с новым объектом в качестве текущего
NEWSESSION {
NEW s = Sku {
SHOW sku OBJECTS s = s FLOAT;
}
}
// открытие именной формы со значениями панели, дополнительным фильтром и идентификатором экземпляра
SHOW 'recentOrders' = showForm OBJECTS dateFrom = 2024_01_01, dateTo = 2024_12_31 FILTERS number(o) > 1000 NOWAIT;
// открытие формы выбора класса Sku, сфокусированной на конкретном sku
NEW s = Sku { SHOW LIST Sku = s; }
}