|
|
#1 |
|
Banned
|
Опыт настройки проводки 10 -> 20 с помощью профилей в AX2009
После 4 часов борьбы с системой и проклиная тот день, когда я стал консультантом, я настроил проводку СКЛАД -> НЗП как это принято в России. Как обычно, без дебаггера не обошлось. Думаю, мой опыт будет интересен.
Идея проста: есть склад "СКЛАД" и склад "ПРОИЗВ"одство. Физически они разделены. Надо соединить склад СКЛАД с профилем "10", а склад ПРОИЗВ - с профилем "20". На этом месте сразу же сталкиваемся с доработкой #1: профиль по умолчанию хорошо присоединяется в модулях заказов и закупок, однако в журналах склада и производства профиль каждый раз надо указывать руками. Казалось бы, в записи склада есть поля для профиля по умолчанию, но его указание не приводит к автоматическому выбору профиля в журналах. Лечится тремя строками в методе \Data Dictionary\Maps\InventStorageDimMap\Methods\initFromInventLocation: X++: if (_inventLocation.InventProfileId_RU && (! dimSearch || dimSearch.findActive(_dimGroupId, fieldnum(InventDim, InventProfileId_RU)))) { this.InventProfileId_RU = _inventLocation.InventProfileId_RU; } Не беда: создаем классический журнал переноса, указываем палету, склад С и склад По, нажимаем разноску и испытываем шок: система не может разнести журнал перноса, в котором палета перемещается из точки А в точку Б. "Используйте функцию переноса палет." Круг замкнулся. Слава богу, замечательная компания FWI, в которой я имею честь работать, обладает доработанным журнала переноса, который умеет перемещать палеты. Активизировав ее, я, наконец, получил желаемое Дхх - К10 Д20 - Кхх, где хх - некий клиринговый счет. Нельзя сказать, что он мне особо нужен, но и не мешает. Резюме: идея работает, однако 1) удобство работы с профилями оставляет желать лучшего 2) если используются палеты и управление складом, то без доработок не обойтись. |
|
|
|
| За это сообщение автора поблагодарили: mazzy (5), Pustik (3), lev (5), S.Kuskov (10), ashu (1), mnt_dx (1). | |
|
|
#2 |
|
Участник
|
Я еще на АХ30 написал мод для разноски номенклатур от нужного набора слк аналитик.
От склада - просто напрашивалось и было остро необходимо (в комплекте с генерированием проводки при переносе). Но введя еще аналитику Состояние и разноску от пары Склад+Состояние, стало возможным не делать Склады по числу перестановок от состояний на них, а например, использовать их по назначению - реальной географии склада (филиал и тп). Делать же Склад_хранение, Склад_производство, Склад_монтаж, Склад_брак и тп можно, только если складов 2-3 А вот если их 30? То в списке их нужно делать 120? Это уже жесть! Мы ж для чего учет ведем по складам, чтоб понимать, где что лежит в реальности по оборотке складской - на то она и аналитика, чтоб срезы давать. Когда появился штатный мод разноски от профиля и сайты, то это вызвало некий скепсис, а по коду все эти "160 мест в коде, где нужно было тянуть аналитику" совпали с моим же модом и он свелся к паре методов всего. Ну а профили вырубаются конфиг ключом, за что огромное мерси. И можно пользовать удобную настройку, таскаемую по разным версиям АХ Итого, можно сделать удобно и это довольно просто, тк теперь есть все необходимые правки на уровне стандарта и аналитика (любые ее комбинации) протянуты по всей разноске (просто сделана. зависимость не на нужных, а на лишних-новых), соотв настроить разноску можно от любой аналитики - да, кодинг, но мелкий и уж точно быстрее затрачиваемое на придумывания, как это сделать без кодинга, время. Или кодинга допиливания заполнения новых аналитик от старых. Все это суровое ИМХО, тк логистикой в чистом виде не занимался оч давно и просто не осознал всю прелесть нововведений профилей и сайтов, тогда как старое, проверенное, работает и позволяет настраивать любую нужную разноску по номенклатуре вообще без затыков. |
|
|
|
|
#3 |
|
Banned
|
|
|
|
|
|
#4 |
|
Ищущий знания...
|
см. так же тему "Склад, Профиль учета, Складские аналитики"
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
|
|
|
#5 |
|
Ищущий знания...
|
Цитата:
Сообщение от EVGL
...
Слава богу, замечательная компания FWI, в которой я имею честь работать, обладает доработанным журнала переноса, который умеет перемещать палеты. Активизировав ее, я, наконец, получил желаемое Дхх - К10 Д20 - Кхх, где хх - некий клиринговый счет. Нельзя сказать, что он мне особо нужен, но и не мешает. ... И если просили, то как Вы смогли их убедить, что им это не мешает? Поделитесь опытом please
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
|
|
|
#6 |
|
Banned
|
Цитата:
![]() ... при наличии модуля производства. В конечном итоге сырье потреблено не тогда, когда по бумагам уходит со склада, а когда его ставят на машину и превращают в готовый продукт или полуфабрикат. |
|
|
|
|
#7 |
|
Ищущий знания...
|
Цитата:
Сообщение от EVGL
В конечном итоге мне удалось их убедить (потребовалось несколько дней), что им такие проводки вообще не нужны.
![]() ... при наличии модуля производства. В конечном итоге сырье потреблено не тогда, когда по бумагам уходит со склада, а когда его ставят на машину и превращают в готовый продукт или полуфабрикат. у меня видимо будет более сложная дорога...
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
|
|
|
#8 |
|
Ищущий знания...
|
Цитата:
Сообщение от EVGL
... На этом месте сразу же сталкиваемся с доработкой #1: профиль по умолчанию хорошо присоединяется в модулях заказов и закупок, однако в журналах склада и производства профиль каждый раз надо указывать руками. Казалось бы, в записи склада есть поля для профиля по умолчанию, но его указание не приводит к автоматическому выбору профиля в журналах. Лечится тремя строками в методе \Data Dictionary\Maps\InventStorageDimMap\Methods\initFromInventLocation:
X++: if (_inventLocation.InventProfileId_RU && (! dimSearch || dimSearch.findActive(_dimGroupId, fieldnum(InventDim, InventProfileId_RU)))) { this.InventProfileId_RU = _inventLocation.InventProfileId_RU; } 1. В map InventStorageDimMap добавляем поле InventProfileId_RU. 2. В mappings для таблиц: CustTable, InventDim, PurchTable, SalesTable, VendTable добавляем соответствующие связи полей. 3. В map InventStorageDimMap изменяем методы: 1. modifiedField(). А именно добавляем в case по изменению поля InventLocationId проверку на незаполненность профиля учета. В результате этот case будет выглядеть так: X++: if (this.InventLocationId && (!this.InventSiteId || // No site. Hence default site might be applicable !this.InventProfileId_RU)) // Добавлена проверка профиля { if (this.isFormDataSource()) { this.InventStorageDimMap::modifiedInventLocationFromParent(this.InventStorageDimMap::formDataSourceJoinParent()); } } X++: fieldId fieldId;
ProdJournalProd prodJournalProd;
ProdJournalRoute prodJournalRoute;
InventJournalTrans inventJournalTrans; // Добавлена переменная строк складских журналов
;
if (parent.TableId && parent.TableId != tablenum(Common)) // A parent is found
{
switch (parent.TableId)
{
case tablenum(InventItemLocation):
break;
case tablenum(ProdJournalProd):
prodJournalProd = parent;
this.InventStorageDimMap::initFromInventLocation(this.InventStorageDimMap::inventLocation(),
prodJournalProd.prodTable().inventTable().DimGroupId);
break;
case tablenum(ProdJournalRoute):
prodJournalRoute = parent;
this.InventStorageDimMap::initFromInventLocation(this.InventStorageDimMap::inventLocation(),
prodJournalRoute.prodTable().inventTable().DimGroupId);
break;
// Добавлен case по строкам складских журналов -->
case tablenum(InventJournalTrans) :
inventJournalTrans =parent;
this.InventStorageDimMap::initFromInventLocation(this.InventStorageDimMap::inventLocation(),
inventJournalTrans.inventTable().DimGroupId);
break;
// Добавлен case по строкам складских журналов <--
default:
fieldId = fieldname2id(parent.TableId,fieldstr(InventTable,ItemId));
if (fieldId)
{
this.InventStorageDimMap::initFromInventLocation(this.InventStorageDimMap::inventLocation(),
InventTable::find(parent.(fieldId)).DimGroupId);
}
else
{
this.InventStorageDimMap::initFromInventLocation(this.InventStorageDimMap::inventLocation());
}
break;
}
}
else // No parent exist
{
this.InventStorageDimMap::initFromInventLocation(this.InventStorageDimMap::inventLocation());
}X++: if (!dimSearch || dimSearch.findActive(_dimGroupId, fieldnum(InventDim, InventProfileId_RU))) { this.InventProfileId_RU = _inventLocation.InventProfileId_RU; }
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
|
|
|
#9 |
|
Banned
|
На самом деле, проще всего в \Data Dictionary\Tables\InventDim\Methods\modifiedField засандалить. Это я так, слишком красиво сделать хотел.
|
|
|
|
|
#10 |
|
Ищущий знания...
|
Цитата:
Конечно можно что нибудь придумать, ну уж лучше сделать красиво!
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
|
|
|
#11 |
|
Участник
|
Нам пришлось делать доработки, чтобы не было проводок через транзитный счет, в переносе остается только одна проводка ГК, которая генерится для расходной складской проводки. Это касалось у нас только журналов переносов, в заказах на перемещения слава Богу не пришлось делать.
Если интересно, могу сказать что нужно модифицировать. Последний раз редактировалось Bega; 18.11.2011 в 15:35. |
|
|
|
|
#12 |
|
Ищущий знания...
|
Цитата:
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
|
|
|
#13 |
|
Ищущий знания...
|
Было бы интересно!
Заранее спасибо!
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
|
|
|
#14 |
|
MCTS
|
Цитата:
Сообщение от Bega
Нам пришлось делать доработки, чтобы не было проводок через транзитный счет, в переносе остается только одна проводка ГК, которая генерится для расходной складской проводки. Это касалось у нас только журналов переносов, в заказах на перемещения слава Богу не пришлось делать.
Если интересно, могу сказать что нужно модифицировать. ![]() На вскидку, модифицируется семейство классов InventMovement. Хотя я бы сто раз подумал, стоит ли переписывать складскую разноску, только для того чтобы получить правильную корреспонденцию в ГК. К тому же при неаккуратном изменении можно еще поиметь проблемы с коррекциями при закрытии склада.
__________________
Dynamics AX Experience |
|
|
|
|
#15 |
|
Ищущий знания...
|
Цитата:
Сообщение от Bega
Нам пришлось делать доработки, чтобы не было проводок через транзитный счет, в переносе остается только одна проводка ГК, которая генерится для расходной складской проводки. Это касалось у нас только журналов переносов, в заказах на перемещения слава Богу не пришлось делать.
Если интересно, могу сказать что нужно модифицировать.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
|
|
|
#16 |
|
Участник
|
Цитата:
Цитата:
2. В классе InventMov_Jour_Transfer создать метод, возвращающий расход это или приход с учетом сторно: X++: private boolean isIssue(boolean _checkStorno = true) { boolean issue = (this.transQty() <= 0); ; if (_checkStorno&&inventJournalTrans.Storno_RU) { issue = !issue; } return issue; } X++: LedgerAccount accountOperations()
{
if (! cacheAccountOperations)
{
if (this.isIssue())
cacheAccountOperations = InventPosting::item(InventAccountType::InventReceipt,this.itemId(),this.inventTable().ItemGroupId, this.inventDim());
else
cacheAccountOperations = InventPosting::item(this.assetId() ? InventAccountType::InventIssueFixedAsset : InventAccountType::InventIssue,
this.itemId(), this.inventTable().ItemGroupId, this.inventDim()) ;
}
return cacheAccountOperations;
}X++: LedgerPostingType postingOperations()
{
if (this.isIssue())
return LedgerPostingType::InventReceipt;
else
return (this.assetId()) ? LedgerPostingType::InventIssueFixedAsset :
LedgerPostingType::InventIssue;
} |
|
|
|
| За это сообщение автора поблагодарили: EVGL (10), CDR (3), Pustik (3), lev (10), gl00mie (3), S.Kuskov (10), Kabardian (5). | |
|
|
#17 |
|
MCTS
|
В дополнение к методу mustBeBookedFinancially() стоит также по аналогии перекрыть методы mustBeBookedBalanceSheet() и mustBeBookedOperations(), что бы в InventTransPosting не проставлялись левые счета/разноска.
А вы тестировали эти модификации на предмет коррекций при закрытии склада?
__________________
Dynamics AX Experience |
|
|
|
| За это сообщение автора поблагодарили: gene (2). | |
|
|
#18 |
|
Microsoft Dynamics
|
Цитата:
1. Вы тестировали это совместно с профилями учета? Есть подозрение, что могут быть проблемы в случае, если в переносе меняется профиль учета и, соответственно, номенклатурный счет. 2. Вы тестировали это с закрытием склада, если при закрытии меняется себестоимость расходной проводки по переносу? Что будет с коррекцией прихода? |
|
|
|
|
#19 |
|
Участник
|
Цитата:
Сообщение от gene
Два вопроса:
1. Вы тестировали это совместно с профилями учета? Есть подозрение, что могут быть проблемы в случае, если в переносе меняется профиль учета и, соответственно, номенклатурный счет. 2. Вы тестировали это с закрытием склада, если при закрытии меняется себестоимость расходной проводки по переносу? Что будет с коррекцией прихода? Последний раз редактировалось Bega; 19.11.2011 в 23:50. |
|
|
|
| За это сообщение автора поблагодарили: gene (2). | |
|
|
#20 |
|
Microsoft Dynamics
|
Цитата:
Сообщение от Bega
С этими модификациями мы живем с начала 2010 года. Склад закрываем каждый месяц. У нас активно используются профили учета для НЗП, есть переносы со сменой профиля учета. Особых проблем не замечено - копейки отваливаются из-за округлений, это как всегда. Если бы был транзитный счет, копейки были бы на нем, а у нас - на 20-ке, 10-ках и т.п. Но это мелочи. Те модификации, которые перечислил, я собрал из большого проекта, надеюсь ничего не забыл.
|
|
|
| Теги |
| ax2009, профиль учета |
|
|
|