Как из управляемой формы вызвать процедуру модуля объекта

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

Напрямую обратиться к процедурам модуля объекта из формы не получится. Связано это с тем, что прикладных объектов на клиенте нет, они существуют только на сервере. На клиенте доступны только специальные типы для отображения данных.

Общая схема вызова серверной процедуры/функции состоит из нескольких этапов:

  1. Вызов контекстной серверной процедуры формы;
  2. Преобразование основного реквизита формы в прикладной объект;
  3. Вызов экспортной процедуры/функции модуля объекта;
  4. Обратное преобразование прикладного объекта в реквизит формы.

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

Процедура модуля объекта документа для применения скидки:

Процедура ПрименитьСкидку(ПроцентСкидки) Экспорт
Для каждого СтрокаТЧ Из Товары Цикл
СтрокаТЧ.Цена = СтрокаТЧ.Цена - СтрокаТЧ.Цена / 100 * ПроцентСкидки;
КонецЦикла;
КонецПроцедуры


Внимание!

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


На форме документа расположим кнопку, вызывающую серверную процедуру:
&НаКлиенте
Процедура ПересчитатьЦены(Команда)

// Этап 1. Вызов серверной процедуры
ПересчитатьЦеныНаСервре();

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

&НаСервере
Процедура ПересчитатьЦеныНаСервре()

// Этап 2. Преобразование основного реквизита формы в прикладной объект
ДокументОбъект = РеквизитФормыВЗначение("Объект");
// Этап 3. Вызов процедуры модуля объекта
ДокументОбъект.ПрименитьСкидку(5);
// Этап 4. Обратное преобразование прикладного объекта в реквизит формы
ЗначениеВРеквизитФормы(ДокументОбъект, "Объект");

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

Оцените статью