AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 06.12.2012, 10:53   #1  
Kainix is offline
Kainix
Участник
 
47 / 96 (4) ++++
Регистрация: 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();
	}

Последний раз редактировалось Kainix; 06.12.2012 в 11:56.
За это сообщение автора поблагодарили: Logger (5), S.Kuskov (1).
Старый 06.12.2012, 11:19   #2  
BOAL is offline
BOAL
Участник
Аватар для BOAL
MCBMSS
Злыдни
1C
Лучший по профессии 2015
 
621 / 453 (17) +++++++
Регистрация: 28.04.2003
Адрес: Москва
Просьба для большей полезности указать версию АХ, судя по аналитике это не АХ2012
Старый 06.12.2012, 11:48   #3  
Kainix is offline
Kainix
Участник
 
47 / 96 (4) ++++
Регистрация: 22.11.2007
Ax 2009
Старый 06.12.2012, 12:31   #4  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
А куда должна вести ссылка "Схема"?
Старый 06.12.2012, 14:14   #5  
Kainix is offline
Kainix
Участник
 
47 / 96 (4) ++++
Регистрация: 22.11.2007
схема
Миниатюры
Нажмите на изображение для увеличения
Название: Схема LedgerVoucher.JPG
Просмотров: 1217
Размер:	51.9 Кб
ID:	7973  
Теги
ax2009, ledgerbond, ledgerbondserver_ru, ledgertrans, ledgervoucher, корреспонденция

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Просмотр основания проводок ГК 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

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 23:01.