Показать сообщение отдельно
Старый 07.11.2020, 21:16   #6  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,867 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
В 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)
приводит к ошибке времени выполнения.

Последний раз редактировалось Logger; 07.11.2020 в 21:50.