|  | 
|  30.08.2007, 11:47 | #1 | 
| Участник | Пересчет с/с в проводках с заполненным InventRefTransId 
			
			AX 3.0 SP5 KR2 В процессе анализа расчета себестоимости по проводкам расхода определенной товарной позиции была обнаружена след. особенность: Система не корректирует себестоимость в проводках с заполненным InventRefTransId (Ссылка на лот). Очевидно, такие проводки система считает промаркированными с какими-либо проводками прихода -- это нормально. Однако, в проводках расхода, сформированных по заказу, который создан из контракта (базовая функциональность создания заказа на отпуск), в поле InventRefTransId система заносит ссылку на номер лота исходной строки контракта. При этом такие проводки не являются промаркированными (для строк контракта проводки не создаются вообще). Таким образом, себестоимость списания в таких проводках вычисляется как мгновенная и не пересчитывается в процессе выполнения базовой функциональности пересчета себестоимости. Процедура закрытия склада также не корректирует себестоимость в таких проводках - вот это условие пропускает проводки, которые ссылаются на строки заказа Вопрос №1: Почему так сделано? Это "by design"? Мы изменили функциональность создания проводок по строкам заказа, не заполняя поле "Ссылка на лот" в проводках для строк заказа, созданных из контракта. Вопрос №2: Чревато ли это какими-либо последствиями? Какими? | 
|  | |
| За это сообщение автора поблагодарили: Logger (8). | |
|  30.08.2007, 11:53 | #2 | 
| Banned | 
			
			Мне кажется, баг. По вопросу 2: чревато тем, что система не найдет исходную строку Blanket Order и при доставке Release Order не уменьшит остаток и не сменит статус в строке Blanket Order. | 
|  | |
| За это сообщение автора поблагодарили: kashperuk (3). | |
|  30.08.2007, 11:57 | #3 | 
| Участник | Цитата: По количеству мы, конечно же, проверили - пересчет кол-ва по контракту отталкивается от ссылки на лот в самой строке заказа. Тут все ОК. Пересчет при этом выполняется правильно - себестоимость меняется в зависимости от выбранного метода (у нас - FIFO) | 
|  | 
|  30.08.2007, 12:02 | #4 | 
| Banned | 
			
			А, правильно, речь ведь идет о InventTrans, а не о SalesLine. Тогда все в порядке будет. Коллеги тут для одного клиента вообще всю маркировку во всей системе истребили - и ничего.
		 | 
|  | 
|  30.08.2007, 12:21 | #5 | 
| Member | 
			
			Есть такое в 3.0. Если запустить закрытие, то такие ссылки чистятся. Для одного клиента мы с mazzy в процедуру пересчета вставляли такой же кусок кода (чистящий ссылки), как и в закрытии. 
				__________________ С уважением, glibs® | 
|  | 
|  30.08.2007, 12:26 | #6 | 
| Участник | Цитата: Это из метода, который вызывается при пересчете себестоимости и закрытии склада. X++: // clear unused references if (inventClosing.AdjustmentType == inventAdjustmentType::Closing && (mapQtyIssue || mapQtyReceipt)) { while select forupdate inventTrans index hint openItemIdx where inventTrans.ValueOpen == inventTransOpen::Yes && inventTrans.ItemId == _itemId && inventTrans.InventRefTransId != '' { if (! setPhysicalMarked.in(inventTrans.inventTransId) && this.financialOpenQty(inventTrans)) { if ((inventTrans.Qty > 0 && (! mapQtyIssue || ! mapQtyIssue.exists(inventTrans.InventTransId) || abs(mapQtyIssue.lookup(inventTrans.InventTransId)) < inventAdj::settleQtyDiff())) || (inventTrans.Qty < 0 && (! mapQtyReceipt || ! mapQtyReceipt.exists(inventTrans.InventTransId) || abs(mapQtyReceipt.lookup(inventTrans.InventTransId)) < inventAdj::settleQtyDiff()))) { if (inventTrans.QtySettled) inventTrans.updateSplit(this.financialOpenQty(inventTrans)); if (!InventCostItemDim::isBlanketOrderReference(inventTrans)) { inventTrans.InventRefTransId = ''; inventTrans.doUpdate(); if (! inventTrans.isUpdatedFinancial()) { movement = inventTrans.inventMovement(true); if (movement && movement.inventRefTransId() != '') { movement.setInventRefFields(inventRefType::None,'',''); movement.updateDoBuffer(); } } } } } } } X++: if (!InventCostItemDim::isBlanketOrderReference(inventTrans)) | 
|  | 
|  30.08.2007, 13:07 | #7 | 
| Участник | 
			
			Посмотрел только что всю эту функциональность в 4.0 SP2 При создании заказа из контракта они связываются уже по новому полю - BlanketRefTransId. То есть для контрактов InventRefTransId не заполняется. А соответственно при пересчете уже все нормально отрабатывает. Кстати, класс для создания заказа такого уже по другому называется - SalesAutoCreate_ReleaseOrder (был SalesAutoCreate_tmpSalesLine). Приведенный код для пересчета в 4.0 тоже немного подкорректировали. Кстати, опять же про 3.0. Не проверял, но скорее всего так: Проверка X++: if (!InventCostItemDim::isBlanketOrderReference(inventTrans))В методе делается поиск строки контракта по номеру лота. И этой строки может уже не существовать. | 
|  | 
|  30.08.2007, 13:08 | #8 | 
| Member | 
			
			Хм... Мы над сп3 издевались. Там это как-то работало. Теперь уже не помню. Поглядел. В сп3 такого условия не было... Интересненько. Проблему с маркировкой и ссылками Микрософт обещал побороть в 4.0. В 3.0 вроде как уже не собирался тогда. Смотрите... 
				__________________ С уважением, glibs® | 
|  | 
|  30.08.2007, 13:17 | #9 | 
| Участник | Цитата: 
		
			Однако, в проводках расхода, сформированных по заказу, который создан из контракта (базовая функциональность создания заказа на отпуск), в поле InventRefTransId система заносит ссылку на номер лота исходной строки контракта. При этом такие проводки не являются промаркированными (для строк контракта проводки не создаются вообще). Таким образом, себестоимость списания в таких проводках вычисляется как мгновенная и не пересчитывается в процессе выполнения базовой функциональности пересчета себестоимости.
		
	 | 
|  | 
|  30.08.2007, 13:19 | #10 | 
| Участник | Цитата: 
		
			Сообщение от petr
			   Если я вас правильно понял, вы создаете заказ (release order) из контракта (blanket order), и при этом в складской проводке заказа в поле InventRefTransId у вас проставлен лот из строки контракта. Я этого у себя не наблюдаю. Мне кажется так и не может быть в принципе в стандарном функционале. См. тогда пред. сообщение мое | 
|  | 
|  30.08.2007, 13:27 | #11 | 
| Участник | 
			
			Не, я пробовал и в 3.0 SP4, насколько я понимаю. Но зачем им понадобилось заполнять поле ссылкой на несуществующий лот я не понимаю. (по контракту складские проводки не создаются). Притом ссылка всегда должна быть на противоположную проводку (приход на расход и наоборот). Вообще непонятно, если такое было раньше, то зачем?
		 | 
|  | 
|  30.08.2007, 13:32 | #12 | 
| Участник | Цитата: 
		
			Сообщение от petr
			   Не, я пробовал и в 3.0 SP4, насколько я понимаю. Но зачем им понадобилось заполнять поле ссылкой на несуществующий лот я не понимаю. (по контракту складские проводки не создаются). Притом ссылка всегда должна быть на противоположную проводку (приход на расход и наоборот). Вообще непонятно, если такое было раньше, то зачем? (1 этап - SalesAutoCreate_tmpSalesLine.setSalesLine - копируется в строку заказа 2 этап - InventMovement.initInventTransFromBuffer - копируется из строки заказа в проводку (используется метод InventMov_Sales.inventRefTransId) А вот зачем - мне как раз тоже непонятно   | 
|  | |
| За это сообщение автора поблагодарили: aidsua (1). | |
|  30.08.2007, 13:42 | #13 | 
| Member | Цитата: 
		
			Сообщение от petr
			
			 ... Но зачем им понадобилось заполнять поле ссылкой на несуществующий лот я не понимаю. ... Просто в контракте не создается складских проводок. Поэтому лот существует, а вот ссылка на складскую проводку с таким номером лота не существует. 
				__________________ С уважением, glibs® | 
|  | 
|  30.08.2007, 13:45 | #14 | 
| Участник | 
			
			Случайно обратил внимание. 20000 - номер этой темы. Юбилейная! | 
|  | 
|  30.08.2007, 13:56 | #15 | 
| Member | 
			
			kashperuk, вы маньяк. На всякий случай. Если вы обидчивый, то постарайтесь воспринять это как комплимент. 
				__________________ С уважением, glibs® | 
|  | 
|  30.08.2007, 13:56 | #16 | 
| Участник | Цитата:  Стараюсь, стараюсь, не получается   | 
|  | 
|  30.08.2007, 13:57 | #17 | 
| Участник | Цитата: 
		
			Это не несуществующий лот. Он очень даже существующий.
		
	 Тоже самое и с номером лота. Ссылка на него есть в строке заказа, но в "справочнике" лотов таблице inventTrans этого лота нет. Поэтому проверка ссылочной целостности должна тут выдавать ошибку "такого номера лота не существует". P.S. Правдя я никогда этого не делал. Надо будет на досуге попробовать. | 
|  | 
|  30.08.2007, 14:10 | #18 | 
| Member | 
			
			petr, вы не правы. Лот — это не складская проводка. Это источник складской проводки (строка складского журнала, заказа, закупки. производственного заказа, журнала в проектах...). Так что все с точностью до наоборот. Складских проводок с одинаковым номером лота может быть множество. А вот строк журналов и заказов/закупок с одинаковым номером лота быть не может. Как может идти речь о ссылке на запись в таблице, если поле-ключ не уникально? 
				__________________ С уважением, glibs® | 
|  | 
|  30.08.2007, 14:23 | #19 | 
| Участник | 
			
			Да, действительно не прав. Спасибо
		 | 
|  | 
| Теги | 
| ax3.0, faq, себестоимость | 
|  | 
| 
 |