Показать сообщение отдельно
Старый 17.09.2010, 20:38   #1  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5803 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Дыра в запрете редактирования шапок заказов на продажу/покупку
Стандартный подход к тому, как регулировать доступ к полям записи, состоит в том, чтобы на обработчик 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.
За это сообщение автора поблагодарили: mazzy (2), KiselevSA (2), Logger (3), aidsua (2), MikeR (2), Sergey Petrov (1).