Цитата:
Сообщение от
miklenew
Нашёл.
Была форма о которой я даже и не знал.
Она делила строки журнала, в текущем уменьшала количество и выносила их в другой журнал.
Ошибка была когда количество из текущего журнала полностью выносилось в другой журнал.
В ней был такой код
X++:
if (!inventTrans.Qty)
inventTrans.delete();
else
inventTrans.update();
На первый взгляд безобидный.
Только при qty = 0 inventTrans удалялся, а InventSum не пересчитывался. Понятно почему, количество то ноль.
Сделал так
X++:
if (!inventTrans.Qty)
{
inventTrans.update();
inventTrans.delete();
}
else
inventTrans.update();
Ошибка исчезла.
Ого !
Получается что в InventTrans.delete() есть ошибка.
Вместо вызова
X++:
if (InventSum::mustInventTransBeUpdated(this))
{
inventSum = appl.inventUpdateTTSControl().inventSumSelectLocked(this);
inventSum.updateInventTrans(this,NoYes::No);
}
правильнее поставить
X++:
if (InventSum::mustInventTransBeUpdated(this.orig()))
{
inventSum = appl.inventUpdateTTSControl().inventSumSelectLocked(this.orig());
inventSum.updateInventTrans(this.orig(),NoYes::No);
}
Потому что иначе легко развалить связку InventSum и InventTrans - что собственно и произошло в вашем примере. Сперва отредактировали количество в проводке, поняли что оно 0 и update() ни к чему - вызвали delete() и получили ошибку, там где не ожидали.
Delete() должен работать на основе значений которые лежат в базе, а не в текущем буфере.
В принципе нечто подобное сделано в методе inventTrans.update() - сперва из InventSum вычитаются значения this.orig() а затем прибавляются значения this. Нужно было код перенести убрав прибавку this но оставив вычитание this.orig() Т.е. автор InventTrans.delete() неявно заложился на то что удаляемый InventTrans перед удалением не редактировался.