Показать сообщение отдельно
Старый 18.04.2006, 15:30   #2  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,971 / 3267 (116) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
У нас тоже похожая фигня была.
Вроде бы нашел способ как вылечить, но не уверен что в других местах ничего не сломал. Так что хочу обсудить здесь.

Для начала описываю проблему.

Журнал перенос при включенном авторезервировании корректно резервировал расходные проводки (сплитил их, проставляля необходимые аналитики), но не сплитил и не ставил аналитики для приходных, выдавая что "Код аналитики %1 отмечен в складских проводках со значением %2"

InventDim ToInventDim
Склад ЗН1 ЗН2
Наша 1 пусто ЗН4
Наша 2 ЗН3 пусто

Заполнены были только аналитика склад и пара наших собственных.
Остальные пустые.
------------------------------

Как лечили :

Таблица InventDim
метод

void mergeUsedDim(InventDimGroupId _dimGroupId,
InventDim _fromInventDim,
InventDim _origFromDim = _fromInventDim
, boolean forceMergeAll = false
)
{
InventDimSearch _dimSearch = new InventDimSearch();
Integer x;

if (_dimSearch.first(_dimGroupId))
do
{
x = _dimSearch.dimFieldId();

if (_dimSearch.dimActive())
{
if (_fromInventDim.(x)
|| forceMergeAll // принудительно даже пустые копируем
)
this.(x) = _fromInventDim.(x);
else
if (this.(x) && this.(x) == _origFromDim.(x)) // clearing a dimension on the movement, but no on transaction
info(strfmt("@SYS73455", new DictField(tableNum(InventDim),x).label(), this.(x)));
}
} while (_dimSearch.next(_dimGroupId));

// HF21_394
if (this.WMSLocationId && !this.WMSLocation())
{
this.WMSLocationId = '';
this.wMSPalletId = '';
}
}

В общем добавили параметр, который принудительно копирует все активные аналитики, а не только активные непустые.


Далее
Класс InventUpdate
метод
updateTransDimTransferReceipt()

вызов
inventDimReceiptOrig.mergeUsedDim(movement.dimGroupId),movementReceipt.inventdim());
заменили на
inventDimReceiptOrig.mergeUsedDim(movement.dimGroupId(),movementReceipt.inventdim(), movementReceipt.inventdim(), true);


Идея изменений :
метод берет расходную проводку и её аналитики до изменения. Перепрописывает в неё НЕПУСТЫЕ активные для данной группы номенклатуры аналитики из ToInventDim из строки переноса. И пытается с фильтром по полученной аналитике найти приходные проводки чтобы проставить в них аналитики (ну если потребуется, рассплитить).

Но из-за того что пустые значения не копировались, то фильтр получился неверный и приходные проводки не нашлись.
А я его теперь заставляю принудительно все активные аналитики копировать, поэтому фильтр формируется нормальный и все работает.
------------

Кто нибудь менял этот механизм ?
Беспокоит вот что - возможно разрабтчики Аксапты неслучайно копировали только непустые значения. А метод InventUpdate.updateTransDimTransferReceipt() вызывается в куче мест.

Вот думаю, может сломали где чего, и пока не заметили.

Последний раз редактировалось Logger; 18.04.2006 в 16:14.