Показать сообщение отдельно
Старый 02.03.2011, 13:47   #20  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,875 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Если уж начали перечислять баги закрытия, то добавлю свои 5 копеек.
В методах
\Classes\ClassFactory\inventLastClosingDate
\Classes\ClassFactory\inventLastClosingDateSecCur_RU

некорректно сделано кеширование даты последнего закрытия склада.
Оно не учитывает тот факт, что закрытие склада выполняется в конкретной компании. Поэтому если мы поработали в одной компании, в которой период закрыт, а потом переключаемся в другую, в которой период не закрыт, и пытаемся в этом периоде разносить что-то - то получаем ошибку.

Лечится например так :
X++:
TransDate inventLastClosingDate(boolean  reSelect = false)
{
    // GRD_FixLastClosingDateCalc_pkoz // pkoz 16.01.2011 -->
    // проект GRD_FixLastClosingDateCalc_pkoz сделан для того чтбы исправить кеширование даты последнего закрытия склада
    // это кеширование не учитывало компанию, так что если, например, у нас в одной компании
    // склад закрыт по одоной число, а в другой по другое, то аксапта могла для обоих компаний считать дату одинаковой -
    // в случае если сперва метод вызвали в одной компании,  а потом в другой
    #define.GRD_date("_date")
    #define.GRD_integer("_integer")
    sysglobalCache      GRD_globalCache = this.globalCache(); // получаем через метод так как может оказаться неинициализированным
    // GRD_FixLastClosingDateCalc_pkoz // pkoz 16.01.2011 <--
    ;

    // GRD_FixLastClosingDateCalc_pkoz // pkoz 16.01.2011 -->
    inventLastClosingDate   = GRD_globalCache.get(funcname() + #GRD_date,    curExt(), dateNull());
    inventClosingTtsVersion = GRD_globalCache.get(funcname() + #GRD_integer, curExt(), 0);
    // GRD_FixLastClosingDateCalc_pkoz // pkoz 16.01.2011 <--

    if (inventClosingTtsVersion != appl.ttsVersion() || reSelect || (!inventClosingTtsVersion && !inventLastClosingDate))
    {
    // pkoz 02.01.2009 -->
    // слишком много коррекций накопилось - так будет быстрее
//      inventLastClosingDate = (select maxOf(transDate) from inventClosing
        inventLastClosingDate = (select forceliterals maxOf(transDate) from inventClosing
    // pkoz 02.01.2009 <--
                                    index hint TypeActiveIdx
                                    where inventClosing.active                 == NoYes::Yes &&
                                          // <GEEU>
                                          inventClosing.InventTransCurrency_RU == InventTransCurrency_RU::PrimaryCur &&
                                          // </GEEU>
                                          inventClosing.adjustmentType  == InventAdjustmentType::Closing).transDate;

        inventClosingTtsVersion  = appl.ttsVersion();

        // GRD_FixLastClosingDateCalc_pkoz // pkoz 16.01.2011 -->
        GRD_globalCache.set(funcname() + #GRD_date,    curExt(), inventLastClosingDate);
        GRD_globalCache.set(funcname() + #GRD_integer, curExt(), inventClosingTtsVersion);
        // GRD_FixLastClosingDateCalc_pkoz // pkoz 16.01.2011 <--

    }

    return inventLastClosingDate;
}