Переписал так, без промежуточного буфера, всё равно долго
X++:
ttsbegin;
while select forupdate rowQuota
{
monthDiff = intvNo(rowQuota.DateTo, rowQuota.DateFrom, IntvScale::Month);
dayDiff = intvNo(rowQuota.DateTo, rowQuota.DateFrom, IntvScale::Day);
if(rowQuota.UsagePeriod <= monthDiff && dayDiff > 0)
{
do
{
rowQuota.DateFrom = dateMthFwd(rowQuota.DateFrom, rowQuota.UsagePeriod);
rowQuota.DatePotreb = rowQuota.DateFrom;
rowQuota.insert();
monthDiff = intvNo(rowQuota.DateTo, rowQuota.DateFrom, IntvScale::Month);
dayDiff = intvNo(rowQuota.DateTo, rowQuota.DateFrom, IntvScale::Day);
}
while(rowQuota.UsagePeriod <= monthDiff && dayDiff > 0);
}
}
ttscommit;