Набросал небольшое исследование.
В общем из мапа достается равная копия буфера несвязанная с курсором.
Хотя почему-то в моем случае она обновилась и без skipTtsCheck
Неожиданно.
X++:
static void testBuffer(Args _args)
{
// RecId recId = 5637144576;
InventTable inventTable;
InventTable inventTable2;
Map map = new Map(Types::Int64, Types::Record);
;
// inventTable.disableCache(true);
ttsBegin;
// inventTable = InventTable::findRecId(recId, curExt2dataareaid(tableNum(InventTable)), true);
select
forupdate
inventTable order by RecId;
info(strFmt("до помещения в мап inventTable.usageCount() = %1", inventTable.usageCount()));
info(strFmt("recId = %1, forUpdate = %2", inventTable.RecId, inventTable.selectForUpdate())); // выдаст true
map.insert(inventTable.RecId, inventTable);
info(strFmt("после помещения в мап inventTable.usageCount() = %1", inventTable.usageCount()));
inventTable2 = map.lookup(inventTable.RecId);
info(strFmt("Достали из мапа recId = %1, forUpdate = %2", inventTable2.RecId, inventTable2.selectForUpdate())); // выдаст false
if (inventTable2.equal(inventTable))
{
info(strFmt("Буфер извлеченный из БД и из мапа РАВНЫ. inventTable.usageCount() = %1, inventTable2.usageCount() = %2", inventTable.usageCount(), inventTable2.usageCount()));
}
else
{
info(strFmt("Буфер извлеченный из БД и из мапа НЕ равны.inventTable.usageCount() = %1, inventTable2.usageCount() = %2", inventTable.usageCount(), inventTable2.usageCount()));
}
inventTable.RecId++;
if (inventTable2.RecId == inventTable.RecId)
{
info("в памяти это один и тот же объект");
}
else
{
info("в памяти это разные объекты");
}
// а что с курсором ?
try
{
next inventTable;
info(strFmt("С буфером извлеченным из базы связан курсор и можно выполнить next. - Извлечена следующая запись с RecId = %1", inventTable.RecId));
}
catch
{
info(strFmt("С буфером извлеченным из базы уже НЕ связан курсор (и это странно) RecId = %1", inventTable.RecId));
}
/* // если раскомментить код то будет ошибка времени выполнения что говорит о том что курсор уже не связан с inventTable2 т.е. мы работали с копией
try
{
next inventTable2;
info(strFmt("С буфером извлеченным из базы связан курсор и можно выполнить next. - Извлечена следующая запись с RecId = %1", inventTable2.RecId));
}
catch
{
info(strFmt("С буфером извлеченным из базы уже НЕ связан курсор (и это странно) RecId = %1", inventTable2.RecId));
}
*/
info(strFmt("RecId = %3. inventTable.BOMLevel до обновления = %1. forupdate = %2", inventTable.BOMLevel, inventTable.selectForUpdate(), inventTable.RecId));
inventTable.BOMLevel++;
inventTable.doUpdate();
inventTable.reread();
info(strFmt("inventTable.BOMLevel после обновления = %1", inventTable.BOMLevel));
info(strFmt("RecId = %3. inventTable2.BOMLevel до обновления = %1. forupdate = %2", inventTable2.BOMLevel, inventTable2.selectForUpdate(), inventTable2.RecId));
inventTable2.BOMLevel++;
inventTable2.doUpdate();
inventTable2.reread();
info(strFmt("inventTable2.BOMLevel после обновления = %1", inventTable2.BOMLevel, inventTable.RecId));
// оказалось что skipTtsCheck уже не нужен
ttsCommit;
}