Конгениально!
Похоже, все и правда можно решить настройками. У меня вроде как все рассосалось после подкручивания данных в TimeZonesRulesData вот таким джобом (запускать его надо на сервере!):
X++:
#macrolib.TimeConstants
#define.NewRuleId1 (61002)
#define.NewRuleId2 (61003)
TimeZonesRulesData tzRuleData;
;
if (!isRunningOnserver())
{
throw error( @"Код должен выполняться на сервере" );
}
new SkipAOSValidationPermission().assert();
ttsbegin;
tzRuleData.skipAosValidation( true );
select firstonly forupdate tzRuleData
where tzRuleData.RuleId == #NewRuleId1
;
if (!tzRuleData)
{
tzRuleData.clear();
tzRuleData.initValue();
}
tzRuleData.RuleId = #NewRuleId1;
tzRuleData.TzEnum = Timezone::GMTPLUS0300MOSCOW_STPETERSBURG_VOLGOGRAD;
tzRuleData.Bias = -180;
tzRuleData.Year = 2011;
tzRuleData.SYear = tzRuleData.Year;
tzRuleData.SMonth = MonthsOfYear::December;
tzRuleData.SDay = dayOfMth( endMth( mkDate( 1, tzRuleData.SMonth, tzRuleData.SYear ) ) );
tzRuleData.SHour = #hoursPerDay - 1;
tzRuleData.SMinute = #MinutesPerHour - 1;
tzRuleData.SSecond = #secondsPerMinute - 1;
tzRuleData.DYear = tzRuleData.Year;
tzRuleData.DMonth = MonthsOfYear::March;
tzRuleData.DDay = 27;
tzRuleData.DHour = 2;
tzRuleData.DBias = -60;
// NB! не вызываем validateWrite(), потому что ВСЕ поля в таблице обязательны к заполнению
tzRuleData.write();
select firstonly forupdate tzRuleData
where tzRuleData.RuleId == #NewRuleId2
;
if (!tzRuleData)
{
tzRuleData.clear();
tzRuleData.initValue();
}
tzRuleData.RuleId = #NewRuleId2;
tzRuleData.TzEnum = Timezone::GMTPLUS0300MOSCOW_STPETERSBURG_VOLGOGRAD;
tzRuleData.Bias = -240;
tzRuleData.Year = 2012;
// NB! не вызываем validateWrite(), потому что ВСЕ поля в таблице обязательны к заполнению
tzRuleData.write();
ttscommit;
info( strfmt( @"Данные в %1 обновлены", tablestr(TimeZonesRulesData) ) );