I've added stuff to build 8.45 which should help.
Basically session values are stored in a queue using the SessionID / Name as the identifier. You don't actually pass the SessionID as that's handled for you. Multi-Tab support changed this so that the queue became Session ID / TabId / Name.
again TabId was handled (invisibly) for you.
In 8.45 I've added the ability for you to specify the "tabId" to use. The generated ones are (currently) 5 chars long, but there is space for up to 10, so if you used one that is say 4 chars long it won't clash with any generated one. Also the generated one only uses numbers and letters, so adding something else (like say a *) will guarantee there is no clash.
So, by specifying the TabId you can basically create your own (invisible) "tab" - and you can get, and set values in this "tab". So when you want to create or use a "cross tab" value, you can put it in this tab. For example;
p_web.SetSessionValue('name','value','picture','tabid')
Typically the picture is omitted so this might be
p_web.SetSessionValue('name','value', ,'tabid')
or
p_web.SSV('name','value', ,'tabid')
however do NOT use
p_web.SetSessionValue('name','value','tabid')
Omitting the extra , would be bad.
On the Get side it's a little simpler;
p_web.GetSessionValue('name','tabid')
or
p_web.GSV('name','tabid')
Other methods that have been extended are;
p_web.IfExistsSessionValue('name','tabid')
p_web.DeleteSessionValue('name','tabid')
p_web.GetSessionValueLength('name','tabid')
p_web.GetSessionValueFormat('name','tabid')
p_web.GetSessionPicture('name','tabid')
Of course you will need to change all your existing code where you want to store or retrieve these "cross tab" values, but all other places remain unchanged - unless specified the tab ID default remains as it was.
Cheers
Bruce