Довольно часть встречается ситуация, когда из формы какого-то прикладного объекта необходимо вызвать экспортную процедуру или функцию, расположенную в модуле этого объекта.
Напрямую обратиться к процедурам модуля объекта из формы не получится. Связано это с тем, что прикладных объектов на клиенте нет, они существуют только на сервере. На клиенте доступны только специальные типы для отображения данных.
Общая схема вызова серверной процедуры/функции состоит из нескольких этапов:
- Вызов контекстной серверной процедуры формы;
- Преобразование основного реквизита формы в прикладной объект;
- Вызов экспортной процедуры/функции модуля объекта;
- Обратное преобразование прикладного объекта в реквизит формы.
Рассмотрим описанные действия на примере. Предположим, что у документа есть табличная часть с товарами и ценами. Необходимо из формы документа вызвать процедуру модуля объекта, которая применяет для всех строк табличной части скидку в процентах.
Процедура модуля объекта документа для применения скидки:
Процедура ПрименитьСкидку(ПроцентСкидки) Экспорт
Для каждого СтрокаТЧ Из Товары Цикл
СтрокаТЧ.Цена = СтрокаТЧ.Цена - СтрокаТЧ.Цена / 100 * ПроцентСкидки;
КонецЦикла;
КонецПроцедуры
Внимание!
Процедуры/функции модуля объекта, которые предназначены для вызова извне модуля должны быть экспортными, т.е. иметь ключевое слово Экспорт.
На форме документа расположим кнопку, вызывающую серверную процедуру:
&НаКлиенте
Процедура ПересчитатьЦены(Команда)
// Этап 1. Вызов серверной процедуры
ПересчитатьЦеныНаСервре();
КонецПроцедуры
&НаСервере
Процедура ПересчитатьЦеныНаСервре()
// Этап 2. Преобразование основного реквизита формы в прикладной объект
ДокументОбъект = РеквизитФормыВЗначение(«Объект»);
// Этап 3. Вызов процедуры модуля объекта
ДокументОбъект.ПрименитьСкидку(5);
// Этап 4. Обратное преобразование прикладного объекта в реквизит формы
ЗначениеВРеквизитФормы(ДокументОбъект, «Объект»);
КонецПроцедуры