История одного глюка
1. Глюк, каким он стал в Ах 3.0. SP3
2. История глюка в подробностях
3. Как лечить
1. При успешной разноске журнала инвентаризации, в котором есть более одной строки с одинаковой номенклатурой, эта номенклатура не разблокируется. В InventItemLocation остается выставленной галка CountingStarted, и в последствии при любых операциях с этой номенклатурой выдается ошибка "Номенклатура '%1' блокирована на складе '%2', так как она находится в процессе инвентаризации.", хотя в процессе инвентаризации она вовсе не находится.
Сразу оговорюсь, что мы ставили SP3 на SP1, минуя SP2, т.е. м.б этот глюк появился в SP2.
2. вот такой код и по сей день можно увидеть в слое sys таблицы InventItemLocation
PHP код:
static server void updateStopCountingJournal(InventJournalTrans inventJournalTrans)
...
while select otherTrans
where otherTrans.journalId == inventJournalTrans.journalId &&
otherTrans.itemId == inventJournalTrans.itemId &&
otherTrans.recId != otherTrans.recId
{
otherInventItemLocation = InventItemLocation::find(inventJournalTrans.itemId, otherTrans.inventDimId);
if (otherInventItemLocation.recId == inventItemLocation.recId)
{
doStop = false; //не снимать галку CountingStarted
break;
}
}
легко заметить в эту выборку никогда ничего не попадало, т.к условие otherTrans.recId != otherTrans.recId всегда ложно

но замысел был, видимо, такой:
если в журнале есть несколько строк одной номенклатуры и одинаковым inventDimId (
важно: не просто одинаковым inventDimId, а таким inventDimId который есть в InventItemLocation для этой номенклатуры. Если в InventItemLocation как обычно

одинокая строка с inventDimId == "Axapta", то это условие упрощается до "если в журнале есть несколько строк одной номенклатуры"), то снимать галочку (единственную на все строки) нужно только тогда, когда будет разнесена последняя из строк.
в SP3 (или SP2? см. выше) он перекрыт слоем syp:
PHP код:
while select otherTrans
where otherTrans.journalId == inventJournalTrans.journalId &&
otherTrans.itemId == inventJournalTrans.itemId &&
otherTrans.recId != inventJournalTrans.recId
{
otherInventItemLocation = InventItemLocation::find(inventJournalTrans.itemId, otherTrans.inventDimId);
if (otherInventItemLocation.recId == inventItemLocation.recId)
{
doStop = false;
break;
}
}
теперь глюк и приобрел свои современные свойства - галочка CountingStarted вообще не снимается, если в журнале инвентаризации две строки с одинаковой номенклатурой, а в inventItemLocation только одна строка
3. Как лечить.
Например, можно после разноски всего журнала проверять inventItemLocation.
в JournalCheckPost:
PHP код:
void run()
{
InventItemLocation InventItemLocation;
... разноска
// и перед ttscommit:
if ( JournalTableData.journalTable().Posted == NoYes::Yes
&& InventJournalTable::find(this.parmJournalId()).JournalType == InventJournalType::Count)
{
while select forupdate InventItemLocation
where InventItemLocation.CountingStarted == NoYes::Yes
&& InventItemLocation.CountingJournalId == this.parmJournalId()
{
InventItemLocation.CountingStarted = NoYes::No;
InventItemLocation.update();
}
}
ttscommit;