skaa написал(а):
Вроде, оператор NOT должен использоваться к какому-то логическому выражению, а не к переменной.
Да, но в качестве логического выражения может выступать переменная. Запись вида IF ( A ) эквивалентна выражению IF ( A = true ). В стартовом сообщении следует считать выражение как
Code:
IF ( NOT(Shipments.ShipmentsTab.DATA[0].SHPMNT_DOC_NUM) = true and tab_row_count <= 1 ) then
В языках с неявным преобразованиям к логическому типу писать выражение полностью ( A = true ) смысла нет, поэтому получается просто ( A ).
В описанном фрагменте выражение неоднозначность не с оператором NOT, а в приведении выражения к boolean. В том же описании к FormCalc:
When performing Boolean operations on non-Boolean operands, the non-Boolean operands are first promoted to their Boolean equivalent. If the non-Boolean operand does not successfully convert to a nonzero value, its value is true (1); otherwise its value is false (0). When promoting null-valued operands to a Boolean value, that value is always false (0). For example, the expression:
Code:
"abc" | 2
evaluates to 1. That is, false | true = true, whereas
Code:
if ("abc") then
10
else
20
endif
evaluates to 2То есть, если в SHPMNT_DOC_NUM содержится число, то оно может быть приведено к boolean ( 0 - false, иначе - true). Если в SHPMNT_DOC_NUM не число, то оно всегда false. Оператор NOT просто инвертирует полученное значение.