function RegisterMemberByTicket($ar_member, $ticket_id, $session_id)
    {
        if ($ar_member["ID"] > 0) {
            $ID = $ar_member["ID"];
        } else {
            $ID = false;
        }
        $member_id = $ar_member["MEMBER_ID"];
        if (!CControllerMember::CheckFields($ar_member, $ID)) {
            return false;
        }
        $ar_member["MEMBER_ID"] = $member_id;
        $arParameters = array("controller_ticket_id" => $ticket_id, "join_command" => '
				COption::SetOptionString("main", "controller_member", "Y");
				COption::SetOptionString("main", "controller_ticket", "");
				RegisterModuleDependences("main", "OnUserLoginExternal", "main", "CControllerClient", "OnExternalLogin", 1);
				RegisterModuleDependences("main", "OnExternalAuthList", "main", "CControllerClient", "OnExternalAuthList");
			', "disconnect_command" => '
				CControllerClient::RestoreAll();
				COption::SetOptionString("main", "controller_member", "N");
				COption::SetOptionString("main", "controller_member_id", "");
				COption::SetOptionString("main", "controller_url", "");
				UnRegisterModuleDependences("main", "OnUserLoginExternal", "main", "CControllerClient", "OnExternalLogin", 1);
				UnRegisterModuleDependences("main", "OnExternalAuthList", "main", "CControllerClient", "OnExternalAuthList");
			');
        $oRequest = new CControllerServerRequestTo($ar_member, "register", $arParameters);
        if ($session_id) {
            $oRequest->session_id = $session_id;
        }
        if (($oResponse = $oRequest->Send()) == false) {
            return false;
        }
        $result = $oResponse->OK();
        if ($result === false) {
            $e = new CApplicationException($oResponse->text);
            $GLOBALS["APPLICATION"]->ThrowException($e);
            return false;
        }
        if ($ID > 0) {
            $ar_member["DISCONNECTED"] = "N";
            $ID = CControllerMember::Update($ID, $ar_member) ? $ID : false;
        } else {
            $ID = CControllerMember::Add($ar_member);
        }
        if ($ID > 0) {
            $arControllerLog = array('NAME' => 'REGISTRATION', 'CONTROLLER_MEMBER_ID' => $ID, 'DESCRIPTION' => GetMessage("CTRLR_MEM_LOG_DESC_JOIN_BY_TICKET2"), 'STATUS' => 'Y');
            CControllerLog::Add($arControllerLog);
            CControllerMember::SetGroupSettings($ID);
            if (!isset($ar_member["DISCONNECTED"]) || $ar_member["DISCONNECTED"] == "N") {
                // add join event
                CTimeZone::Disable();
                $db_res = CControllerMember::GetByID($ID);
                CTimeZone::Enable();
                if ($arFields = $db_res->Fetch()) {
                    $events = GetModuleEvents("controller", "OnAfterRegisterMemberByTicket");
                    while ($arEvent = $events->Fetch()) {
                        ExecuteModuleEventEx($arEvent, array(&$arFields));
                    }
                    CEvent::Send("CONTROLLER_MEMBER_REGISTER", SITE_ID, $arFields);
                }
            }
            return $ID;
        }
        return false;
    }