Имя: Пароль:
1C
 
MS SQL: Как узнать spid текущего сеанса 1С?
0 dk
 
19.07.10
08:22
Задолбали в понедельник жаловаться на тормоза. Хочу привязать сеанс 1с и сеанс скуля.
Поиском прошелся, но что-то не нашел (
Знаю что за денежку такое делали МуМу и toypaul но хотся халявы.
Может уже кто делал подобное
1 dk
 
19.07.10
08:23
или просто в 1С++ @@spid сойдет?
2 Mikeware
 
19.07.10
08:23
Select @@SPID
3 el-gamberro
 
19.07.10
08:24
sp_who2
4 smaharbA
 
19.07.10
08:26
может поможет

   Рекордсет.Open("select spid,dbid,
   |DateTime=replace(replace(cast(day(login_time) as char(3))+cast(month(login_time) as char(3))+cast(year(login_time) as char(5))+datename(hh,login_time)+' '+datename(mi,login_time)+' '+datename(ss,login_time)+' '+datename(ms,login_time),'  ',' '),' ',','),
   |[Дата]=login_time,
   |[Секунды]=3600*datename(hh,login_time)+60*datename(mi,login_time)+datename(ss,login_time),
   |Время_действия=replace(replace(cast(day(last_batch) as char(3))+cast(month(last_batch) as char(3))+cast(year(last_batch) as char(5))+datename(hh,last_batch)+' '+datename(mi,last_batch)+' '+datename(ss,last_batch)+' '+datename(ms,last_batch),'  ',' '),' ',','),
   |ComputerName=hostname,hostprocess,program_name
   |from master.dbo.sysprocesses
   |where dbid=db_id('"+База+"') and spid<>@@spid
   |order by spid;",Кон,3,1,1);
5 dk
 
19.07.10
08:26
просто неохота велосипед изобретать
6 smaharbA
 
19.07.10
08:27
(5) для скуль есть возможность авторизации вин для адинес
7 Skom
 
19.07.10
08:28
(0)

Процедура глУдалитьИнфуОПользователе()  Экспорт
   ТЗ_пид = "Select convert(varchar(10), @@SPID)";
   ПИД = Сокрлп(ЗапросСКЛ.ВыполнитьСкалярный(ТЗ_пид));
   //-----------Сначала удаляем------------------------------------    
   ТЗ = "Delete from Пользователи Where (left(Пользователи.Пользователь,"+СтрДлина(глПользователь.Код)+")='"+Сокрлп(глПользователь.Код)+"') or (Пользователи.PID = "+ПИД+")";
   ЗапросСКЛ.Отладка(Константа.ОтладкаКлассов);
   ЗапросСКЛ.Выполнить(ТЗ);
КонецПроцедуры

Процедура глДобавитьИнфуОПользователе()  Экспорт
   
   ТЗ_пид = "Select convert(varchar(10), @@SPID)";
   ПИД = Сокрлп(ЗапросСКЛ.ВыполнитьСкалярный(ТЗ_пид));
   //-----------Сначала удаляем------------------------------------    
   глУдалитьИнфуОПользователе();
   //-----------------А теперь добавляем-------------------------------------
   ДатаТек=""+ДатаГод(ТекущаяДата())+Формат(ДатаМесяц(ТекущаяДата()),"Ч(0)2")+Формат(ДатаЧисло(ТекущаяДата()),"Ч(0)2");
   ДатаТек = ДатаТек+" "+ТекущееВремя()+".000";
   ТЗ = "insert into Пользователи values("+ПИД+", '"+Сокрлп(глПользователь.Код)+"', Convert(datetime, '"+Сокрлп(ДатаТек)+"', 102), '"+глЮзер.ИмяКлиентскогоСервера+"', '"+глЮзер.ИмяПользователяWindows+"', '"+глЮзер.ИмяКлиентскогоКомпа+"')";
   ЗапросСКЛ.Отладка(Константа.ОтладкаКлассов);
   Если ЗапросСКЛ.Выполнить(ТЗ)=0 Тогда
       Сообщить(ЗапросСКЛ.ПолучитьОписаниеОшибки());
   Конецесли;  
   //------------------------------------------------------------------
КонецПроцедуры
8 Mikeware
 
19.07.10
08:29
// ++MW 07.07.2006
Процедура глДобавитьИнфуОПользователе()  Экспорт
Запрос=СоздатьОбъект("ODBCRecordSet");
ТЗ_пид = "
|Select convert(varchar(10), @@SPID) PID
|";
Запрос.Открыть(ТЗ_пид);
Запрос.ВНачало();
ПИД = Сокрлп(Запрос.ПолучитьЗначение(1));
//Удаляем,если были зависшие
ТЗ = "Delete from [Adm]..[Users] Where ([Adm]..[Users].[User_1c]='"+Сокрлп(глПользователь.Код)+"') or ([Adm]..[Users].PID = "+ПИД+")";
Запрос.Выполнить(ТЗ);
//Добавляем сведения текущего сеанса
ДатаТек=""+ДатаГод(ТекущаяДата())+Формат(ДатаМесяц(ТекущаяДата()),"Ч(0)2")+Формат(ДатаЧисло(ТекущаяДата()),"Ч(0)2");
ДатаТек = ДатаТек+" "+ТекущееВремя()+".000";
ТЗ = "insert into [Adm]..[Users] values("+ПИД+", '"+Сокрлп(глПользователь.Код)+"', Convert(datetime, '"+Сокрлп(ДатаТек)+"', 102))";
Если Запрос.Выполнить(ТЗ)=0 Тогда
Сообщить(Запрос.ПолучитьОписаниеОшибки());
Конецесли;  
КонецПроцедуры
//------------------------------------------------------------------
Процедура глУдалитьИнфуОПользователе()  Экспорт
Запрос=СоздатьОбъект("ODBCRecordSet");
ТЗ_пид = "
|Select convert(varchar(10), @@SPID) PID
|";
Запрос.Открыть(ТЗ_пид);
Запрос.ВНачало();
ПИД = Сокрлп(Запрос.ПолучитьЗначение(1));
ТЗ = "Delete from [Adm]..[Users] Where ([Adm]..[Users].[User_1c]='"+Сокрлп(глПользователь.Код)+"') or ([Adm]..[Users].PID = "+ПИД+")";
Запрос.Выполнить(ТЗ);
КонецПроцедуры  
//------------------------------------------------------------------
9 Skom
 
19.07.10
08:31
(8) ГАД
10 Mikeware
 
19.07.10
08:33
(9) апачиму?
11 dk
 
19.07.10
08:33
спасибо )
12 Skom
 
19.07.10
08:33
(10) да просто так.
а кто у кого процедурками разжился? я у тебя или ты у меня????
13 Fragster
 
гуру
19.07.10
08:34
вот так и выплывает раздвоение личности на мисте
14 Mikeware
 
19.07.10
08:34
(12) ты у меня. А я у не помню кого. Может, и у МуМу
15 Ёпрст
 
гуру
19.07.10
08:34
(12) на год каментов посмотри
16 Фея с лопатой
 
19.07.10
08:35
(8) Интересно... Тоже нужно себе такое добавить. Это готовое решение, или еще допиливать надо?
17 ShoGUN
 
19.07.10
08:35
(12) У тебя незаконченный кусок кода, инициализации глобальной переменной ЗапросСКЛ не хватает.
18 Skom
 
19.07.10
08:35
(13) ха ха...третьим будешь?

(15) ну я не у майка брал кстати эти процедурки.
хотя и не сам писал.
но кто мне их давал не вспомню уже...
19 Skom
 
19.07.10
08:36
(17) у меня
ЗапросСКЛ это глобальная переменная
20 ShoGUN
 
19.07.10
08:38
(19) Спасибо Кэп, я это и написал. Код нерабочий, его допилить чуть надо.
21 Mikeware
 
19.07.10
08:40
(16) CREATE TABLE [Users] (
   [PID] [int] NOT NULL ,
   [User_1c] [char] (40) COLLATE Cyrillic_General_CI_AS NOT NULL ,
   [intime] [datetime] NOT NULL
) ON [PRIMARY]

Ну а потом уже делай что хочешь. например
   ТекстЗапроса="
   |select
   |  str(spid,4) as [Соединение],
   |  u.user_1c as [Пользователь1С],
   |   left(loginame,20) as [Логин],
   |   left(hostname,25) as [Компьютер],
   |   str(blocked,4) as [Заблокирован],
   |   str(max(waittime),15)  as [Время] ,
   |   str(sum(cpu),15) as [ЦПУ],
   |   str(sum(memusage),15) as [Память],  
   |   str(sum(physical_io),15) as [Диск]  
   |from
   |   master..sysprocesses
   |full join adm..users u
   |  on spid=u.pid
   |where
   |  hostname<>'"+Where+"'
   |group by
   |  str(spid,4),left(loginame,20), left(hostname,25), str(blocked,4), u.user_1c
   |";
22 Skom
 
19.07.10
08:41
(16) вообще готовое.
только в моем случае таблица Пользователи находится непосредственно в базе данных
у майка вроде как
отдельная база
и у меня

глЮзер.ИмяКлиентскогоСервера
глЮзер.ИмяПользователяWindows
глЮзер.ИмяКлиентскогоКомпа

эти значения из класса для работы с пользователями берутся.

ну в случае если терминальный доступ то записывается в таблицу имя клиентского компа - с которого заход на терминал произошел
доменное имя пользователя и имя компа терминального пишется
23 leshikkam
 
19.07.10
08:42
>ну в случае если терминальный доступ то записывается в таблицу имя клиентского >компа - с которого заход на терминал произошел
>доменное имя пользователя и имя компа терминального пишется
А можно посмотреть?
24 smaharbA
 
19.07.10
08:42
(21) хм, так и я могу... А мурку можешь ? (с)
25 Skom
 
19.07.10
08:43
(23)
    ИмяКлиентскогоКомпа = "";
    Реестр = СоздатьОбъект("РеестрWin");
    Если Реестр.ОткрытьКлюч("HKEY_CURRENT_USER", "Volatile Environment", "KEY_QUERY_VALUE") = 1 Тогда
         Реестр.ЗапроситьЗначение("CLIENTNAME", ИмяКлиентскогоКомпа);
    КонецЕсли;

    Попытка
        objNet = СоздатьОбъект("WScript.NetWork");
         ИмяКлиентскогоСервера     = objNet.ComputerName;
         ИмяПользователяWindows     = objNet.UserName;
    Исключение
         ИмяКлиентскогоСервера     = "";
         ИмяПользователяWindows     = "";
    КонецПопытки;



Sadovnikov (с) ))
26 smaharbA
 
19.07.10
08:44
(25) код не рабочий в некоторых случаях + и для этого кода совсем не обязательно лезть в реестр
27 Skom
 
19.07.10
08:45
(26) я не вдавался в подробности.
для моих нужд хватает. так что я в дебри не лезу
28 Skom
 
19.07.10
08:47
(26) в конце концов это ты гений скриптов. а не я)) (я их вообще почти не знаю.)
29 Фея с лопатой
 
19.07.10
08:48
(21,22) Спасибо, попробую себе воткнуть. Потренируюсь сначала на учебной конфе. )
30 smaharbA
 
19.07.10
08:49
(27)(28) да не прибедняйся
в (25) просто при переподключении или при перехвате управления будет выдавать комп (клиента) кто первый был подключен, да и клиентнаме не совсем имя компа, оно может быть поменено пользователем на своей станции, прав на это не требуется
31 smaharbA
 
19.07.10
08:51
+(30) немного соврал, оно может быть подменено клиентом рдп или на сервере самим пользователем
32 Skom
 
19.07.10
08:58
(31) да я помню мы это обсуждали уже на мисте.
но в моем случае это не так важно
ибо у нас переподключиться имеет право только админ домена
ну и программисты тоже.
так что это неактуально
33 dk
 
19.07.10
09:32
вроде взлетело, тока
[Adm]..[Users].[User_1c]='"+Сокрлп(глПользователь.Код)+"')
лишнее, т.к. несколько раз под одним пользователем можно зайти
ну и создание таблички автоматизировал, т.к. баз много

Процедура глУдалитьИнфуОПользователе()  Экспорт
   Запрос=СоздатьОбъект("ODBCRecordSet");
   ТЗ_пид = "
   |Select convert(varchar(10), @@SPID) PID
   |";
   Запрос.Открыть(ТЗ_пид);
   Запрос.ВНачало();
   ПИД = Сокрлп(Запрос.ПолучитьЗначение(1));
   ТЗ = "if (select object_id('Users')) is null
   |BEGIN
   |CREATE TABLE [Users] (
   |      [PID] [int] NOT NULL ,
   |    [User_1c] [char] (40) NOT NULL ,
   |    [intime] [datetime] NOT NULL)
   |END";
   Запрос.Выполнить(ТЗ);
   //ТЗ = "Delete from [Users] Where ([Users].[User_1c]='"+Сокрлп(ИмяПользователя())+"') or ([Users].PID = "+ПИД+")";
   ТЗ = "Delete from [Users] Where ([Users].PID = "+ПИД+")";
   Запрос.Выполнить(ТЗ);
КонецПроцедуры  

есчо раз спб