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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 25.06.2015, 12:34   #1  
Sergey Petrov is offline
Sergey Petrov
Участник
 
80 / 19 (1) ++
Регистрация: 03.04.2007
Адрес: Saint-Petersburg, Russia
! Закрытие склада: обработка маркированных проводок
Уважаемые коллеги, добрый день!

Возникла проблема при закрытии склада в основной валюте.
Суть проблемы: есть расходная проводка, открытая в основной валюте (Форма 'Проводки' --> Закладка 'Разное' --> Группа 'Проводка' --> Поле 'Открытое значение' = "Да"), примаркированная к приходной проводке, закрытой в основной валюте. Количества в проводках совпадают по абсолютной величине (33 шт.). Однако, в расходной проводке (которая открыта и которую процедура закрытия склада пытается закрыть) есть сопоставленное в основной валюте количество и оно больше, чем количество в самой проводке (-67). В результате система сходит с ума и падает из метода \Classes\InventCostItemDim\updateSettleRefTransId. Текст ошибки: "Количество разбиения должно иметь такой же знак как и у проводки" (пунктуация сохранена). Закрытие склада отваливается по ошибке.

Стали разбираться с таким чудом.
Выяснили следующее: до упавшего закрытия в основной валюте мы делали закрытие во вторичной (причём, за значительно более ранний период). Перед закрытием во вторичной в системе жили две проводки: приходная на 33 шт. и расходная на 67 шт. Обе были закрыты в основной валюте. При этом, на них имелась взаимная маркировка (картинку для наглядности вроде как вложил).

При закрытии во вторичной система хватает приходную проводку (на 33 шт.), ищет первую примаркированную к ней расходную проводку (на -67 шт.), видит несоответствие количеств, разбивает расходную на две проводки:
1. 33 шт. (примаркирована к приходной на 33 шт.)
2. 34 шт. без каких-либо маркировок.
При таком разбиении система никак не обрабатывает уже имеющиеся сопоставления в основной валюте (см. (\Classes\InventSplitTrans_Remain\mustSettlementBeSplited и \Classes\InventSplitTrans_RemainSecCur_RU\mustSettlementBeSplited), а просто делает расходную проводку открытой в основной валюте, но с сопоставленным количеством по-прежнему -67 шт. (и сохранёнными записями, в которых присутствует выполненные при закрытии в основной валюте сопоставления).

В результате мы получаем красивую закрытую во всех валютах приходную проводку, примаркированную к расходной проводке, закрытой только в основной валюте, у которой, в свою очередь, неполадки с сопоставлениями в основной валюте.

Для решения проблемы решили перед закрытием во вторичной валюте просто очистить маркировку на уже закрытых в основной валюте приходной (на 33 шт.) и расходной (на -67 шт.) проводках, чтобы системе не хотелось бить уже закрытую в основной валюте расходную проводку.

Вопрос: правомерны ли наши действия с очисткой маркировки? Или мы что-то не учли и возможны печальные последствия?

Работаем на старушке MS Business Solutions-Axapta 3.0 CIS SP3 Build #9.2 on 28.04.2004.
Миниатюры
Нажмите на изображение для увеличения
Название: До закрытия во вторичной.png
Просмотров: 496
Размер:	20.3 Кб
ID:	9306  
Старый 26.06.2015, 12:04   #2  
Sergey Petrov is offline
Sergey Petrov
Участник
 
80 / 19 (1) ++
Регистрация: 03.04.2007
Адрес: Saint-Petersburg, Russia
Поговорю сам с собой немного.
Как вариант, не вносящий изменения в проводки, но слегка поправляющий логику: можно вместо чистки маркировок слегка допилить условие, которое вызывает расщепление странно промаркированных проводок. А именно: в методы \Classes\InventCostItemDim\updateSettleRefItem и \Classes\InventCostItemDimSecCur_RU\updateSettleRefItem вместе с проверкой на ненулевое значение сопоставленного количества (inventTrans.QtySettled и inventTrans.QtySettledSecCur_RU соответственно) добавить проверку на непревышение сопоставленного в другой валюте количества того, которое сопоставляется в текущей валюте.
То есть:
a) в методе \Classes\InventCostItemDim\updateSettleRefItem вместо
X++:
if (inventTrans.QtySettled)
    inventTrans.updateSplit(this.financialOpenQty(inventTrans));
использовать
X++:
if (inventTrans.QtySettled && abs(inventTrans.QtySettledSecCur_RU) <= abs(this.financialOpenQty(inventTrans)))
    inventTrans.updateSplit(this.financialOpenQty(inventTrans));
b) в методе \Classes\InventCostItemDimSecCur_RU\updateSettleRefItem вместо
X++:
if (inventTrans.QtySettledSecCur_RU)
    inventTrans.updateSplitSecCur_RU(this.financialOpenQty(inventTrans));
использовать
X++:
if (inventTrans.QtySettledSecCur_RU && abs(inventTrans.QtySettled) <= abs(this.financialOpenQty(inventTrans)))
    inventTrans.updateSplitSecCur_RU(this.financialOpenQty(inventTrans));
Результаты закрытия склада для проблемной номенклатуры вроде как вполне удобоваримы (за исключением того, что порядок сопоставлений для основной и вторичной валюты изменился в соответствии с обработанной при закрытии во вторичной валюте маркировкой).
__________________
MS Dynamics AX 2009

Kernel 5.0.1600.4110
Application 5.0.1500.6491
За это сообщение автора поблагодарили: Logger (3).
Теги
баг, вторичная валюта, закрытие склада, маркировка

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Закрытие и коррекция склада (нет проводок ГК) BSV DAX: Функционал 2 20.08.2014 15:20
Закрытие склада и бухгалтерия. Skvorcal DAX: Прочие вопросы 45 17.01.2011 10:24
Странное закрытие склада и коррекция себестоимости в наличии Aquarius DAX: Функционал 11 28.05.2010 11:45
Разная себестоимость проводок в операции переноса после закрытия склада Mikky DAX: Функционал 2 27.07.2009 11:52
Создание скл проводок при закр склада (AX 3 SP2). VictorSH DAX: Функционал 16 13.02.2008 19:39

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

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

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