04.08.2011, 23:12 | #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). |
05.08.2011, 21:37 | #2 |
Участник
|
Я еще на АХ30 написал мод для разноски номенклатур от нужного набора слк аналитик.
От склада - просто напрашивалось и было остро необходимо (в комплекте с генерированием проводки при переносе). Но введя еще аналитику Состояние и разноску от пары Склад+Состояние, стало возможным не делать Склады по числу перестановок от состояний на них, а например, использовать их по назначению - реальной географии склада (филиал и тп). Делать же Склад_хранение, Склад_производство, Склад_монтаж, Склад_брак и тп можно, только если складов 2-3 А вот если их 30? То в списке их нужно делать 120? Это уже жесть! Мы ж для чего учет ведем по складам, чтоб понимать, где что лежит в реальности по оборотке складской - на то она и аналитика, чтоб срезы давать. Когда появился штатный мод разноски от профиля и сайты, то это вызвало некий скепсис, а по коду все эти "160 мест в коде, где нужно было тянуть аналитику" совпали с моим же модом и он свелся к паре методов всего. Ну а профили вырубаются конфиг ключом, за что огромное мерси. И можно пользовать удобную настройку, таскаемую по разным версиям АХ Итого, можно сделать удобно и это довольно просто, тк теперь есть все необходимые правки на уровне стандарта и аналитика (любые ее комбинации) протянуты по всей разноске (просто сделана. зависимость не на нужных, а на лишних-новых), соотв настроить разноску можно от любой аналитики - да, кодинг, но мелкий и уж точно быстрее затрачиваемое на придумывания, как это сделать без кодинга, время. Или кодинга допиливания заполнения новых аналитик от старых. Все это суровое ИМХО, тк логистикой в чистом виде не занимался оч давно и просто не осознал всю прелесть нововведений профилей и сайтов, тогда как старое, проверенное, работает и позволяет настраивать любую нужную разноску по номенклатуре вообще без затыков. |
|
18.11.2011, 13:46 | #3 |
Banned
|
|
|
18.11.2011, 14:02 | #4 |
Ищущий знания...
|
см. так же тему "Склад, Профиль учета, Складские аналитики"
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
18.11.2011, 14:09 | #5 |
Ищущий знания...
|
Цитата:
Сообщение от EVGL
...
Слава богу, замечательная компания FWI, в которой я имею честь работать, обладает доработанным журнала переноса, который умеет перемещать палеты. Активизировав ее, я, наконец, получил желаемое Дхх - К10 Д20 - Кхх, где хх - некий клиринговый счет. Нельзя сказать, что он мне особо нужен, но и не мешает. ... И если просили, то как Вы смогли их убедить, что им это не мешает? Поделитесь опытом please
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
18.11.2011, 14:16 | #6 |
Banned
|
Цитата:
... при наличии модуля производства. В конечном итоге сырье потреблено не тогда, когда по бумагам уходит со склада, а когда его ставят на машину и превращают в готовый продукт или полуфабрикат. |
|
18.11.2011, 14:23 | #7 |
Ищущий знания...
|
Цитата:
Сообщение от EVGL
В конечном итоге мне удалось их убедить (потребовалось несколько дней), что им такие проводки вообще не нужны.
... при наличии модуля производства. В конечном итоге сырье потреблено не тогда, когда по бумагам уходит со склада, а когда его ставят на машину и превращают в готовый продукт или полуфабрикат. у меня видимо будет более сложная дорога...
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
18.11.2011, 14:42 | #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; }
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
18.11.2011, 14:56 | #9 |
Banned
|
На самом деле, проще всего в \Data Dictionary\Tables\InventDim\Methods\modifiedField засандалить. Это я так, слишком красиво сделать хотел.
|
|
18.11.2011, 15:15 | #10 |
Ищущий знания...
|
Цитата:
Конечно можно что нибудь придумать, ну уж лучше сделать красиво!
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
18.11.2011, 15:21 | #11 |
Участник
|
Нам пришлось делать доработки, чтобы не было проводок через транзитный счет, в переносе остается только одна проводка ГК, которая генерится для расходной складской проводки. Это касалось у нас только журналов переносов, в заказах на перемещения слава Богу не пришлось делать.
Если интересно, могу сказать что нужно модифицировать. Последний раз редактировалось Bega; 18.11.2011 в 15:35. |
|
18.11.2011, 15:35 | #12 |
Ищущий знания...
|
Цитата:
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
18.11.2011, 16:23 | #13 |
Ищущий знания...
|
Было бы интересно!
Заранее спасибо!
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
18.11.2011, 16:37 | #14 |
MCTS
|
Цитата:
Сообщение от Bega
Нам пришлось делать доработки, чтобы не было проводок через транзитный счет, в переносе остается только одна проводка ГК, которая генерится для расходной складской проводки. Это касалось у нас только журналов переносов, в заказах на перемещения слава Богу не пришлось делать.
Если интересно, могу сказать что нужно модифицировать. На вскидку, модифицируется семейство классов InventMovement. Хотя я бы сто раз подумал, стоит ли переписывать складскую разноску, только для того чтобы получить правильную корреспонденцию в ГК. К тому же при неаккуратном изменении можно еще поиметь проблемы с коррекциями при закрытии склада.
__________________
Dynamics AX Experience |
|
18.11.2011, 17:00 | #15 |
Ищущий знания...
|
Цитата:
Сообщение от Bega
Нам пришлось делать доработки, чтобы не было проводок через транзитный счет, в переносе остается только одна проводка ГК, которая генерится для расходной складской проводки. Это касалось у нас только журналов переносов, в заказах на перемещения слава Богу не пришлось делать.
Если интересно, могу сказать что нужно модифицировать.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
18.11.2011, 17:06 | #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). |
18.11.2011, 18:03 | #17 |
MCTS
|
В дополнение к методу mustBeBookedFinancially() стоит также по аналогии перекрыть методы mustBeBookedBalanceSheet() и mustBeBookedOperations(), что бы в InventTransPosting не проставлялись левые счета/разноска.
А вы тестировали эти модификации на предмет коррекций при закрытии склада?
__________________
Dynamics AX Experience |
|
|
За это сообщение автора поблагодарили: gene (2). |
19.11.2011, 11:03 | #18 |
Microsoft Dynamics
|
Цитата:
1. Вы тестировали это совместно с профилями учета? Есть подозрение, что могут быть проблемы в случае, если в переносе меняется профиль учета и, соответственно, номенклатурный счет. 2. Вы тестировали это с закрытием склада, если при закрытии меняется себестоимость расходной проводки по переносу? Что будет с коррекцией прихода? |
|
19.11.2011, 23:42 | #19 |
Участник
|
Цитата:
Сообщение от gene
Два вопроса:
1. Вы тестировали это совместно с профилями учета? Есть подозрение, что могут быть проблемы в случае, если в переносе меняется профиль учета и, соответственно, номенклатурный счет. 2. Вы тестировали это с закрытием склада, если при закрытии меняется себестоимость расходной проводки по переносу? Что будет с коррекцией прихода? Последний раз редактировалось Bega; 19.11.2011 в 23:50. |
|
|
За это сообщение автора поблагодарили: gene (2). |
19.11.2011, 23:56 | #20 |
Microsoft Dynamics
|
Цитата:
Сообщение от Bega
С этими модификациями мы живем с начала 2010 года. Склад закрываем каждый месяц. У нас активно используются профили учета для НЗП, есть переносы со сменой профиля учета. Особых проблем не замечено - копейки отваливаются из-за округлений, это как всегда. Если бы был транзитный счет, копейки были бы на нем, а у нас - на 20-ке, 10-ках и т.п. Но это мелочи. Те модификации, которые перечислил, я собрал из большого проекта, надеюсь ничего не забыл.
|
|
Теги |
ax2009, профиль учета |
|
|