|
|
#1 |
|
Участник
|
D365: runAs "Error executing code: object does not have method"
D365 10.0.12
Имеется пользовательский веб сервис который выполняет некий функционал в Д365. Этот сервис вызывается из веб магазина и очень важно чтобы он работал от имени пользователя который его вызывает, т.к. необходимо проверять права на выполнение этого функционала в Д365. Для этого клиент попросил добавить в сервис дополнительный параметр с именем пользователя и выполнять функционал от имени этого пользователя. Использую классический RunAs, и все вроде хорошо, только при попытке выполнить получаю сообщение "Error executing code: GatewayTrans object does not have method processAs", несмотря на то, что класс и метод есть, компиляция успешна, и даже ДБ синхронизация была выполнена и виртуальная машинка перезагружена. Кроме рекомендации перестроить CIL для 2012 (что звучит странно для Д365) нагуглить ничего не получается. Прошу помощь клуба в решении! Вызов: X++: returnValue = GatewayTransService::runAsUser(dataContract.userId(), classNum(GatewayTrans), "processAs", [dataContract.Id(), dataContract.CustAccount(), dataContract.transDate(), dataContract.revRecContractStartDate(), dataContract.userId(), dataContract.allCompanies(), dataContract.process()] ); X++: static public CreditCardStr runAsUser(UserId _userId, int _classNum, str _methodName, container _params) { RunAsPermission perm; Str returnValue; perm = new RunAsPermission(_userId); perm.assert(); [returnValue] = runAs(_userId, _classNum, _methodName, _params); CodeAccessPermission::revertAssert(); return returnValue; } X++: class GatewayTrans { public static /*server*/ Str processAs( CustomId _Id, CustAccount _CustAccount, TransDate _transDate, TransDate _revRecContractStartDate, UserId _userId, boolean _allCompanies, boolean _process = true ) { |
|
|
|
|
#2 |
|
Участник
|
Нашла. Надо правильно передавать название метода:
X++: returnValue = GatewayTransService::runAsUser(dataContract.userId(),
classNum(GatewayTrans),
staticMethodStr(GatewayTrans,processAs), //<--
[dataContract.Id(),
dataContract.CustAccount(),
dataContract.transDate(),
dataContract.revRecContractStartDate(),
dataContract.userId(),
dataContract.allCompanies(),
dataContract.process()]
); |
|
|
|
|
#3 |
|
Участник
|
Походу, не только это.
Важно чтобы параметры методы были контейнером, и возвращаемое значение тоже. Надеюсь, кому-то мой пример поможет. X++: RunAsPermission perm = new RunAsPermission(dataContract.userId()); perm.assert(); [returnValue] = runAs(dataContract.userId(), classNum(GatewayTrans), staticMethodStr(GatewayTrans,processAs), [dataContract.Id(), dataContract.CustAccount(), dataContract.transDate(), dataContract.revRecContractStartDate(), dataContract.userId(), dataContract.allCompanies(), dataContract.process()] ); CodeAccessPermission::revertAssert(); X++: class GatewayTrans { public static /*server*/ Container processAs(container args) { CustomId _Id; CustAccount _CustAccount; TransDate _transDate; TransDate _revRecContractStartDate; UserId _userId; boolean _allCompanies; boolean _process; [_Id,_CustAccount, _transDate,_revRecContractStartDate,_userId,_allCompanies,_process] = args; |
|
|
|
| За это сообщение автора поблагодарили: trud (5), sukhanchik (5). | |
| Теги |
| runas |
|
|
|