После небольшого спора с коллегой, занимающимся 1С, на тему того, сколько сессий открывает COM-коннектор, работающий в качестве сервиса COM+, при одновременном доступе через него в Аксапту нескольких "внешних" приложений (в данном случае 1С), подумалось: а почему, собственно, в форме активных пользователей видна только одна сессия business connector'а? Ведь явно в описанном сценарии определенные операции выполняются параллельно, чего штатными средствами в рамках одной сессии достичь невозможно: AOS на каждую сессию создает один-единственный поток и обрабатывает запросы от клиента синхронно. И тут, просматривая сообщения в eventlog'е о том, как начинаются и завершаются соединения business connector'а, я обратил внимание, что у них очень специфический номер сессии: он начинается c 65534 и затем уменьшается по мере появления новых сессий, при этом освобождаемые при завершении сессий номера активно используются повторно (65535 - какая-то служебная сессия пользователя '-AOS-', которая явно пропускается в той же форме активных пользователей). В то же время, метод получения информации о сессиях, SysUsersOnline::getAllOnlineUserInfo(), обращается лишь к сессиям с номерами от 1 до info::licensedUsersTotal(), т.е. условно к первым сотням. Так вот, после небольшой модификации этого метода на форме активных пользователей появились дополнительные сессии, создаваемые business connector'ом с указанием - при наличии активных соединений с БД - их SPID/SID и проч.

(показ Serial No, SID, INST_ID - это доработка). И теперь стало понятнее, почему при подключении COM-коннектора "свободные" сессии на AOS'е заканчиваются раньше, чем на той же форме активных пользователей начнет показываться предельное число активных сессий.
Не совсем пока понятно, что делать с сессиями, которые показываются с типом NotAOS - для них не создается экземпляр AOSSessionInfo, и вообще, если верить eventlog'у, они уже завершены, но объекты xSession для них создаются...
Ниже приведена модификация SysUsersOnline::getAllOnlineUserInfo() для отображения таких сессий.
X++:
#define.MaxSessionId (65535) //+Отображать все COM-соединения в активных пользователях, gl00m, 26.11.2009
server static container getAllOnlineUserInfo()
{
int counter;
int num;
int maxSessions = Info::licensedUsersTotal();
int idleTicks;
container users;
container c;
xSession session;
UserInfo userInfo;
AOSSessionInfo aosSession;
AOSClientMode clientMode;
// Отображать все COM-соединения в активных пользователях, gl00m, 26.11.2009 -->
SetEnumerator setEnum;
Set setOfSessionIds = new Set( typeof(counter) );
Counter cnAosUsers = info::licensedAosUsers();
// Отображать все COM-соединения в активных пользователях, gl00m, 26.11.2009 <--
;
if (!maxSessions) //Demo mode
maxSessions = 3;
num = 0;
for(counter = 1; counter <= maxSessions;counter++)
{
// Отображать все COM-соединения в активных пользователях, gl00m, 26.11.2009 -->
setOfSessionIds.add( counter );
}
for (counter = #MaxSessionId - cnAosUsers; counter <= #MaxSessionId; counter++)
{
setOfSessionIds.add( counter );
}
setEnum = setOfSessionIds.getEnumerator();
while (setEnum.moveNext())
{
counter = setEnum.current();
// session = new xSession(counter, true);
session = new xSession(counter, false); // NB! с параметром _checkSession == true ничего не выйдет
// Отображать все COM-соединения в активных пользователях, gl00m, 26.11.2009 <--