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

Первый вариант решения

В данном решении поместим процедуру для начисления скидки клиенту в модуле формы документа ОказаниеУслуги.

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

Листинг 4.58. Процедура «КлиентПриИзменении()»

&НаКлиенте

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

 

НачислитьСкидку();

 

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

В этом обработчике мы вызываем контекстную серверную процедуру для начисления скидки клиенту, расположенную в модуле формы (листинг 4.59).

Листинг 4.59. Процедура «НачислитьСкидку()»

&НаСервере

Процедура НачислитьСкидку()

 

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

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

 

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

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

И затем пересчитываем поля СуммаСкидки и СуммаУслуги документа ОказаниеУслуги по заданному алгоритму.

Теперь обеспечим пересчет суммы услуги при изменении цены услуги. Для этого создадим обработчик события ПриИзменении для поля формы ЦенаУслуги (листинг 4.60).

Листинг 4.60. Процедура «ЦенаУслугиПриИзменении()»

&НаКлиенте

Процедура ЦенаУслугиПриИзменении(Элемент)

 

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

 

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

Включим для полей формы СуммаСкидки и СуммаУслуги свойство ТолькоПросмотр, так как они являются расчетными.

ПРИМЕЧАНИЕ

Этот пример можно посмотреть в демонстрационной конфигурации «12 (вар. 1) Реализация пересчета данных объекта в модуле объекта или в модуле формы в зависимости от логики объекта».

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

Посмотрим теперь на показатели производительности. При выборе клиента произойдет один вызов сервера (рис. 4.74).

Рис. 4.74. Показатели производительности

Этот вызов происходит при выполнении контекстной серверной процедуры НачислитьСкидку().

ПРИМЕЧАНИЕ

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

Итак, мы поместили процедуру для начисления скидки клиенту в модуле формы документа ОказаниеУслуги. После записи или проведения документа из формы пересчитанные данные формы будут преобразованы в объект и записаны. Таким образом, в данном решении мы посчитали процедуру начисления скидки «частным» делом этой формы. Снаружи данная функциональность формы не видна.

Назад: Реализация пересчета данных объекта в модуле объекта или в модуле формы в зависимости от логики объекта
Дальше: Второй вариант решения