Просмотр блокировок 1С 7.7 SQL

0. 152 06.09.06 08:16 Сейчас в теме
Обработка позволяет наблюдать за быстродействием 1С, даёт возможность определять причину замедления работы и отстранять от работы её "автора".
Если Вы используете терминальный сервер (Citrix), а подключение к с серверу SQL идёт через один логин и пароль, то стандартные средства MS SQL не дают возможность различать пользователей и определять "виновника".
Предлагаемая обработка решает эту проблему.

Перейти к публикации

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Aleco 06.09.06 08:16 Сейчас в теме
Не хватает в kill.ert имя пользователя 1с
2. 09.09.06 12:28 Сейчас в теме
Правильно, в kill имени пользователя 1С нет! Чтобы его добыть - имя пользователя 1С - следуйте инструкциям и используйте "Блокировки.ert".
Впрочем, поскольку Вы дали такой комментарий, читать инструкции Вы не привыкли :-((.
3. saser 03.10.07 18:25 Сейчас в теме
автор развей мои сомнения

обработка kill.ert не показывает заблокированных , т.к. пытается анализировать только таблицу master..sysprocesses , а по полю blocked этой таблице вряд ли это можно сделать.

а вот "блокировки.ert" другое дело
4. saser 03.10.07 18:29 Сейчас в теме
а ну нашел на проклабе комментарий автора

>>> Кроме того, у kill.ert нет возможности смотреть заблокированных пользователей и комфортно отслеживать степень загруженности работой MS SQL.

вопрос снят
просто не понятно тогда, для чего она нужна :)
28. putinpe 11.10.16 16:47 Сейчас в теме
ГлавнаяТаблица.Время=Время-тблЗагруженность.Время;
{C:\USERS\POLGIN.D\DESKTOP\НОВАЯ ПАПКА (4)\БЛОКИРОВКИ.ERT(214)}: Операция вычитания не определена для строковых величин


как править?
31. Sure 152 12.10.16 12:15 Сейчас в теме
(28) putinpe, По-видимому, нужно преобразование:
ГлавнаяТаблица.Время=Число(Время)-Число(тблЗагруженность.Время);
5. o-mel 28.02.08 13:04 Сейчас в теме
Отличная обработка, пользовался на SQL 2000 долгое время..
Поставили SQL 2005 и с ней траблы..
Переделывать обработку под sql 2005 не собираешся???
6. Sure 152 28.02.08 16:40 Сейчас в теме
Пока не собираюсь: SQL 2005 в обозримом окружении нет. Собственно, работа с 1С 7.7 в нашей организации более не ведётся :-(. Потому возможностей для сколь-либо полезных доработок этой обработки у меня больше нет. В 1С 8.0 всё стало много хуже: сервер приложений изолирует нас и от соединения с SQL-сервером, а кроме того, попытка принудительно "прибить" злоумышленника, запустившего "тяжёлую" операцию в 1С ведёт к обрушению сервера приложений. В 1С 7.7 всё было много проще и приятнее.
7. Gilev.Vyacheslav 08.08.08 19:40 Сейчас в теме
8. MadDAD 144 18.09.08 04:28 Сейчас в теме
12. Sure 152 17.10.12 14:48 Сейчас в теме
Пришло сообщение.
Доброе время суток !
Александр, подскажите пожалуйста маленький вопрос по вашей обработке "Просмотр блокировок 1С 7.7 SQL"
Вопрос в следующем.
У нас на рабочем сервере крутятся две базы SQL разных конфигураций. Я добавил в одну базу константы и справочник и запустил обработку КонфигурироватьБлоки ровки. Далее когда запускаю обработку по просмотру блокировок то вижу в колонке пользователей имена активных пользователей из первой базы (в которой создан справочник АктивныеПользователи ) а так же подключения на SQL сервер которые происходят из второй базы (в которой этого справочника нет)
Возможно ли видеть при одновременно активных двух базах SQL сервера с помощью этой обработки пользователей из двух баз идентифицированных по именам ?

Отвечаю. Извините, что не могу отправить приватно: новая система начисления баллов на infostart загнала меня в минус.
Возможно. Но не стандартной версией, а настроенной под себя.
Нужно знать имена баз, в обеих завести механизм учёта болокировок, знать имена таблиц в основной базе и во второй (Пусть будут SC8888 и anorherdb..SC9999).
Тогда процедура a_lock_sp будет примерно выглядеть так
create proc a_lock_sp as
set nocount on
create table #locks (spid int,dbid int,ObjId int,IndId int, Type varchar(8),Resource varchar(30),Mode varchar(8),Status varchar(8))
insert #locks exec sp_lock
create table #who(spid int, ecid int, status varchar(20),loginame varchar(256), hostname varchar(256) ,blk char(5) null,dbname varchar(80)null, cmd varchar(256) null)
insert #who exec sp_who
select s.ROW_ID spid, left(d.name,15) as dbid,
case d.name
when 'onedb' then s.DESCR
when 'anotherdb' then s1.DESCR
else ''
end as name
, count(*) as QtyLock,convert(char(20),loginame) login,l.Status, convert(char(40),cmd) Command,convert(char(20),hostname) Host
from #locks l, #who w, SC8888 s, anorherdb..SC9999 s1, master..sysdatabases d
where d.dbid=l.dbid and l.Mode<>'S' and l.spid=w.spid and s.ROW_ID=l.spid group by s.ROW_ID, left(d.name,15),
case d.name
when 'onedb' then s.DESCR
when 'anotherdb' then s1.DESCR
else ''
end,
convert(char(20),loginame),l.Status, convert(char(40),cmd),convert(char(20),hostname) having s.ROW_ID<>@@SPID
drop table #locks, #who
set nocount off
return
grant exec on a_lock_sp to public

Она будет подхватывать имена пользователей из обеих баз.

Обращаю внимание: отличие процедуры от стандартной - вместо DESCR as name будет "простыня"
case d.name
when 'onedb' then s.DESCR
when 'anotherdb' then s1.DESCR
else ''
end as name
9. boks 1 21.05.09 07:58 Сейчас в теме
Отличная обработка, пользуюсь, нравится.
Автору респект.
10. Pierre 19.08.10 14:48 Сейчас в теме
А почему она может не показывать имена пользователей? т.е. пустые строки
11. Sure 152 19.08.10 21:41 Сейчас в теме
Во-первых, может показывать пустые строчки, если в ходе работы чистился справочник "Ативные пользователи". Во-вторых, если используются прямые запросы к SQL-базе, то они создаются "в обход регистрации пользователя", такие соединения с SQL не получают имени в таблице "АктивныеПользователи". Их Вы и видите.
На моём нынешнем месте работы база оптимизирована прямыми запросами достаточно сильно. И на одно соединение пользователя приходится ещё три соединения с SQL для запросов через ADO. Ну, благо, что здесь хоть терминальный сервер не используется :-)
13. Sure 152 08.11.12 13:15 Сейчас в теме
Отвечаю. Извините, что не могу отправить приватно: новая система начисления баллов на infostart загнала меня в минус.
Подскажите пожалуйста один момент.
В процедуре ПриНачалеРаботыСистемы() вы вставляете конструкцию

Процесс=СоздатьОбъект("Справочник.АктивныеПользователи");
Процесс.Новый();

Если 0=Процесс.НайтиЭлемент(Процесс) Тогда

не понятно вот что. В чем смысл конструкции
Если 0=Процесс.НайтиЭлемент(Процесс) Тогда

? Идея выполнять запрос при каждом входе пользователя в базу 1С ? Ведь и так понятно что если элемент справочника только создан то он не будет найден.

Это трюк. При конфигурации блокировок подменяется процедура поска элемента. Вместо этого в таблицу АктивныеПользователи запрос SQL вписывает имя текущего пользователя и номер его сессии. Таким образом, при просмотре блокировок мы может выяснить, кто из пользователей вызывает блокировки (SQL-сервер штатной процедурой sp_lock даёт не имя пользователя в 1С, а номер сессии и имя компьютера)
14. vovaapril 41 27.01.15 16:39 Сейчас в теме
Параметры подключения к БД SQL можно брать из файла 1CV7.DBA, а не заставлять пользователя вносить их руками
пример кода тут
15. Sure 152 28.01.15 10:41 Сейчас в теме
(14) vovaapril,
Да-да! Плавали-знаем. Я знаю способ получения пароля из параметров подключения. К сожалению, в моей жизни был пример, когда пароль, расшифрованный из параметров подключения не совпадал с паролем SQL. Потому что пароль был в русской раскладке. Так что пароль из констант оказался более надёжной штукой.
:-(
vovaapril; +1 Ответить
16. shiro93 03.07.15 11:54 Сейчас в теме
Добрый день.такая вот проблема при пробе подключиться к кто блокирует выскакивает ошибка SQL ERROR a_lock_sp :<<Microsoft OLE DB Provider for ODBC Drivers: [Microsoft][ODBC SQL Server Driver][SQL Server]Имя столбца или число предоставленных значений не соответствует определению таблицы.>>
кто что подскажет?
и еще время не хочет выводить ошибка: ГлавнаяТаблица.Время=СокрЛП(rs.Fields("wait").Value);
{C:\USERS\SHYROBOKOV.A\DESKTOP\LOCK\БЛОКИРОВКИ.ERT(97)}: Тип переменой не поддерживается
17. MadDAD 144 03.07.15 12:13 Сейчас в теме
(16) Версия SQL сервера какая?
18. shiro93 03.07.15 12:39 Сейчас в теме
20. MadDAD 144 03.07.15 14:15 Сейчас в теме
(18) Обработка "КонфигурированиеБлокировок" отработала нормально? В глобальник все что нужно добавлено? Константы установлены?
21. shiro93 03.07.15 14:29 Сейчас в теме
(20) MadDAD, с этим все верно отработало. к другим подключается. к этой не хочет процедуре
22. shiro93 06.07.15 09:43 Сейчас в теме
(20) MadDAD, проблема где-то в этом участке:
"set nocount on cre ate   table #locks (spid int,dbid int,ObjId int,IndId int, Type varchar(8),Resource varchar(30),Mode varchar(8),Status varchar(8)) ins ert #locks exec sp_lock cre ate   table #who(spid int,"+
 	" ecid int, status varchar(20),loginame varchar(256), hostname varchar(256) ,blk char(5) null,dbname varchar(80)null, cmd  varchar(256) null) insert #who exec sp_who sel ect s.ROW_ID spid, left(d.name,15) as dbid, DESCR as name,"+
 	" count(*) as QtyLock,convert(char(20),loginame) login,l.Status, convert(char(40),cmd) Command,convert(char(20),hostname) Host fr om #locks l, #who w, "+_txtTbl+" s, master..sysdatabases d where d.dbid=l.dbid and l.Mode<>'S' and l.spid=w.spid and"+
 	" s.ROW_ID=l.spid group by s.ROW_ID, left(d.name,15),DESCR, convert(char(20),loginame),l.Status, convert(char(40),cmd),convert(char(20),hostname) having s.ROW_ID<>@@SPID dr op   table #locks, #who se t nocount off return";
23. MadDAD 144 06.07.15 10:13 Сейчас в теме
(22) _txtTbl в Вашем случае чему равно?
24. shiro93 06.07.15 10:51 Сейчас в теме
(23) MadDAD, это имя таблицы справочника
25. shiro93 06.07.15 11:42 Сейчас в теме
(23) MadDAD, разобрался в табл #who не хватало колонки для выполнения процедуры sp_who
26. mai13 01.06.16 17:09 Сейчас в теме
(25) shiro93, А можете дать точную информацию, чего не хватало и как решить проблему "wait" ?
27. Sure 152 03.06.16 13:17 Сейчас в теме
(26) mai13,
Позвольте автору высказаться.

В старой версии MS SQL процедура sp_who выдавала на одну колонку меньше.
Лечение:
cmd varchar(256) null)
меняется на
cmd varchar(256) null, request_id int)

По поводу wait. По-видимому, 1С-у не нравится возвращаемое значение. Попробуйте заменить
max(waittime) wait
на
str(max(waittime),18,0) as wait
19. shiro93 03.07.15 12:58 Сейчас в теме
со второй ошибкой времени разобрался. первая осталась еще
29. putinpe 11.10.16 17:50 Сейчас в теме
Почему та таблица в которой данные по Активным пользователям не очищается?
Почему в той таблице показываются все БД которые на сервере?
30. putinpe 11.10.16 18:15 Сейчас в теме
Если Вы используете терминальный сервер (Citrix), а подключение к с серверу SQL идёт через один логин и пароль, то стандартные средства MS SQL не дают возможность различать пользователей и определять "виновника".
Предлагаемая обработка решает эту проблему.

У меня путает Базы . Я зашел в базу "TEST BLOсK" в показывает что в "TORG"

Конфа такая
1с 7.7
sql 2005
Терминальный доступ
100 человек все в 1с
Как мне сделать что бы все это заработало?
32. Sure 152 12.10.16 12:18 Сейчас в теме
(30) putinpe,
Для того, чтобы можно было видеть пользователей во всех базах, нужно во всех базах произвести доработки и воспользоваться предложенным в (12) ответом.
А иначе - смотрите на пустых пользователей
33. Sure 152 12.10.16 13:14 Сейчас в теме
Когда пользователь заходит в базу, то в процедуре ПриНачалеРаботыСистемы() в таблицу "АктивныеПользователи" записывается его имя. Если пользователь выходит из системы регламетным способом, то в процедура ПриЗавершенииРаботыСистемы() имя очищается.
Если же пользователь выходит из системы "нерегламентно", то есть при снятии задачи, при kill в SQL, при ошибке и т.п., то процедура ПриЗавершенииРаботыСистемы() не запускается, имя не очищается.

Если в других базах (не обязательно 1С-ных) на SQL работает пользователи, то в таблице "АктивныеПользователи" они не регистрируются.
Более того, если пользователь запускает обработку, применяющую SQL запросы через ODBC, ADO, то такие запросы имеют дополнительные входы на SQL сервер. Которые также не регистрируются в таблице "АктивныеПользователи". Да, это недостаток предлагаемого решения.
Feci quod potui, faciant meuora potentes.
Оставьте свое сообщение
Вопросы с вознаграждением
Вакансии
Программист, аналитик, эксперт 1С
Санкт-Петербург
По совместительству

Программист 1С
Москва
зарплата от 150 000 руб. до 200 000 руб.
Полный день

Ведущий разработчик 1С
Москва
зарплата от 250 000 руб.
Полный день

Руководитель проектов 1С
Москва
зарплата от 200 000 руб.
Полный день

Консультант-аналитик 1С
Нижний Новгород
зарплата от 55 000 руб. до 100 000 руб.
Полный день