Доброго времени суток!
DAX2009. Заказ на продажу - Разноска накладной, в окне "Количество" выбираем "Отборочная накладная" - вылетает инфолог не могу записать в SalesParmSubLine, запись уже существует.
Не буду перегружать инфой как всё это происходит, корень зла обнаружен в SalesFormLetter_Invoice.reselect(). В цикле формируются записи в SalesParmLine и SalesParmSubLine, и получается что создаются лишние записи, обычно 2 или 3.
Всё дело в том, что вот какой там цикл:
X++:
while select forceplaceholders _salesParmTable
where _salesParmTable.ParmId == salesParmUpdate.ParmId
join forupdate _salesParmSubTable
where _salesParmSubTable.ParmId == _salesParmTable.ParmId &&
_salesParmSubTable.TableRefId == _salesParmTable.TableRefId
В нормальной ситуации есть у нас например по одной записи из каждой таблицы, соответственно должна быть одна итерация. Но что происходит. Там во внутренней функции updateSalesParmSubTable() есть участок:
X++:
_salesParmSubTable.doUpdate();
что приводит к повторному выполнению итерации, из-за чего и создаются лишние строки.
Честно говоря, до этого момента не знал о такой особенности. Специально отдельным джобом попробовал имитировать такую ситуацию, действительно, возникает лишняя итерация в while select, если происходит обновление записи.
Причем, это возникает только если код выполняется на сервере, такой момент.
Что я делаю не так, что алгоритм именно так отрабатывает? Специально проверил - код на стандартных слоях, т.е. нет "вмешательства" со стороны модификаций. Значит - что? Неправильное использование функциональности? Но то что приводит к красному инфологу "Ошибка записи"... Странно как-то, возникают мысли о
теории заговора глюке в стандарте.
P.S. Если в предформе изначально стоит количество "Отборочная накладная", такой ошибки не происходит, что логично, т.к. тут алгоритм по несколько другим путям отрабатывает.
Объясните плиз, в чем тут подвох?