Указанная проверка должна отработать нормально только один раз
X++:
ok = RAssetTable::find(this.ItemId).isOkToSell(this.creditNoteLine());
Выше вполне нормальная проверка... проверяет от статуса ОС можно ли его продать или вернуть, а вот:
X++:
salesLineTmp = SalesLine::findAsset_RU(this.AssetId_RU, this.creditNoteLine());
if (salesLineTmp && salesLineTmp.RecId != this.RecId)
ok = checkFailed(strfmt("@FAV1297", salesLineTmp.SalesId));
Бредовая проверка... так как findAsset_RU ищет SalesLine с таким же ОС и если раз хотя бы продали, то второй продать нельзя, даже если отсторнировали и если хоть раз сторнировали, то второй раз никак. Кроме того ни проверки статусов, ни мысли об удалении строк SalesLine разработчикам в голову не пришли...
Потому вопрос... сколько раз сторнировали? Или в строках несколько номенклатур привязанных к одному ОС?
Обойдя эту "умную" проверку идем далее...
Попадаем в SalesFormLetter_Invoice метод updateNow и видим следующее...
X++:
// <GEEU>
if (salesLine.AssetId_RU)
{
assetInvent = new InventMov_AssetSale_ru(salesLine);
if (assetInvent.canDisposal())
{
estimated = InventUpd_Estimated::newInventMovement(assetInvent);
estimated.updateNow();
inventUpd_Financial = InventUpd_Financial::newPostAsset_RU(assetInvent, ledgerVoucher);
inventUpd_Financial.parmCurrencyCode(CompanyInfo::standardCurrency());
inventUpd_Financial.updateNow();
}
}
// </GEEU>
inventMovement = InventMovement::construct(salesLine);
Цитата:
но теперь вышла, следующая, что нет на складе количества. Хотя у меня уже идет приход на склад
Ошибку получаем в inventUpd_Financial.updateNow();
Класс движения: InventMov_AssetSale_ru, который должен выполнить какие-то действия помимо inventMovement = InventMovement::construct(salesLine); что мне непонятно...
Заглянув в new InventMov_AssetSale_ru видим:
X++:
if (_salesLine.creditNoteLine())
{
select firstonly inventTransOrig
where inventTransOrig.InventTransId == _salesLine.InventTransId &&
inventTransOrig.StatusReceipt == StatusReceipt::Ordered &&
inventTransOrig.StatusIssue == StatusIssue::None;
transQty = -1;
}
else
{
select firstonly inventTransOrig
where inventTransOrig.InventTransId == _salesLine.InventTransId &&
inventTransOrig.StatusIssue == StatusIssue::OnOrder &&
inventTransOrig.StatusReceipt == StatusReceipt::None;
transQty = 1;
}
Я почему-то думал что для сторно transQty должно быть 1, для продажи -1, а тут наоборот...
Поменял... сторно разнеслось... но теперь не разноситья продажа...

Понимаю, что ничего не понимаю... поставил
transQty = 1 и для сторно и для не сторно...
Все разноситься... и сторно и не сторно, но проверял только для номенклатур с типом ОС (ItemType::Asset_RU) с одной строкой, при этом есть один нюанс... сторно в ГК ложится с разными ваучерами... по счетам ОС (01, 02) со старым ваучером продажи... сторно продаж с новым...

В ОС вроде тоже все нормально...
Получилось лечение последствия методом ненаучного тыка... без понимания сути происходящего, если кто может объяснить буду благодарен...