Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Как вычислить кто блокирует журнал документов? (число прочтений - 6198 )
dimm73
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 414
Зарегистрирован: 03. Июля 2006
Пол: Мужской
Как вычислить кто блокирует журнал документов?
14. Февраля 2007 :: 13:10
Печать  
Имеется 1С V77 27 релиз SQL , выделенный SQL сервер win2000 sp4 adv  SQL2000 sp4
используется 1С++ 1.8.1.6, а также компанента vk_TerminalSleep(для исправления ошибки 1С с блокировкой документов, выставляет паузы) , пользователей =40
Но даже с использованием этой компаненты случается что плользователи секунд на 30 виснут (не наглухо как раньше без TerminalSleep) с ожиданием захвата журнала документов. Хочется вычислить кто из пользователей блокирует журнал, что бы попытатся исправить ситуацию.
Подскажите как это можно сделать?
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Как вычислить кто блокирует журнал документов?
Ответ #1 - 14. Февраля 2007 :: 13:16
Печать  
можно так:
Код
Выбрать все
use dbname
select
  rtrim(procs.hostname) Хост,
  object_name(lock.rsc_objid) Объект,
  db_name(lock.rsc_dbid) БД,
  req_mode Режим,
  count(*) count
from master..syslockinfo lock (nolock)
join master..sysprocesses procs (nolock) on procs.spid = lock.req_spid
where
  lock.req_ownertype=1 and
  lock.rsc_dbid > 2
group by
  procs.hostname,
  lock.rsc_objid,lock.rsc_dbid,
  req_mode
order by Режим desc, Хост, Объект 

« Последняя редакция: 15. Февраля 2007 :: 05:36 - trad »  

1&&2&&3
Наверх
 
IP записан
 
dimm73
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 414
Зарегистрирован: 03. Июля 2006
Пол: Мужской
Re: Как вычислить кто блокирует журнал документов?
Ответ #2 - 14. Февраля 2007 :: 13:41
Печать  
Код
Выбрать все
	RS = СоздатьОбъект("ODBCRecordset");
	RS.УстБД1С();
	ТекстЗапроса = "
	|use sql1c
	|select
	|  rtrim(procs.hostname) as Хост,
	|  object_name(lock.rsc_objid) Объект,
	|  db_name(lock.rsc_dbid) БД,
	|  req_mode Режим,
	|  count(*) count
	|from master..syslockinfo lock (nolock)
	|join master..sysprocesses procs (nolock) on procs.spid = lock.req_spid
	|where
	|  lock.req_ownertype=1 and
	|  lock.rsc_dbid > 2
	|group by
	|  procs.hostname,
	|  lock.rsc_objid,lock.rsc_dbid,
	|  req_mode
	|order by Режим desc, Хост, Объект
	|";
	ТЗ1 = RS.ВыполнитьИнструкцию(ТекстЗапроса);
  ТЗ1.ВыбратьСтроку();
 


выдает Значение не представляет агрегатный объект (ВыбратьСтроку)
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Как вычислить кто блокирует журнал документов?
Ответ #3 - 14. Февраля 2007 :: 14:07
Печать  
в этой среде выполнения нельзя устнавливать/изменять БД контекста - убери use
  

1&&2&&3
Наверх
 
IP записан
 
vivm
Full Member
***
Отсутствует



Сообщений: 159
Местоположение: Новосибирск
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как вычислить кто блокирует журнал документов?
Ответ #4 - 15. Февраля 2007 :: 03:15
Печать  
а я поставил запрос на обработкуОжидания() и отслеживаю это в реальном времени:

Код
Выбрать все
Перем Стоп;
//*******************************************
Процедура Сформировать()
	Если Стоп=0 Тогда
		Запрос=СоздатьОбъект("ODBCRecordset");
		Запрос.РежимRPC(1);
		ИмяБазы="Fland1";
		Запрос.УстановитьТекстовыйПараметр("DBName", ИмяБазы);
		//Запрос.Отладка(1);
		ТекстЗапроса = "
		|SELECT
		//| convert (smallint, req_spid) As spid,
		    | us.user_1c as usr,
		//| rsc_dbid As dbid,
		| rsc_objid As ObjId,
		| so.Name As ObjectName,
		| rsc_indid As IndId,
		| substring (v.name, 1, 4) As Type,
		| substring (rsc_text, 1, 16) as Resource,
		| substring (u.name, 1, 8) As Mode,
		| substring (x.name, 1, 5) As Status
		|FROM master.dbo.syslockinfo sli (Nolock)
		|JOIN master.dbo.spt_values v (Nolock)
		| ON sli.rsc_type = v.number
		| AND v.type = 'LR'
		|JOIN master.dbo.spt_values x (Nolock)
		| ON sli.req_status = x.number
		| AND x.type = 'LS'
		|JOIN master.dbo.spt_values u (Nolock)
		| ON sli.req_mode + 1 = u.number
		| AND u.type = 'L'
		|JOIN master.dbo.sysdatabases sd (Nolock)
		| ON  sli.rsc_dbid = sd.dbid
		|JOIN "+ ИмяБазы +".dbo.sysobjects so
		| ON sli.rsc_objid = so.id
		|JOIN Adm.dbo.users us (Nolock)
		| ON sli.req_spid = us.PID
		|WHERE	sd.name = :DBName
		|";
		ТЗ=Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
		ТЗ.Выгрузить(фТЗ);
	КонецЕсли;
КонецПроцедуры
//----------------------------------------------------------------------------
Процедура СтопСтарт()
	Если Стоп=0 Тогда
		Стоп=1;
		Форма.кнСтоп.Заголовок("Старт");
	Иначе
		Стоп=0;
		Форма.кнСтоп.Заголовок("Стоп");
	КонецЕсли;
КонецПроцедуры
//----------------------------------------------------------------------------
Процедура ПриОткрытии()
	Стоп=1;
	Если ПустоеЗначение(фИнтервал)=1 Тогда
		фИнтервал=5;
	КонецЕсли;
	Форма.ОбработкаОжидания("Сформировать",фИнтервал);
КонецПроцедуры   

  
Наверх
ICQ  
IP записан
 
dimm73
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 414
Зарегистрирован: 03. Июля 2006
Пол: Мужской
Re: Как вычислить кто блокирует журнал документов?
Ответ #5 - 15. Февраля 2007 :: 05:46
Печать  
Код
Выбрать все
Процедура Сформировать()
//Если Стоп=0 Тогда
Запрос=СоздатьОбъект("ODBCRecordset");
Запрос.РежимRPC(1);
ИмяБазы="sql1c";
Запрос.УстановитьТекстовыйПараметр("DBName", ИмяБазы);
//Запрос.Отладка(1);
ТекстЗапроса = "
|SELECT
//| convert (smallint, req_spid) As spid,
    | us.user_1c as usr,
//| rsc_dbid As dbid,
| rsc_objid As ObjId,
| so.Name As ObjectName,
| rsc_indid As IndId,
| substring (v.name, 1, 4) As Type,
| substring (rsc_text, 1, 16) as Resource,
| substring (u.name, 1, 8) As Mode,
| substring (x.name, 1, 5) As Status
|FROM master.dbo.syslockinfo sli (Nolock)
|JOIN master.dbo.spt_values v (Nolock)
| ON sli.rsc_type = v.number
| AND v.type = 'LR'
|JOIN master.dbo.spt_values x (Nolock)
| ON sli.req_status = x.number
| AND x.type = 'LS'
|JOIN master.dbo.spt_values u (Nolock)
| ON sli.req_mode + 1 = u.number
| AND u.type = 'L'
|JOIN master.dbo.sysdatabases sd (Nolock)
| ON  sli.rsc_dbid = sd.dbid
|JOIN "+ ИмяБазы +".dbo.sysobjects so
| ON sli.rsc_objid = so.id
|JOIN Adm.dbo.users us (Nolock)
| ON sli.req_spid = us.PID
|WHERE sd.name = :DBName
|";
ТЗ=Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
ТЗ.ВыбратьСтроку();
//ТЗ.Выгрузить(фТЗ);
//КонецЕсли;
КонецПроцедуры
 


ошибка: Invalid object name 'Adm.dbo.users
  
Наверх
 
IP записан
 
Mikeware
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 262
Зарегистрирован: 27. Июля 2006
Пол: Мужской
Re: Как вычислить кто блокирует журнал документов?
Ответ #6 - 15. Февраля 2007 :: 06:43
Печать  
vivm писал(а) 15. Февраля 2007 :: 03:15:
а я поставил запрос на обработкуОжидания() и отслеживаю это в реальном времени:

ругается на
           |JOIN Adm.dbo.users us (Nolock)
           | ON sli.req_spid = us.PID
Invalid object name 'Adm.dbo.users'.
  
Наверх
ICQ  
IP записан
 
vivm
Full Member
***
Отсутствует



Сообщений: 159
Местоположение: Новосибирск
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как вычислить кто блокирует журнал документов?
Ответ #7 - 15. Февраля 2007 :: 10:14
Печать  
У меня ещё на SQL-сервере есть база Adm, в ней таблица users, я её заполняю при входе пользователя в 1С следующей процедурой:

Код
Выбрать все
Процедура глДобавитьИнфуОПользователе() Экспорт
	Запрос=СоздатьОбъект("ODBCRecordSet");
	ТЗ_пид = "
	|Select convert(varchar(10), @@SPID) PID
	|";
	Запрос.Открыть(ТЗ_пид);
	Запрос.ВНачало();
	ПИД = Сокрлп(Запрос.ПолучитьЗначение(1));
	//-----------Сначала удаляем------------------------------------    
	ТЗ = "Delete from [Adm]..[Users] Where ([Adm]..[Users].[User_1c]='"+Сокрлп(глПользователь.Код)+"') or ([Adm]..[Users].PID = "+ПИД+")";
	Запрос.Выполнить(ТЗ);
	//-----------------А теперь добавляем-------------------------------------
	т(ДатаЧисло(ТекущаяДата()),"Ч(0)2");
	ДатаТек = ДатаТек+" "+ТекущееВремя()+".000";
	ТЗ = "insert into [Adm]..[Users] values("+ПИД+", '"+Сокрлп(глПользователь.Код)+"', Convert(datetime, '"+Сокрлп(ДатаТек)+"', 102))";
	Если Запрос.Выполнить(ТЗ)=0 Тогда
		Сообщить(Запрос.ПолучитьОписаниеОшибки());
	Конецесли;											  
	//------------------------------------------------------------------
КонецПроцедуры	 



она нужна для связи имени пользователя в 1С и SPID - идентификатора процесса
  
Наверх
ICQ  
IP записан
 
Mikeware
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 262
Зарегистрирован: 27. Июля 2006
Пол: Мужской
Re: Как вычислить кто блокирует журнал документов?
Ответ #8 - 15. Февраля 2007 :: 11:13
Печать  
vivm писал(а) 15. Февраля 2007 :: 10:14:
У меня ещё на SQL-сервере есть база Adm, в ней таблица users, я её заполняю при входе пользователя в 1С следующей процедурой:

она нужна для связи имени пользователя в 1С и SPID - идентификатора процесса

А формат таблички можно? Для полного счастья.... Улыбка
  
Наверх
ICQ  
IP записан
 
vivm
Full Member
***
Отсутствует



Сообщений: 159
Местоположение: Новосибирск
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как вычислить кто блокирует журнал документов?
Ответ #9 - 16. Февраля 2007 :: 02:51
Печать  
Mikeware писал(а) 15. Февраля 2007 :: 11:13:
vivm писал(а) 15. Февраля 2007 :: 10:14:
У меня ещё на SQL-сервере есть база Adm, в ней таблица users, я её заполняю при входе пользователя в 1С следующей процедурой:

она нужна для связи имени пользователя в 1С и SPID - идентификатора процесса

А формат таблички можно? Для полного счастья.... Улыбка


так вот он:
  

users.GIF ( 3 KB | Загрузки )
users.GIF
Наверх
ICQ  
IP записан
 
Mikeware
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 262
Зарегистрирован: 27. Июля 2006
Пол: Мужской
Re: Как вычислить кто блокирует журнал документов?
Ответ #10 - 16. Февраля 2007 :: 04:22
Печать  
Спасибо. Пробую.
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать