Попробовал сделать более универсальную защиту от переключения компаний.
Для этого делаем такие изменения :
1. Заводим где-нибудь статический метод
X++:
// pkoz 24.10.2009
static
//client
server
boolean GRD_changeCompanyForbidden(boolean _parm = false, boolean _flush = false)
{
// SysGlobalCache SysGlobalCache = infolog.globalCache();
SysGlobalCache SysGlobalCache = appl.globalCache();
boolean ret;
int retI;
;
retI = SysGlobalCache.get(funcName(), 0, 0);
if (!prmIsDefault(_parm)) // пишем
{
if (_parm)
{
retI++;
}
else
{
retI--;
}
SysGlobalCache.set(funcName(), 0, retI);
}
if (retI < 0 || _flush)
{
SysGlobalCache.set(funcName(), 0, 0);
return false;
}
if(retI > 0)
return true;
return false;
}
у себя я добавил его на класс SysSetupFormRun
2. Создаем класс для сброса настроек состоящий из одного метода main
X++:
// GRD_changeCompanyFix_pkoz // pkoz 24.10.2009
static void main(args _args)
{
;
SysSetupFormRun::GRD_changeCompanyForbidden(false, true);
}
ставим его вызов в меню, например в "Сервис - Разрешить смену компаний". Вызов этого пункта будет отменять все запреты по переключению компаний.
3. Вносим изменение в метод \Classes\Application\setDefaultCompany
X++:
SysGlobalCache cache = appl.globalCache();
container GRD_stack = xSession::xppCallStack(); // pkoz 24.10.2009
if (//GRD_isPkoz() &&
(
conPeek(GRD_Stack, 3) == @"(C) \Classes\FormRun\activate" // в трехзвенке
|| conPeek(GRD_Stack, 3) == @"\Classes\FormRun\activate" // в двухзвенке
)
&& SysSetupFormRun::GRD_changeCompanyForbidden()
)
{
warning("Запрещено переключение между компаниями. Для исправления выберите Меню Сервис - Разрешить смену компаний");
return false;
}
ret = super(_selectableDataArea);
далее перед запуском какой либо обработки, успешному выполнению которой мешало спонтанное переключение между компаниями, ставим вызов
X++:
SysSetupFormRun::GRD_changeCompanyForbidden(true);
после выполнения
X++:
SysSetupFormRun::GRD_changeCompanyForbidden(false);
теперь не будет переключения между компаниями. Можно не отключать окна прогресс бара, принтера и т.п.
Пункт 2 нужен если обработка прервалась и отмена запрета переключения не была вызвана (например по ошибке).