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