Показать сообщение отдельно
Старый 15.10.2005, 12:58   #3  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 646 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Вместо
Код:
inventJournalTrans.JournalId            = #JournalNum;
inventJournalTrans.JournalType          = inventJournalTable.JournalType;
правильнее было бы использовать
Код:
journalTransData.initFromJournalTable();
В этом случае будут так же инициализированы поля EmplId и LedgerAccountIdOffset. Возможно, для данного примера это не принципиально. Тем не менее стоит учитывать, что в дальнейшем возможны изменения приложения, которые затронут как раз процедуру создания строк журналов (например, в строки журнала будет добавлено новое поле, которое будет инициализироваться из заголовка журнала). Тогда после такого обновления Вам придется переписывать Вашу процедуру создания строк, чтобы включить в нее новую логику работы.
Кстати, можно обойтись без всех этих ритуальных танцев в JournalTableData и JournalTransData, а просто использовать
Код:
inventJournalTrans.initFromInventJournalTable(inventJournalTable);
Аналогично, вместо
Код:
inventJournalTrans.itemId               = inventTable.itemId;
inventJournalTrans.dimension            = inventTable.dimension;
inventJournalTrans.projCategoryId       = inventTable.projCategoryId;
лучше
Код:
inventJournalTrans.initFromInventTable(inventTable);
А вот так делать не стоит:
Код:
//Инициализируем складскую аналитику
...
Дело в том, что складскую аналитику таким образом Вы полностью затрете своим складом. А как быть с конфигурацией, например? В общем, перед тем, как инициализировать складскую аналитику, неплохо бы добавить еще одну строчку:
Код:
inventDim = inventJournalTrans.inventDim();
Код:
//Инициализируем активную аналитику из настроке журнала для расчета количества
    inventDimParm = InventJournalTable::journalId2inventDimParm(inventJournalTable.JournalId);

    //*** Специфика заполнения строки для журнала инвентаризации ***
    //Подсчитаем и запишем значение количества запасов в наличии на текущую дату
    inventJournalTrans.inventOnHand = InventSumDatePhysicalDim::onHandQty(
                                          inventJournalTrans.transDate,
                                          inventJournalTrans.itemId,
                                          inventDim,
                                          inventDimParm);
Очень сложно. Можно просто вот так:
Код:
inventJournalTrans.inventMovement().journalSetInventDimField();
Код:
//Заполним номер документа ГК (если необходимо)
if (inventJournalTable.voucherDraw == JournalVoucherDraw::Entering)
    journalTransData.initVoucher(voucher_last,false);

//Присвоим номер строки журнала
inventJournalTrans.lineNum  = InventJournalTrans::lastLineNum(#JournalNum) + 1;

//Добавим запись
// !!! Внимание - по умолчанию при добавлении записи в строку журнала формируется
// складская проводка. Чтобы этого избежать, необходимо вызывать insert c параметром true.
inventJournalTrans.insert();

//Подсчитаем итоги по журналу
journalTransData.addTotal(false,false);
Опять же, все придумано до нас. Используйте
Код:
inventJournalTrans.insertFromCode();
Кроме того, не понял, а почему может понадобиться не создавать складскую проводку при создании журнала?

В целом, хотелось бы отметить, что для работы с журналами в Аксапте уже существует очень широкий набор функций. Создание строк журнала из кода - вполне типичная задача, которая решена много раз. Стоит посмотреть, как это делается в стандартном приложении.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me