snfr1c |
---|
Прочитано: 22284 |

Подскажите, как выполнить процедуру или функцию из формы документа, вызвав её из модуля этого же документа?
Процедура в форме, например ПриИзмененииКонтрагента() Экспорт
при попытке выполнения ЭтотОбъект.ПриИзмененииКонтрагента() выдаётся ошибка "Метод не обнаружен"
Yandex |
---|
Возможно, вас также заинтересует |

snfr1c |
---|
Ответ № 1 |

Согласно 1С: "Можно ли обращаться к переменным, процедурам и функциям модуля снаружи объекта?
В 1С:Предприятии 8 любая переменная, процедура и функция модуля объекта (документа, справочника, обработки, формы и т.д.) может быть объявлена как экспортируемая. Для этого достаточно в ее объявлении указать слово Экспорт.
Например:
Код 1C v 8.х
После этого к таким переменным, процедурам и функциям можно обращаться так же, как и к системным свойствам и методам объектов.
Довольно часть встречается ситуация, когда из формы какого-то прикладного объекта необходимо вызвать экспортную процедуру или функцию, расположенную в модуле этого объекта.
Напрямую обратиться к процедурам модуля объекта из формы не получится. Связано это с тем, что прикладных объектов на клиенте нет, они существуют только на сервере. На клиенте доступны только специальные типы для отображения данных.
Общая схема вызова серверной процедуры/функции состоит из нескольких этапов:
- Вызов контекстной серверной процедуры формы;
- Преобразование основного реквизита формы в прикладной объект;
- Вызов экспортной процедуры/функции модуля объекта;
- Обратное преобразование прикладного объекта в реквизит формы.
Рассмотрим описанные действия на примере. Предположим, что у документа есть табличная часть с товарами и ценами. Необходимо из формы документа вызвать процедуру модуля объекта, которая применяет для всех строк табличной части скидку в процентах.
Процедура модуля объекта документа для применения скидки:
Внимание!
Процедуры/функции модуля объекта, которые предназначены для вызова извне модуля должны быть экспортными, т.е. иметь ключевое слово Экспорт .
На форме документа расположим кнопку, вызывающую серверную процедуру:
Остались вопросы?
Спросите в комментариях к статье.
Рассмотрим эту задачу на следующем примере:
В конфигурации существует документ РеализацияТовара с табличной частью, одним из реквизитов которой является СуммаНДС. При изменении ставки НДС в документе сумма НДС должна пересчитываться. Процедура пересчета НДС находится в модуле объекта нашего документа.
Содержание самой процедуры пересчета рассматривать в рамках данной статьи не будем.
Итак, чтобы вызвать процедуру из модуля объекта на управляемой форме нужно выполнить следующие действия:
-
Сделать вызываемую процедуру экспортируемой (то есть доступной не только из самого модуля объекта, но и из других модулей)
//Вызываем экспортную процедуру ПересчетНДС из модуля объекта
ДокОбъект . ПересчетНДС ( ) ;
//Возвращаем объект документа в реквизит формы
ЗначениеВРеквизитФормы ( ДокОбъект , "Объект" ) ;
Теперь немного об использованных функциях:
- РеквизитФормыВЗначение( , ) — преобразует указанный реквизит управляемой формы в объект прикладного типа. Первый параметр — имя реквизита управляемой формы (в кавычках, т.к. это строка), второй параметр — тип прикладного объекта (переменная со типом Тип).
- ЗначениеВРеквизитФормы( , ) — выполняет обратную процедуру — преобразует прикладной объект в указанный реквизит управляемой формы. Первый параметр — переменная, содержащая прикладной тип, второй параметр — имя реквизита управляемой формы, в который нужно преобразовать объект.