Показать сообщение отдельно
Старый 25.10.2009, 00:35   #30  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,889 / 3165 (113) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Попробовал сделать более универсальную защиту от переключения компаний.

Для этого делаем такие изменения :
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 нужен если обработка прервалась и отмена запрета переключения не была вызвана (например по ошибке).