Всем, добрый день!
Задача:
На основе имеющегося в SalesTable заказа с типом «Журнал» необходимо создать собственно заказы. Имеем класс extends RunBase, в нем метод run, который и привожу.
На обработку по переменным _days, td, DateBegin и DateEnd не обращайте внимания, суть не в этом.
Проблема:
Алгоритм проходит на ура в 2-хзвенке. В 3-хзвенке тоже, если обрабатываемые «журналы» содержат одну строку, т.е. одну запись в SalesLine, и ОДНУ И ТУ ЖЕ НОМЕНКЛАТУРУ. Но если в «журнале» две и более строки или в следующем журнале ДРУГАЯ НОМЕНКЛАТУРА, то Аксапта выдает ошибку:
«Идентификатор номенклатуры не может быть заменен при наличии складских проводок
Модификации были отменены.»
Причем возникает она после salesLineNew.insert(); на ВТОРОЙ строке или на ПЕРВОЙ с НОВОЙ НОМЕНКЛАТУРОЙ в следующем «журнале», короче: когда меняется номенклатура!
В чем причина ошибки?
К сожалению человека, писавшего этот код нет сейчас в нашей команде. Да и если он откликнется, то, вряд ли сможет помочь, нет у него Аксапты под рукой  
 
	PHP код:
	
		
			
public void run()
{
    SalesTable  salesTable, salesTableNew;
    SalesLine   salesLine, salesLineNew;
    boolean     queryRunEmpty = true;
    QueryBuildDataSource qbd;
    Date   td;
    M039_SalePatternDayOfWeek   _sale;
    int     i;
    container   _days;
    DictTable       dictTable;
    DictField       dictField;
    SalesIDBase     salesIdBase;
;
    //добавлем в условие аналитику продавца
    qbd = queryRun.query().dataSourceNo(1);
    qbd.addRange(fieldId2Ext(fieldnum(SalesTable,dimension),1)).value(division.value());
//    info (qbd.toString());
    //пробегаем по выборке
    while (queryRun.next())
    {
        queryRunEmpty = false;
        salesTable = queryRun.get(tablenum(SalesTable));//преобразуем строку запроса к виду таблицы
        _sale = salesTable.M039_SalePatternDayOfWeek;
        _days = connull();
        for (i=1; i<=7; i +=1)
        {
            if (_sale[i])
                _days = conins(_days,conLen(_days)+1,i);//заполняем контейнер номерами дней недели из шаблона
        }
        td = DateBegin.value();
        while (td <= DateEnd.value())
        {
            if (confind(_days,dayofwk(td)))//нашли искомое
            {
//                info (date2str(td,123,2,2,2,2,4)+" "+int2str(dayofwk(td)));
                ttsbegin;
                salesTableNew.clear();
                //перепишем все поля из шаблона
                dictTable = new DictTable(tablenum(SalesTable));
                for (i=1;i<=dictTable.fieldCnt();i++)
                {
                    dictField = dictTable.fieldObject(dictTable.fieldCnt2Id(i));
                    salesTableNew.(dictField.id()) = salesTable.(dictField.id());
                }
                salesTableNew.initValue();
                salesIdBase = NumberSeq::newGetNum(SalesParameters::numRefSalesId()).num();
                salesTableNew.salesId      = salesIdBase;
                salesTableNew.salesType    = SalesType::Sales;
                for (i=1; i<=7; i +=1)
                {
                    salesTableNew.M039_SalePatternDayOfWeek[i] = false;
                }
                salesTableNew.M039_SalePatternDayOfWeek[dayofwk(td)] = true;
                salesTableNew.DeliveryDate = td;
                salesTableNew.insert();
//                ttscommit;
                //перепишем все строки шаблона
                while select salesLine where salesLine.SalesId == salesTable.SalesId /*order by LineNum*/
                {
//                    ttsbegin;
                    SalesLineNew.clear();
                    //перепишем все поля из строк шаблона
                    dictTable = new DictTable(tablenum(SalesLine));
                    for (i=1;i<=dictTable.fieldCnt();i++)
                    {
                        dictField = dictTable.fieldObject(dictTable.fieldCnt2Id(i));
                        salesLineNew.(dictField.id()) = salesLine.(dictField.id());
                    }
                    salesLineNew.initValue();
                    salesLineNew.initFromSalesTable(salesTableNew);
                    salesLineNew.M039_PatternQty = salesLine.SalesQty;
//                    salesLineNew.salesId      = salesIdBase;
//                    info (salesIdBase);
                    salesLineNew.insert();
//                    ttscommit;
                }
            ttscommit;
            }
            td = td + 1;
        }
    }
    if (queryRunEmpty)
    {
        info ("Неправильно заданы условия выбора шаблона по созданию заказов. Шаблон не найден.");
    }
}