17.09.2020, 18:04 | #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 ) { |
|
17.09.2020, 22:46 | #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()] ); |
|
18.09.2020, 00:29 | #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 |
|
|