Стандартный подход к тому, как регулировать доступ к полям записи, состоит в том, чтобы на обработчик formDS.active() повесить некую логику, которая, скажем, будет управлять свойством formDS.allowEdit(). Примерно так же сделано в заказах на продажу и покупку, скажем, в SalesTable_DS.active() вызывается
X++:
element.editSales(salesTableForm.editHeaderAllowed());
и почти наверняка на каждом проекте в этой логике есть свои модификации. Так вот, в формах SalesTable/PurchTable создание новых заказов реализовано таким образом, что в этом стандартном подходе появляется зияющая дыра. Взглянем на код SalesTable_DS.create():
X++:
void create(boolean append = true)
{
SalesTable newSalesTable;
;
salesTableForm.interCompanyAutoCreateOrders();
element.editSales(true);
if (salesTableForm.create())
{
newSalesTable = SalesTable::find(salesTableForm.newSalesId());
if (newSalesTable)
{
super(append);
salesTable.data(newSalesTable);
salesTable_ds.reread();
tabLineOverview.setFocus();
}
}
else
{
element.editSales(salesTableForm.editHeaderAllowed(), salesTableForm.deleteHeaderAllowed());
}
}
Занятно здесь то, что возврат из salesTableForm.create() после безусловного разрешения редактирования
текущего заказа происходит отнюдь не мгновенно, а лишь после того, как пользователь закроет форму создания заказа. В это время можно переключиться обратно на форму заказов и - о, чудо! - увидеть, что благодаря вызову element.editSales(true) шапка заказа независимо от его статуса стала доступна для редактирования. Конечно, на validateWrite() и write() остались проверки, которые могут воспрепятствовать изменению, к примеру, заказа в статусе "Отгружено", но сам факт того, что есть штатная возможность обойти логику, управляющую доступом к шапке заказа, как-то удручает. Эти рассуждения в равной степени касаются PurchTable, причем что в 3.0, что в AX 2009.
Решение у проблемы весьма простое: нужно в create() перенести вызов element.editSales(true) внутрь if непосредственно перед super() и аналогично поступить с вызовом element.editPurch(true) в форме PurchTable.