Показать сообщение отдельно
Старый 09.11.2020, 10:29   #11  
Dreadlock is offline
Dreadlock
Участник
Аватар для Dreadlock
 
298 / 219 (8) ++++++
Регистрация: 07.05.2009
Адрес: Москва
Цитата:
Сообщение от Logger Посмотреть сообщение
В 2012-й аксапте обнаружился неприятный баг.
Если клиент запущен с параметром -noauto или при старте клиента произошла ошибка в new() методе какого-либо системного класса (т.е. он не создался) например (Application, Info, ClassFactory)
то дальше происходит очень неприятная вещь.

Если в коде идет проверка на существование системного класса, например
X++:
if (classFactory)
{
   ...
}
то для клиентского исполнения все ок.
А для серверного происходит ошибка времени выполнения, как будто мы не просто проверяем глобальный экземпляр на существование, но и сразу вызываем на нем метод. Причем try catch это хоть и ловит но выскакивает Message Box, который невозможно подавить параметром командной строки -INTERNAL=NOMODALBOXES

Как следствие в случае проблем с приложением нельзя спокойно запустить клиент с параметром -NOAUTO и сделать глобальную компиляцию. (При компиляции Query идут вызовы методов
\Classes\SysQueryRangeUtil\currentWorker
\Classes\SysQueryRangeUtil\currentRoleHasAccessToPrivate
и.т.п. которые порождают проверку на classFatory и компиляция выдает ошибку с messagebox-ом и компиляция останаливается.
Стек вызовов такой
(S)\Classes\Global\currentWorker - line 15
(S)\Data Dictionary\Tables\DirPersonUser\Methods\currentWorker - line 9
(S)\Classes\SysQueryRangeUtil\currentWorker - line 9
(S)<runtime compiled code>\anytype wrapper(){ return SysQueryRangeUtil::currentWorker(); }
)

Кто-нибудь встречался с подобным поведением ?
Как можно в серверном коде безопасно проверить classFactory на существование ?
X++:
if (classFactory)
приводит к ошибке времени выполнения.
Году так в 2011 я в 2009 Ах решал проблему определения запуска SRS отчета из клиента или с портала и наткнулся на Global::clientKind() метод. Можете попробовать его до вызова строки
X++:
if (classFactory)
Точнее не сам метод использовать а тип ClientType