Пометка проводок для рассопоставления по клиентам в AX 2009 как-то очень уж тормозила. Оказалось, что дело было в двух э... особенностях локализации. Во-первых, метод \Data Dictionary\Tables\CustAdvanceInvoiceSettlement_W\Methods\existsCustSettlement слишком "расплывчато" понимает связь между строками и шапкой накладных:
X++:
if (custInvoiceJour && paymentVoucher && paymentDate)
{
select sum(LineAmount) from salesLine join custInvoiceTrans
where salesLine.RefReturnInvoiceTrans_W == custInvoiceTrans.RecId &&
custInvoiceTrans.InvoiceId == custInvoiceJour.invoiceId;
if (abs(salesLine.LineAmount) < abs(custInvoiceJour.InvoiceAmount))
// ...
Из-за этого план запроса получается какой-то, мягко говоря, диковатый (не говоря уже про корректность выборки), но это быстро лечится "уточнением" связи согласно relation'у, чтобы начал хвататься и нормально использоваться подходящий индекс. Во-вторых, по CustSettlement потом уходил запрос, где не было упоминаний dataareaid, и ему очень подошел бы индекс OffsetTransIdx_RU (OffsetRecid, TransRecId), если бы не это поле на первом месте. Это вылечилось перемещением dataareaid в индексе на последнее место, что сделать оказалось совсем просто, см.
эту тему.
AX 2009 SP1 EE RU5 (5.0.1500.2985)