В стандарте такой механизм есть, но он работает он, гм, выборочно. Можешь посмотреть на метод inventUpdate.updateDimReserveChange() и на следующий кусок кода из inventUpdate.writeInventTrans().
X++:
if (_inventTrans.orig() && _inventTrans.InventDimId != _inventTrans.orig().InventDimId)// Do not use inventTrans_orig as it may not match content in database
{
fromInventDim = InventDim::find(_inventTrans.orig().InventDimId);
if (InventDimFixedClass::inventDimFieldsDifferent(fromInventDim,toInventDim) &
InventDimFixedClass::initPrimaryDim(movement.dimGroupId()) != 0 &&
InventDim::mustCheckDimChange(movement.dimGroupId(),fromInventDim,toInventDim))
{
if (_inventTrans.orig().isUpdatedEstimated())
{
inventOnhand = InventOnhand::newPhysicalUpdate(movement,fromInventDim);
if(!this.allowChangeDim(inventOnhand, _inventTrans, fromInventDim))
throw error(strfmt("@SYS54456"));
}
else if (!_inventTrans.orig().isUpdatedQuotation())
{
inventOnhand = InventOnhand::newPhysicalUpdate(movement,fromInventDim);
if (! inventOnhand.checkItemDraw(-_inventTrans.Qty,allowNegativePhysical))
throw error(strfmt("@SYS54456"));
}
if (_physicalUpdate)
this.updateDimReservePhysical(toInventDim,_inventTrans.Qty,_inventTrans.InventRefTransId);
reserveAgainDimId = fromInventDim.InventDimId;
}
else
{
qtyRemain = this.updateDimReserveChange(toInventDim,fromInventDim,_inventTrans.Qty,_physicalUpdate,_inventTrans.InventRefTransId);
if (_physicalUpdate)
this.updateDimReservePhysical(toInventDim,qtyRemain,_inventTrans.InventRefTransId);
}
Как можно заметить, вожделенный вызов метода updateDimReserveChange случается только если у номенклатуры вообще нету первичной аналитики хранения (InventDimFixedClass::initPrimaryDim(movement.dimGroupId()) вернул 0) или же такая аналитика есть, но та аналитика которая была изменена, не является аналитикой физического склада (InventDim::mustCheckDimChange(movement.dimGroupId(),fromInventDim,toInventDim) вернул false). В общем - надо чтобы второй if в этом фрагменте провалился в часть else...
Кстати мне кажется, что в более ранних версиях (по крайней мере в версии 3.0, в которой я этот механизм обнаружил), система вообще меняла автоматически любую аналитику, не помеченную как первичная аналитика хранения. Кроме того - обрати внимание на поле inventTrans.inventDimFixed. Это та аналитика, которая по задумке авторов не может менятся в проводке автоматически. Она инициализируется из первичной аналитики хранения, но также может быть указана руками при резервировании. Опять таки - это про оригинальную версию 3.0. Похоже что в 2009ой версии, флажки в этой аналитике не проверяют, если она не нулевая, то вообще аналитику запрещают менять автоматически.