1С 8.3 Вызов процедур или функций из модуля объекта в модуле формы — Программист 1С Минск. Автоматизация бизнеса.

1С 8.3 Вызов процедур или функций из модуля объекта в модуле формы

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