Имя: Пароль:
1C
1С v8
Статистика работы пользователей
0 sunson
 
20.03.13
14:27
1. Можно средствами 1С 67% (2)
2. другое 33% (1)
3. Можно средствами SQL 0% (0)
4. Нельзя 0% (0)
Всего мнений: 3

Дорогие друзья! Извините, что к вам обращаюсь. Сами мы не местные)))

Мне надо собрать статистику по работе пользователей в течение дня. Т.е. определить в какое время дня сколько пользователей не просто сидят в базе, но реально в ней что-то делают. Сама база находится на SQL. Отсюда вопрос: Можно ли это сделать средствами SQL? Если да, то как это сделать? И конечно хотелось бы получить эти данные в форме какой либо диаграммы для простоты анализа.

Помогите, кто чем может. Посоветуйте, не проходите мимо.)
1 Бледно Золотистый
 
20.03.13
14:29
Отчет по ЖР подойдет?
2 andreymongol82
 
20.03.13
14:30
Реально что-то делают это как? Фигачат кучу документов? Клепают отчеты? У некоторых например реальная работа заключается сформировать отчет и думать-думать-думать...
3 Wobland
 
20.03.13
14:30
4 GANR
 
20.03.13
14:31
Соединение (IInfoBaseConnectionInfo)
Соединение (IInfoBaseConnectionInfo)
Свойства:

AppID (AppID)
blockedByDBMS (blockedByDBMS)
bytesAll (bytesAll)
bytesLast5Min (bytesLast5Min)
callsAll (callsAll)
callsLast5Min (callsLast5Min)
ConnectedAt (ConnectedAt)
ConnID (ConnID)
dbConnMode (dbConnMode)
dbmsBytesAll (dbmsBytesAll)
dbmsBytesLast5Min (dbmsBytesLast5Min)
dbProcInfo (dbProcInfo)
dbProcTook (dbProcTook)
dbProcTookAt (dbProcTookAt)
durationAll (durationAll)
durationAllDBMS (durationAllDBMS)
durationCurrent (durationCurrent)
durationCurrentDBMS (durationCurrentDBMS)
durationLast5Min (durationLast5Min)
durationLast5MinDBMS (durationLast5MinDBMS)
HostName (HostName)
IBConnMode (IBConnMode)
ThreadMode (ThreadMode)
UserName (UserName)

Описание:

Содержит параметры одного соединения клиентского приложения с информационной базой на кластере серверов 1С:Предприятия.
Представляет собой объект с интерфейсом IInfoBaseConnectionInfo.

Доступность:

Интеграция.
Пример:

Rem Пример удаления всех соединений (фрагмент на VBScript):
Set connector = CreateObject("V82.COMConnector")
Set ragent = connector.ConnectAgent("CentralServer")
ragent.AuthenticateAgent "CentralAdminName", "Password"
clusters = ragent.GetClusters()
Set cluster = clusters(0)
ragent.Authenticate cluster, "ClusterAdminName", "Password"
processes = ragent.GetWorkingProcesses(cluster)
Set process0 = processes(0)
WorkingAddress = process0.HostName  ":"  process0.MainPort
Set server = connector.ConnectWorkingProcess(WorkingAddress)
server.AddAuthentication "InfoBaseUserName", "Password"
Set ibDesc = server.CreateInfoBaseInfo()
ibDesc.Name = "InfoBaseName"
connections = server.GetInfoBaseConnections(ibDesc)
Dim i
For i = LBound(connections) To UBound(connections)
   set connection = connections(i)
   server.Disconnect connection
Next


См. также:

Соединение с рабочим процессом, метод Disconnect



--------------------------------------------------------------------------------

© ООО "1С", 1996-2012. Все права защищены.

Можно средствами 1С
5 GANR
 
20.03.13
14:33
Можно-можно... Лично выгонялку неактивных писал.
6 sunson
 
20.03.13
14:33
(2) Формирование отчетов - это тоже реально что-то делают. Т.е. у них не просто открыта база, а они рубятся в косынку, у них идет обмен данными с сервером.
7 GANR
 
20.03.13
14:34
callsLast5Min - ключевое слово в (4)
8 sunson
 
20.03.13
14:35
(4) Это я так понимаю методы консоли кластера?
9 mistеr
 
20.03.13
14:36
(0) Статистика с прокси надежнее. :) Подкиньте руководству идею, пусть админ отдувается.
10 GANR
 
20.03.13
14:36
(8) можно сказать так, только языком 1С
11 sunson
 
20.03.13
14:36
Вообщем-то вопрос не по каждому пользователю, а исключительно в целом по базе. Т.е. суммарный поток обращений пользователя к серверу в течение дня.
12 sunson
 
20.03.13
14:37
(9) хороший вариант)))
13 GANR
 
20.03.13
14:39
СерверКластер = СокрЛП(ВыборкаКластер.ИмяСервераКластер);
       ПортКластер = СокрЛП(ВыборкаКластер.ПортКластер);
       ПользовательКластер = СокрЛП(ВыборкаКластер.ПользовательКластер);
       ПарольКластер = СокрЛП(ВыборкаКластер.ПарольКластер);        
       
       Агент = Коннектор.ConnectAgent(СерверКластер + ":" + ПортКластер);
       Выборка = ВыборкаКластер.Выбрать();
       Кластеры = Агент.GetClusters();
       
       Для Каждого Кластер Из Кластеры Цикл
           
           // получим и переберем процессы кластера    
           Агент.Authenticate(Кластер, ПользовательКластер, ПарольКластер);
           Сеансы = Агент.GetSessions(Кластер);
           
           Для Каждого Сеанс Из Сеансы Цикл
               
               ОтборБазы.База = Сеанс.InfoBase.Name;
               Выборка.Сбросить();
               
               Если Выборка.НайтиСледующий(ОтборБазы) Тогда
                   
                   Если Сеанс.userName = Выборка.ПользовательБазы И Сеанс.AppID = "1CV8" Тогда
                       
                       ОписаниеСоединения = Сеанс.Connection;
                       ConnID = ОписаниеСоединения.ConnID;
                       ConnectedAt = ОписаниеСоединения.ConnectedAt;
                       callsLast5Min = Сеанс.callsLast5Min;
                       СинхронизацияНачалаСеансов.Вставить(ConnID, ConnectedAt);
                       МинимальноеЧислоПерекличек = ?(ЗначениеЗаполнено(Выборка.ПерекличекЗа5Минут), Выборка.ПерекличекЗа5Минут, 25);
                       СоединениеНужноОтключить = callsLast5Min <= МинимальноеЧислоПерекличек;
                       
                       Если СоединениеНужноОтключить = Истина Тогда
                           
                           ИндексДС = 0;
                           Пока СоединениеНужноОтключить = Истина И ИндексДС <= ВсеПятиминуткиСеансовСервер.Количество() - 1 Цикл
                               
                               ПятиминуткаСеансов = ВсеПятиминуткиСеансовСервер[ИндексДС]; ИндексТС = 0;
                               Пока СоединениеНужноОтключить = Истина И ИндексТС <= ПятиминуткаСеансов.Количество() - 1 Цикл
                                   
                                   СоединениеНужноОтключить = ConnID <> ПятиминуткаСеансов[ИндексТС];
                                   ИндексТС = ИндексТС + 1;
                               КонецЦикла;
                               ИндексДС = ИндексДС + 1;
                           КонецЦикла;
                       Иначе
                           
                           ПоследняяПятиминутка.Добавить(ConnID);
                       КонецЕсли;
                       
                       Если СоединениеНужноОтключить = Истина Тогда
                           
                           ОписаниеПроцесса = Сеанс.Process;
                           ПортПроцесса = СтрЗаменить(Строка(ОписаниеПроцесса.MainPort), Символы.НПП, "");
                           РабПроц = Коннектор.ConnectWorkingProcess(ОписаниеПроцесса.HostName + ":" + ПортПроцесса);
                           // логин админа кластера
                           РабПроц.AuthenticateAdmin(ПользовательКластер, ПарольКластер);                    
                           // логин админа базы                    
                           РабПроц.AddAuthentication(Выборка.ПользовательОтключение, Выборка.ПарольОтключение);
                           ИнформационнаяБаза = РабПроц.CreateInfoBaseInfo();
                           ИнформационнаяБаза.Name = Сеанс.InfoBase.Name;
                           НаборСоединений = РабПроц.GetInfoBaseConnections(ИнформационнаяБаза);
                           
                           Для Каждого Соединение Из НаборСоединений Цикл
                               
                               Если ConnID = Соединение.ConnID Тогда
                                   
                                   Попытка
                                       РабПроц.Disconnect(Соединение);
                                       ЗаписьЖурналаРегистрации("Обновление статистики активности сеансов", УровеньЖурналаРегистрации.Предупреждение, МД_РегламентноеЗадание, , "Сеанс " + ConnID + " принудительно отключен фоновым заданием");
                                   Исключение
                                       ЗаписьЖурналаРегистрации("Обновление статистики активности сеансов", УровеньЖурналаРегистрации.Ошибка, МД_РегламентноеЗадание, , "Сеанс " + ConnID + " не удалось отключить фоновым заданием " + ОписаниеОшибки());
                                   КонецПопытки;
                               КонецЕсли;
                           КонецЦикла;
                       КонецЕсли;
                   КонецЕсли;
               КонецЕсли;
           КонецЦикла;
       КонецЦикла;

Это к (11)
14 GANR
 
20.03.13
14:41
+(13) это перестало работать после перехода на платформу где-то 8.2.14
15 sunson
 
20.03.13
14:42
(14) А сколько в кластере серверов?
16 sunson
 
20.03.13
14:43
(9) но в общем-то админ не дурак отбрыкается сто пудово)
17 GANR
 
20.03.13
14:44
(15) дальше - справка
18 Kreont
 
20.03.13
14:47
(9) в самую точку что надо анализировать :)
19 Kreont
 
20.03.13
14:49
Но такой отчет очень зависит от "вида" бухгалтера. Если это бухгалтер-оператор, задание котрого внести N-документов, тогда есть смысл, для других "думающих" и смотрящих отчеты, звонящих там по актам сверок и т.п. этот отчет ниче не даст.

другое
20 GANR
 
20.03.13
14:50
(9) вряд ли подойдет, так как (6) и может с сетевыми папками работа идти
21 wowik
 
20.03.13
14:58

Можно средствами 1С
22 GANR
 
20.03.13
15:22
(21) А если пользователь только формирует отчеты?
23 sunson
 
20.03.13
15:32
(22) (21) да, тут скорее подходит считывать с кластера периодически количество данных которые получил пользователь, суммировать по пользователям и складывать в ТЗ
24 GANR
 
20.03.13
15:36
(23) правильный вывод!
25 sunson
 
20.03.13
15:42
(24) Наверняка можно средствами SQL получить это быстрее. Вот бы теперь придумать КАК)))
26 GANR
 
20.03.13
16:53
(25) Многие 1С-вские данные в базе на MS SQL хранятся в формате image и binary и как их распаковывать - мало кто знает.
27 GANR
 
20.03.13
16:55
(26) может стать затыком на пути (25)