1с обратиться к процедуре в модуле объекта

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

Предположим, что в модуле справочника определена процедура ОтобразитьДанные():

Процедуры, объявленные в модуле объекта с ключевым словом Экспорт , доступны только в контексте работы с этим объектом (в данном случае с объектом СправочникОбъект. ) и дополняют контекст объекта, существующий по умолчанию.

Если в модуле формы списка этого справочника попытаться выполнить следующий вызов:

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

Поэтому для того чтобы выполнить эту процедуру, следует вызывать ее в контексте объекта справочника:

Следует заметить, что процедура ОтобразитьДанные() будет доступна также в контексте модуля формы элемента справочника. Другим словами в модуле формы элемента справочника будет работать вызов:

Так происходит потому, что в контексте модуля формы элемента справочника доступны методы и свойства объекта, являющегося значением основного реквизита формы, — т.е. объекта справочника.

Более подробно можно прочитать об этом в разделе Контекст формы и основного реквизита формы.

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

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

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

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

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

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

Внимание!

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

На форме документа расположим кнопку, вызывающую серверную процедуру:

Остались вопросы?
Спросите в комментариях к статье.

Рассмотрим эту задачу на следующем примере:

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

Содержание самой процедуры пересчета рассматривать в рамках данной статьи не будем.

Итак, чтобы вызвать процедуру из модуля объекта на управляемой форме нужно выполнить следующие действия:

    Сделать вызываемую процедуру экспортируемой (то есть доступной не только из самого модуля объекта, но и из других модулей)

//Вызываем экспортную процедуру ПересчетНДС из модуля объекта
ДокОбъект . ПересчетНДС ( ) ;

//Возвращаем объект документа в реквизит формы
ЗначениеВРеквизитФормы ( ДокОбъект , «Объект» ) ;

Теперь немного об использованных функциях:

  • РеквизитФормыВЗначение( , ) — преобразует указанный реквизит управляемой формы в объект прикладного типа. Первый параметр — имя реквизита управляемой формы (в кавычках, т.к. это строка), второй параметр — тип прикладного объекта (переменная со типом Тип).
  • ЗначениеВРеквизитФормы( , ) — выполняет обратную процедуру — преобразует прикладной объект в указанный реквизит управляемой формы. Первый параметр — переменная, содержащая прикладной тип, второй параметр — имя реквизита управляемой формы, в который нужно преобразовать объект.
Оцените статью
SoftLast
Добавить комментарий