Показать сообщение отдельно
Старый 31.03.2008, 14:12   #7  
Starling is offline
Starling
Участник
Дети Юза
 
530 / 76 (4) ++++
Регистрация: 20.10.2005
Адрес: Kiev
Нашел я, то место в коде, которое приводит к возникновению ошибки.
Для начала, привожу более короткую цепоку действий, приводящую к ошибке:
1. Создаем новую номенклатуру, заполняем все обязательные поля
2. Сохраняем запись (это обязательно)
3. Меняем какие либо поля, относящиеся к таблице InventTable
4. Переходим на закладку Цена/Скидка и меняем цену в группе полей «Заказ на продажу»
5. Сохраняем запись – все изменения, сделанные на шаге 3, будут потеряны

Ошибка кроется в методе update таблицы InventTableModule.
X++:
void update(boolean _updatePriceDate = true)
{
    boolean updPrice;
    FormRun         formRun;
    FormObjectSet   formObjSet;
    int     i;

    if (this.orig().Price     != this.Price     ||
        this.orig().Markup    != this.Markup    ||
        this.orig().PriceUnit != this.PriceUnit)
    {
        updPrice        = true;

        if (_updatePriceDate)
            this.PriceDate  = systemdateget();
    }

    ttsbegin;

    super();

    if (updPrice)
    {
        if (this.ModuleType != ModuleInventPurchSales::Sales)
            InventTable::updateAutoSalesPrice(this.ItemId, this.PriceDate);
        else
        {
            if (this.isFormDataSource())
            {
                InventTable::updateAutoSalesPercent(this.ItemId);

                // refresh and reread inventTable datasource if exists in form
                formRun = this.dataSource().formRun();
                for (i=1; i<= formRun.dataSourceCount(); i++)
                {
                    if (formRun.dataSource(i).cursor().TableId == tablenum(InventTable))
                    {
                        formObjSet = formRun.dataSource(i);
                        break;
                    }
                }
//вот это приводит к ошибке -->
                if (formObjSet)
                {
                    formObjSet.refresh();
                    formObjSet.reread();
                }
//вот это приводит к ошибке <--
            }
        }
    }

    ttscommit;
}
Дело в том, что update таблицы InventTableModule вызывается раньше update таблицы InventTable. Соответсвенно вызов:
X++:
//вот это приводит к ошибке -->
                if (formObjSet)
                {
                    formObjSet.refresh();
                    formObjSet.reread();
                }
//вот это приводит к ошибке <--
приводит к тому, что все изменения пользователя слетают.
Если просто закомментировать код, то ошибка исчезнет, но он там для чего-то был написан.

Кто, что может посоветовать?