Предназначение

Язык условного оформления (язык УО) предназначен для задания правил оформления полей формы, за исключением полей таблиц и списков. Например, если видимость реквизита формы зависит от состояния поля объекта, данную связь можно задать в языке УО, не прибегая к написанию специальных для этого процедур модуля формы.

Инициализация

Инициализация движка условного оформления производится в обработчике OnCreateAtServer путем вызова локальной процедуры readAppearance примерно следующего содержания:

&AtServer
Procedure OnCreateAtServer ( Cancel, StandardProcessing )
	
	readAppearance ();
	Appearance.Apply ( ThisObject );
	
EndProcedure

&AtServer
Procedure readAppearance ()
	
	rules = new Array ();
	rules.Add ( "
	|Links show ShowLinks
	|;
	|Rate Factor enable
	|filled ( LocalCurrency ) and filled ( ContractCurrency ) and
	|Object.Currency <> LocalCurrency or Object.ContractCurrency <> LocalCurrency )
	|" );	
	Appearance.Read ( ThisObject, rules );
	
EndProcedure

Также, в форме должен существовать реквизит AppearanceData, где язык УО будет хранить служебные данные:

Язык

Язык состоит из следующих элементов:

[<#><s|c|с|к>] <Идентификатор поля 1 | Идентификатор поля N> <show | hide | enable | disable | lock | unlock | press | release | mark | unmark | title/id | hint/id> <expression> [;]

где:

# Признак начала директивы, определяющей контекст исполнения условного оформления
s | c | с | к

Контекст условного оформления:

s На сервере
c На клиенте
с (рус) На сервере
к (рус) На клиенте

По умолчанию, без указания директивы, условное оформление может быть вызвано как с клиента, так и с сервера, с сохранением контекста исполнения.

Для тех случаев, когда условное оформление может быть определено только на сервере (или только на клиенте), указание директивы позволяет экранировать правило оформления от неподходящего контекста.

Например, при таком правиле:

#s ShowPanel hide Options.SimpleInterface ()

применить оформление (методами Appearance.Apply (), Appearance.Update()) можно только с сервера. Вызов Appearance.Apply () с клиента, будет игнорировать серверные правила. Тоже самое, но в обратном направлении, справедливо и для директивы На клиенте.

Идентификатор поля Идентификатор поля на форме. Может быть указано более одного поля, в этом случае поля разделяются пробелом
show, hide и т.д.

Операторы оформления, если больше одного - разделяются дефисом.

Таблица всех операторов:

show показать Установка видимости
hide скрыть Установка невидимости
enable включить Установка доступности
disable выключить Установка недоступности
lock закрыть Установка только чтение
unlock открыть Сброс только чтение
press прижать Прижатое состояние кнопки
release отжать Отжатое состояние кнопки
mark отметить Выделить красным
unmark снятьотметку Снять выделение красным
title назвать Задать заголовок (группы, декорации)
hint подсказать Установить подсказку внутри поля ввода
id Полный путь к экспортной функции без параметров, в которой формируется строка с использованием NStr (). Обычно, это функции модуля Output
expression Выражение на языке 1С, вычисление результата которого должно иметь булевый тип. Не рекомендуется использовать сложные вычисления и серверные функции. Желательно значения, используемые в языке выражений получать заблаговременно
; Разделитель задаваемых правил. В одной стоке может быть задано сразу несколько правил оформления, разделенных “;”

Примечание: комментарии в языке выражений не поддерживаются

Вызов обновления

Автоматического обновления формы при изменении завязанных на условное оформление реквизитов не происходит. Для этого нужно самостоятельно перехватывать обработчики xxxOnChange () и по окончании прикладной логики, вызывать метод Appearance.Apply ( ThisObject, “ChangedField” ), либо Appearance.Update ( ThisObject, “Control” ), где:

ChangedField Полный путь к реквизиту, который был изменен. Например: “Object.Contract”
Control Имя поля формы, например “Contract”

Appearance.Apply () – производит вычисление и запуск всех правил условного оформления, выражения в которых зависят от переданного вторым параметром имени измененного поля. Например, если вызвать Appearance.Apply ( ThisObject, “Object.Contract” ), система выполнит все правила, в выражениях которых участвует “Object.Contract”.

Appearance.Update ( ThisObject, “Control” ) – выполняет аналогичную функцию, с той разницей, что в качестве параметра передается имя элемента формы, который требуется обновить. Система вычислит все правила, где участвует данный элемент и применит их. На практике, использование данной функции часто применяется в случаях сложных выражений, задающих условия срабатывания правила. Например, если в условии правила используется вызов функции, сложное выражение или задается путь к полю некоторой коллекции формы, то система не сможет автоматически разобрать такое выражение для вычленения зависимых полей. Чтобы обновить такое правило, нужно будет применить Appearance.Update () с прямым указанием идентификатора обновляемого элемента формы.

Например, в правилах ниже:

rules = new Array ();
rules.Add ( "
|Links show ShowLinks
|;
|Rate Factor enable
|filled ( LocalCurrency ) and filled ( ContractCurrency and
|Object.Currency <> LocalCurrency or Object.ContractCurrency <> LocalCurrency )
|" );

Appearance.Apply ( ThisObject, “Object.ContractCurrency” ) выполнит оформление полей Rate и Factor.

В свою очередь:

Appearance.Update ( ThisObject, “Links” ) выполнит оформление элемента формы Links.

Примеры правил

Несколько примеров правил:

Contract show-lock filled ( Contract ) and HasAccess
;
GroupUser title/Output.UserTitle inlist ( Object.UserClass, Enum.Users.Admin, Enum.Users.Sysadmin )
;
Currency unlock Object.Currency <> Catalog.Currencies.Local
;
Password hint/Output.PasswordRules InvalidPassword