Книга: Разработка интерфейса прикладных решений на платформе "1С:Предприятие 8"
Назад: Второй вариант решения
Дальше: Резюме

Третий вариант решения

В качестве альтернативного варианта при изменении оформления поля СуммаСкидки можно использовать одно из свойств, изменение которых не требует обращения к серверу. Например, свойство ЦветРамки вместо свойства Шрифт.

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

Но лучше «навести порядок» в модуле формы и перенести код, изменяющий оформление поля, в отдельную процедуру. И затем вызывать ее из обработчиков событий ПриИзменении и ПриСозданииНаСервере.

Какой же будет директива компиляции этой процедуры? Ведь она должна вызываться как с сервера, так и с клиента. Если мы предварим процедуру директивой &НаКлиенте, то мы не сможем вызывать ее с сервера, из обработчика события ПриСозданииНаСервере. Точнее, модуль формы не пройдет синтаксическую проверку в контексте сервера.

Если мы напишем директиву &НаСервере, то получим лишний вызов сервера с клиента при возникновении события поля ПриИзменении. Хотя изменение оформительских свойств поля формы вполне может обойтись без вызова сервера.

Единственная подходящая директива – &НаКлиентеНаСервереБезКонтекста. Процедура, описанная такой директивой компиляции, будет выполняться то на сервере, то на клиенте – в зависимости от того, откуда она была вызвана. Но, поскольку процедура будет выполняться без контекста формы, мы должны самостоятельно передать этот контекст в параметре типа УправляемаяФорма.

Итак, добавим в модуль формы процедуру УстановитьОформление() и перенесем в нее код, изменяющий оформление поля СуммаСкидки в зависимости от отметки в поле Скидка (листинг 4.70).

Листинг 4.70. Процедура «УстановитьОформление()»

&НаКлиентеНаСервереБезКонтекста

Процедура УстановитьОформление(Форма)

 

Если Форма.Объект.Скидка Тогда

Форма.Элементы.СуммаСкидки.ЦветРамки = WebЦвета.ЗеленаяЛужайка;

 

Иначе

Форма.Элементы.СуммаСкидки.ЦветРамки = WebЦвета.Коралловый;

 

КонецЕсли;

 

КонецПроцедуры

В этой процедуре в параметре Форма мы получаем контекст формы документа и, используя этот контекст, получаем доступ к коллекции элементов формы (Форма.Элементы) и к реквизиту документа Скидка (Форма.Объект.Скидка).

Затем изменим обработчик события формы ПриСозданииНаСервере (листинг 4.71).

Листинг 4.71. Обработчик события «ПриСозданииНаСервере»

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

 

УстановитьОформление(ЭтотОбъект);

 

КонецПроцедуры

А в обработчике события ПриИзменении поля формы Скидка оставим только пересчет поля СуммаУслуги (листинг 4.72).

Листинг 4.72. Процедура «СкидкаПриИзменении()»

&НаКлиенте

Процедура СкидкаПриИзменении(Элемент)

 

Если Объект.Скидка Тогда

Объект.СуммаУслуги = Объект.ЦенаУслуги - Объект.СуммаСкидки;

 

Иначе

Объект.СуммаСкидки = 0;

Объект.СуммаУслуги = Объект.ЦенаУслуги;

 

КонецЕсли;

 

УстановитьОформление(ЭтотОбъект);

 

КонецПроцедуры

ПРИМЕЧАНИЕ

Этот пример можно посмотреть в демонстрационной конфигурации «13 (вар. 3) Изменение свойств элементов формы, не требующих обращения к серверу».

Запустим «1С:Предприятие», откроем документ об оказании услуги, в котором установлена скидка. Флажок Скидка установлен, и поле СуммаСкидки обрамлено зеленой рамкой. При снятии отметки в поле Скидка рамка поля СуммаСкидки становится красной и значение поля обнуляется. После этого поле СуммаУслуги пересчитывается. Также оно пересчитывается при любом изменении цены услуги и суммы скидки в соответствии с заданным алгоритмом (рис. 4.81).

Рис. 4.81. Оформление поля «Сумма скидки» в зависимости от состояния флажка «Скидка»

Как мы видим, функциональность прикладного решения будет практически такой же, как и в первом варианте, но производительность будет выше, так как изменение свойства ЦветРамки на клиенте не приведет к обращению на сервер.

ПРИМЕЧАНИЕ

Заметим, что при первом изменении цвета рамки элементов формы могут быть лишние серверные вызовы за счет кеширования платформой необходимой информации.

Назад: Второй вариант решения
Дальше: Резюме