AXForum  
Go Back   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Forgotten Your Password?
Register Forum Rules FAQ Members List Today's Posts Search

 
 
Thread Tools Search this Thread Display Modes
Prev Previous Post   Next Post Next
Old 06.12.2012, 10:53   #1  
Kainix is offline
Kainix
Участник
 
47 / 96 (4) ++++
Join Date: 22.11.2007
Создание проводок в ГК
Сижу разбираюсь с классами LedgerBond, для себя написал краткое описание работы разноски, решил выложить мало ли кому понадобится

Для того чтобы создать проводки в Главную книгу из произвольного места нужно организовать примерно следующий код.
1. Метод инициализации объектов. Основной объект необходимый для разноски LedgerVoucher.

Краткое описание LedgerVoucher. Это класс который аккумулирует, классы LedgerVoucherObject, он записывает их в класс LedgerVoucherList, основанный
на мапе вида [Voucher -- LedgerVoucherObject], а класс является оберткой данной структуры, с методами ввода вывода и поиска.
В свою очередь LedgerVoucherObject состоит из объектов LedgerVoucherTransObject. LedgerVoucherTransObject - содержит в себе LedgerTrans, и параметры разноски. LedgerVoucherObject хранит LedgerVoucherTransObject, с помощью класса LedgerVoucherTransList, в основе которого лежит Map вида [номер по порядку -- LedgerVoucherTransObject]
Т.е. как видно из структуры самый младший элемент в иерархии LedgerVoucherTransObject, мы в него записываем параметры, а он создает табличный курсор LedgerTrans, и заполняет необходимые поля исходя из входящих параметров.
Исходя из этого нужно инициализировать LedgerVoucher, и заполнить его. (Я буду приводить примеры из блока налогового учета).

Схема

X++:
protected void initLedgerVoucher()
{
	NumberSeq            numberSeq; 	// номерная серия
	Voucher             voucher;	// номер ваучера
	LedgerVoucherObject ledgerVoucherObject;
	boolean             cancelMode = (processMode == SalesBookVATProcessCancelType_RU::Process) ? false : true;
		;

		numberSeq = NumberSeq::newGetNum(CustParameters::numRefSalesBookVATProcessVoucherId_RU()); // определяем номерную серию для генерации ваучера
		voucher   = numberSeq.num(); // генерируем номер ваучера

		// создаем ledgerVoucherObject, для каждого ваучера voucher, система в мапе создаст свой ledgerVoucherObject
		// данный обьект объеденяет в себе проводки, у которых одинаковы задаваемые параметры
		ledgerVoucherObject = LedgerVoucherObject::newVoucher(voucher, // ключ в классе LedgerVoucherList ledgerTrans.Voucher
															  transDate, // дата проводки LedgerTrans.Transdate
															  SysModule::Tax,// модуль разноски
															  LedgerTransType::Tax, // ledgerTrans.TransType
															  cancelMode, //ledgerTrans.Correct
															  OperationsTax::Current, //ledgerTrans.OperationsTax
															  '',				    // номер документа 
															  dateNull(),			// дата документа 
															  null,
															  dateNull(),
															  false);
		// нициализация ledgerVoucher, задаем детализацияю, модуль и код номерной серии для генерации ваучера
		ledgerVoucher = LedgerVoucher::newLedgerPost(DetailSummary::Summary, SysModule::Tax, voucher);
		// добавляем ledgerVoucherObject в ledgerVoucher, ledgerVoucherObject наследует параметры от ledgerVoucher
		ledgerVoucher.addVoucher(ledgerVoucherObject);

		// дялее проедывается тоже самое, но в данный ledgerVoucher будут записываться операции по корректировке, это не обязательно
		// мне кажется необходимо для того чтобы не было ошибки корреспонденции
		ledgerVoucherObject = LedgerVoucherObject::newVoucher(voucher,
															  transDate,
															  SysModule::Tax,
															  LedgerTransType::Tax,
															  ! cancelMode,
															  OperationsTax::Current,
															  '',
															  dateNull(),
															  null,
															  dateNull(),
															  false);

		ledgerVoucherCorrect = LedgerVoucher::newLedgerPost(DetailSummary::Summary, SysModule::Tax, voucher);
		ledgerVoucherCorrect.addVoucher(ledgerVoucherObject);
	}
2. После инициализации основных обьектов их необходимо наполнить проводками, для этого используем обертку LedgerVoucherTransObject, и пишем следующий код
X++:
protected void post(TaxDirection            _taxDirection,
                    LedgerAccount           _accountNum,
                    LedgerAccount           _offsetAccountUseTax,
                    LedgerAccount           _chargeAccount,
                    Dimension               _dimension,
                    TaxAmount               _taxAmount,
                    TaxAmount               _chargeAmount,
                    LedgerAccount           _accountTaxFreePct,
                    ExchRate                _exchRate           = exchRate,
                    ExchRate                _exchRateSecond     = 0,
                    LedgerDetailLevel       _ledgerDetailLevel  = LedgerDetailLevel::AsDefault,
                    LedgerAccount           _offsetAccount      = '',
                    AmountMSTSecondary      _amountMSTSecondary = 0)
	{
		LedgerVoucherTransObject    ledgerVoucherTransObject;
		LedgerBondClient_RU         ledgerBondClient;
		int             counter;
		str             tmpStr;
		;
		// ledgerBondClient = ledgerVoucher.findLedgerVoucherObject().ledgerBondClient_RU(); //нужно для корреспондениции? если кореспонденция
		// в главной книге включена то этот класс инициализируется при инициализации ledgerVoucher, это класс позволяет загрузить данные в 
		// LedgerBondServer_RU, который выполняет корреспонденцию счетов. Если класс LedgerBondClient_RU инициализирован, значит корреспондженция включена
		// русский припон, о структуре данных классов стоит говорить отдельно
		ledgerBondClient = ledgerVoucher.findLedgerVoucherObject().ledgerBondClient_RU();

		if (ledgerBondClient)
		{
			ledgerBondClient.addNewLogObject(); // добавляет новый Log объект 
		}
		// создаем провдоку с +, на какой счет приходит 
		ledgerVoucherTransObject = LedgerVoucherTransObject::newCreateTrans(ledgerVoucher.findLedgerVoucherObject(),// находит текущий LedgerVoucherObject
																			LedgerPostingType::TaxReport, // тип разноски
																			_accountNum, // счет
																			_dimension,  // аналитика
																			currencyCode, //код валюты
																			_taxAmount, //сумма в проводке
																			logTransOper.TableId, // ссылка на источник
																			logTransOper.RecId); 

		ledgerVoucherTransObject.parmTransTxt(logTransOper.TransTxt); // задате текст операции
		ledgerVoucher.addTrans(ledgerVoucherTransObject); //добавляет в ledgerVoucher ledgerVoucherTransObject, если ваучер не изменился, аккумулирует все данные в одном ledgerVoucherTransObject

		// создаем провдоку с -, с какого счета идет списание, необходимо следить чтобы параметры не отличались, иначе проводки не скорреспондируются
	    // сумма должна быть противоположной по знаку
		ledgerVoucherTransObject = LedgerVoucherTransObject::newCreateTrans(ledgerVoucher.findLedgerVoucherObject(),
																			LedgerPostingType::TaxReport,
																			_offsetAccount, // корр. счет
																			_dimension,
																			currencyCode,
																			- _taxAmount,
																			logTransOper.TableId,
																			logTransOper.RecId);

		ledgerVoucherTransObject.parmTransTxt(logTransOper.TransTxt);
		ledgerVoucher.addTrans(ledgerVoucherTransObject);
		// работа с корреспонденцией
		if (ledgerBondClient)
		{
			ledgerBondClient.bondLastVRef2CurrentLog(); // добавить ссылку в лог
			ledgerBondClient.removeCurrentLogObject(); // удалить текущий LogObject
		}
	}
3. После наполнения ledgerVoucher данными, необходимо все разнести, для этого используем следующий код.
X++:
protected void endLedgerVoucher()
	{
		ledgerVoucherCorrect.end();
		ledgerVoucher.end();
	}

Last edited by Kainix; 06.12.2012 at 11:56.
This post has been rated by: Logger (5), S.Kuskov (1).
Tags
ax2009, ledgerbond, ledgerbondserver_ru, ledgertrans, ledgervoucher, корреспонденция

 

Similar Threads
Thread Thread Starter Forum Replies Last Post
Просмотр основания проводок ГК Wamr DAX: Функционал 0 02.03.2010 10:37
Создание проводок в ГК при перемещении Andrux DAX: Функционал 6 17.11.2009 10:30
Создание скл проводок при закр склада (AX 3 SP2). VictorSH DAX: Функционал 16 13.02.2008 19:39
Создание проводок ГК (программно) Ivan Mischenko DAX: База знаний и проекты 25 30.10.2006 16:35
Автоматическое создание РБП с привязкой к документу ГК ArtBar DAX: Функционал 3 16.06.2006 10:31

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Рейтинг@Mail.ru
All times are GMT +3. The time now is 01:48.
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Contacts E-mail, Advertising.