Рискну предположить, что custAccount должен быть заполнен
обязательно только, если CustType = MarkupType::LedgerAccount,
обязательно быть пустым, если CustType = MarkupType::CustVend, и может быть заполнено, а может быть и нет для CustType = MarkupType::Item. (вроде логичная предпосылка

).
Теперь разложим if - как это сделал S.Kuskov
Цитата:
if (A && B) // (1) сюда попадём если условие A = true и B = true
else
{
if (B) // (2) сюда попадём если условие A = false, a B = true
}
В нашем случае, мы попадаем в else :
либо A = false и B = true,
либо наоборот A = true, B = false,
либо A и B = false - одновременно;
где
X++:
A = this.CustType != MarkupType::LedgerAccount
B = (this.CustType != MarkupType::Item || !PurchParameters::find().PostChargeAccount)
A и B = false - одновременно, говорят, что это тип номеклатура с галкой PostChargeAccount => можешь задавать CustAccount, а можешь и нет(вот тут не совсем ясно, обязательно ли должно быть заполнено поле CustAccount, если да, то ошибка в проверке, если может быть заполнено, а может быть и нет, то все вроде ок)
В случае, когда A или B - false, соответственно нужно проверять заполненость custAccount, когда CustType = MarkupType::LedgerAccount, т.е. когда A = false и B = true => писать в коде либо if (! A), либо if (B) - выбран второй вариант, почему так, сказать сложно, конечно нагляднее написать проверку :
X++:
if (this.CustType = MarkupType::LedgerAccount)
но работать будет одинаково.