В совете Сергея Пикина показано как программно добавить строку в складской журнал. Огромное спасибо Максиму Горбунову за ценные замечания и критику кода. Проект почти полностью переделан по совету Максима.

tInventTransAddJob_RNR.xpo (Проект для Axapta 3.0, 3.2Kb, Для загрузки требуется регистрация на форуме у Mazzy)

Сергей Пикин, pikin@rabota-na-rezultat.ru
Максим Горбунов (Maxim Gorbunov)

При работе с журналами в Axapta довольно часто возникает необходимость создания собственных процедур для формирования строк журнала. Примером могут служить складские журналы модуля «Управление запасами». В большинстве из них строки создаются вручную, а это не всегда быстро и удобно, в некоторых журналах возникает задача создания строк журнала, основываясь на внешних данных других систем и т.д.

Мы не будем досконально рассматривать весь цикл программного формирования журнала в Axapta, а рассмотрим небольшую задачу программного добавления строки журнала в уже существующий журнал инвентаризации.

Основные таблицы:

Пример:

// Job добавляет одну строчку в журнал инвентаризации:
// номер журнала - макрос JournalNum
// идентификатор номенклатуры - макрос ItemId
// инвентаризированное кол-во - макрос QtyCounted
static void InventTransAddJob_RNR(Args _args)
{
  //Определяем константы
  #Define.JournalNum("000015_061")
  #Define.ItemId("ESB-007")
  #Define.LocationId("MW")
  #Define.QtyCounted(101)

  //Определяем переменные
  InventJournalTrans inventJournalTrans;
  InventJournalTable inventJournalTable;
  InventTable inventTable;
  InventDim inventDim;
;
  //Находим соответствующую номенклатуру
  inventTable = inventTable::find(#ItemId);
  if (!inventTable) throw error("Не найдена номенклатура!");

  ttsbegin;
  //Находим соответсвующий журнал (!!! Внимание - Журнал должен быть создан заранее.)
  inventJournalTable = inventJournalTable::find(#JournalNum, true);
  if (!inventJournalTable) throw error("Не найден журнал!");
  
  //Очищаем поля в строке журнала
  inventJournalTrans.clear();
  
  //Заполняем значениями по-умолчанию
  inventJournalTrans.initFromInventJournalTable(inventJournalTable);
  inventJournalTrans.initFromInventTable(inventTable);
  inventJournalTrans.transDate = systemDateGet();
  
  //Инициализируем складскую аналитику
  //В реальном примере инициализация аналитики должна быть более умной
  // Берем уже заполненную на этапе инициализации аналитику из строки
  inventDim = inventJournalTrans.inventDim();
  inventDim.InventLocationId = #LocationId;

  // Устанавливаем склад
  inventDim = inventDim::findOrCreate(inventDim);
  inventJournalTrans.inventDimId = inventDim.inventDimId;

  //Обратите внимание на этот хитрый вызов
  //В Аксапте есть целое семейство классов для работы со скласдкими журналами разных типов
  //В базовом классе метод journalSetInventDimField устанавливает цены и накладные расходы
  //Для журнала инвентаризации в этом методе рассчитывается inventOnHand
  //См. InventMov_Jour_Loss_SumUp.journalSetInventDimField()
  inventJournalTrans.inventMovement().journalSetInventDimField(inventDim, fieldNum(InventDim, InventLocationId));
  
  //Запишем значение инвентаризированного количества
  inventJournalTrans.Counted = #QtyCounted;
  inventJournalTrans.inventMovement().JournalSetCounted();
  
  //Подсчитаем итоги по журналу
  // В этот момент вычисляется ваучер и обновляются итоги по журналу
  inventJournalTrans.insertFromCode();
  info("Все записано!");
  ttscommit;
}

Результат работы данного примера можно посмотреть, открыв форму отображения строк соответствующего журнала.

В дальнейшем, используя данный пример, можно создать свой класс, обладающий необходимыми интерфейсами и использовать его, скажем при создании журнала инвентаризации из внешнего файла (см. рис.)

Пример создания строк журнала из внешнего источникаПример создания строк журнала из внешнего источника

Диалог при создании строк журнала из внешнего источникаДиалог при создании строк журнала из внешнего источника

Сергей Пикин, pikin@rabota-na-rezultat.ru

Дополнение от Maxim Gorbunov (15.10.05)

Отличное дополнение высказал Maxim Gorbunov. В результате его дополнения пример полностью переписан. См. обсуждение на форуме.