Имя: Пароль:
1C
1С v8
Написал программу для получения списка блокировок
,
0 dcvetkov
 
11.06.15
10:11
Программа берет список блокировок с сервера 1С8, смотрит идентификаторы соединений с базой данных (MS SQL), сводит это всё вместе и показывает, кто кого блокирует.

http://rghost.ru/8GwxTwgz4

В архиве два варианта программы для 1С82 и 1С83.

Вот пример вывода в упрощенном режиме:

2015.06.11 09:38:02    70    Юдникова Светлана Николаевна (14091-0)    blocking 136
2015.06.11 09:38:02   136    Кривоногова Наталья Александровна (96121-0)    blocked by 70
2015.06.11 09:38:09    88    Левинская Ольга Николаевна (1C8SRV)    blocking 88
2015.06.11 09:38:11    70    Юдникова Светлана Николаевна (14091-0)    blocking 136
2015.06.11 09:38:11   136    Кривоногова Наталья Александровна (96121-0)    blocked by 70
2015.06.11 09:38:12   130    Левинская Ольга Николаевна (37121-1)    blocking 136
2015.06.11 09:38:12   136    Кривоногова Наталья Александровна (96121-0)    blocked by 130

В конфиге можно выставить "long = yes", будет показывать доп. инф-ию, включая текст SQL запроса.

Если нужно показывать ещё какую-то информацию - говорите, постараюсь доработать.

Чтобы программа заработала, надо зарегистрировать в системе COM-компонент.
Идёте в каталог своего клиента:
C:\Program Files\1cv82\...версия...\bin\
Выполняете команду:
regsvr32.exe comcntr.dll

Ещё у меня была ошибка про лицензию, пока не прописал "UseHWLicenses=1" в файле
C:\Users\user\AppData\Roaming\1C\1CEStart\1CEStart.cfg

Извините, если изобрёл велосипед :)
1 Вася Чез
 
11.06.15
10:16
(0) хвастаетесь?
2 palpetrovich
 
11.06.15
10:16
норм чё ... "кто" - понятно, где "кого"?
зы  а для кюшек такое-же мона? :)
3 aka AMIGO
 
11.06.15
10:17
(1) дарит..
4 palpetrovich
 
11.06.15
10:18
+(2) а , эт типа Кривоногова блокирует Юдникову и наоборот?
5 dcvetkov
 
11.06.15
10:19
(2)
blocking - значит этот процесс блокирует того-то..
blocked by - заблокировано тем-то (по ид смотрим кем в соседних строчках)
6 MadHead
 
11.06.15
10:26
(0) Вполне возможно, что данная прога будет жить. Так как избыточные блокировки проблема часто возникающая, а настраивать цуп дорого и трудоемко. Но как я понимаю прога будет работать только для управляемых блокировок?
7 Гёдза
 
11.06.15
10:29
(6) У Гилева есть бесплатный сервис по сбору. Анализ - за бабло
8 Гёдза
 
11.06.15
10:29
(7) Конечно же все инфа берется из ТЖ и трэйсов SQL
9 dcvetkov
 
11.06.15
10:32
(6) почему для управляемых? Нет такого ограничения. У нас на предприятии управляемые блокировки вообще не используются пока.

Программа берет с сервера 1с список блокировок. Для каждой сессии смотрит поле "Соединение с БД". По этому идентификатору смотрит на SQL-сервере, кто кого блокирует.
10 Aistovich
 
11.06.15
10:35
вот так вот, одной простой вещью можно утопить половину функционала какой конфигурации и сэкономить полгода жизни саппортщика, уменьшить количество седых волос на его голове.
(0) спасибо, брат
11 ИС-2
 
naïve
11.06.15
11:05
(0) спасибо, скачал как раз куча блокировок висит
12 DarkWater
 
11.06.15
11:07
(0) Скачал, спасибо!
13 Господин ПЖ
 
11.06.15
11:09
скачал на всякой

автору +1 в карму
14 Маратыч
 
11.06.15
11:10
(0) Отлично, респектище.
15 Jonny_Khomich
 
11.06.15
11:15
давай исходный код
16 y22-k
 
11.06.15
11:18
(0)Круто , молодец
17 чувак
 
11.06.15
11:20
18 Маратыч
 
11.06.15
11:20
Не то чтобы я автора считаю злодеем, но... кто-нибудь уже проверил на вирусы и на тестовой платформе?

З.Ы. ТС, ничего личного.
19 NikVars
 
11.06.15
11:27
(17) И как это понимать?! У тебя нет нужного фрейворка или он есть и это ошибка у автора?!
20 NikVars
 
11.06.15
11:27
(0) Респект! Спасибо!
21 Kvant1C
 
11.06.15
11:28
(17) Ну так он тебе русским по белому пишет, что фреймворк установить надо...
22 NikVars
 
11.06.15
11:29
(18) То есть ты автору не веришь, а поверишь другому, кто скажет - да, проверял?!
23 dcvetkov
 
11.06.15
11:30
(17)
Поставьте Framework 4.5
(18)
Прогоните на virustotal.com
Но, конечно, в идеале надо запустить на тестовой среде и посмотреть, не отсылается ли куда-нить налево секретная информация.
24 Попытка1С
 
11.06.15
11:32
А не проще на скл сервере все это посмотреть?
25 Попытка1С
 
11.06.15
11:41
Вот не плохо скрипт например.

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

DECLARE @dbid AS smallint;
use [s2008];
SET @dbid=DB_ID();

/*кто кого*/
SELECT DB_NAME(pr1.dbid) AS 'DB'
      ,pr1.spid AS 'ID жертвы'
      ,RTRIM(pr1.loginame) AS 'Login жертвы'
      ,pr2.spid AS 'ID виновника'
      ,RTRIM(pr2.loginame) AS 'Login виновника'
      ,pr1.program_name AS 'программа жертвы'
      ,pr2.program_name AS 'программа виновника'
      ,txt.[text] AS 'Запрос виновника'
FROM   MASTER.dbo.sysprocesses pr1(NOLOCK)
       JOIN MASTER.dbo.sysprocesses pr2(NOLOCK)
            ON  (pr2.spid = pr1.blocked)
       OUTER APPLY sys.[dm_exec_sql_text](pr2.[sql_handle]) AS txt
WHERE  pr1.blocked <> 0

/* Кто что блокирует */
SELECT s.[nt_username]
      ,request_session_id
      ,tran_locks.[request_status]
      ,rd.[Description] + ' (' + tran_locks.resource_type + ' ' + tran_locks.request_mode + ')' [Object]
      ,txt_blocked.[text]
      ,COUNT(*) [COUNT]
FROM   sys.dm_tran_locks AS tran_locks WITH (NOLOCK)
       JOIN sys.sysprocesses AS s WITH (NOLOCK)
            ON  tran_locks.request_session_id = s.[spid]
       JOIN (
                SELECT 'KEY' AS sResource_type
                      ,p.[hobt_id] AS [id]
                      ,QUOTENAME(o.name) + '.' + QUOTENAME(i.name) AS [Description]
                FROM   sys.partitions p
                       JOIN sys.objects o
                            ON  p.object_id = o.object_id
                       JOIN sys.indexes i
                            ON  p.object_id = i.object_id
                            AND p.index_id = i.index_id
                UNION ALL
                SELECT 'RID' AS sResource_type
                      ,p.[hobt_id] AS [id]
                      ,QUOTENAME(o.name) + '.' + QUOTENAME(i.name) AS [Description]
                FROM   sys.partitions p
                       JOIN sys.objects o
                            ON  p.object_id = o.object_id
                       JOIN sys.indexes i
                            ON  p.object_id = i.object_id
                            AND p.index_id = i.index_id
                UNION ALL
                SELECT 'PAGE'
                      ,p.[hobt_id]
                      ,QUOTENAME(o.name) + '.' + QUOTENAME(i.name)
                FROM   sys.partitions p
                       JOIN sys.objects o
                            ON  p.object_id = o.object_id
                       JOIN sys.indexes i
                            ON  p.object_id = i.object_id
                            AND p.index_id = i.index_id
              
                UNION ALL
                SELECT 'OBJECT'
                      ,o.[object_id]
                      ,QUOTENAME(o.name)
                FROM   sys.objects o
            ) AS RD
            ON  RD.[sResource_type] = tran_locks.resource_type
            AND RD.[id] = tran_locks.resource_associated_entity_id
       OUTER APPLY sys.[dm_exec_sql_text](s.[sql_handle]) AS txt_Blocked
WHERE  (
           tran_locks.request_mode = 'X'
           AND tran_locks.resource_type = 'OBJECT'
       )
       OR  tran_locks.[request_status] = 'WAIT'
GROUP BY
       s.[nt_username]
      ,request_session_id
      ,tran_locks.[request_status]
      ,rd.[Description] + ' (' + tran_locks.resource_type + ' ' + tran_locks.request_mode + ')'
      ,txt_blocked.[text]
ORDER BY
       6 DESC
      

IF EXISTS ( SELECT  Name

            FROM    tempdb..sysobjects

            WHERE   name LIKE '#LOCK_01_01%' )
    DROP TABLE #LOCK_01_01


CREATE TABLE #LOCK_01_01

    (

      spid INT,

      dbid INT,

      ObjId INT,

      IndId SMALLINT,

      Type VARCHAR(20),

      Resource VARCHAR(50),

      Mode VARCHAR(20),

      Status VARCHAR(20)

    )

INSERT  INTO #LOCK_01_01

EXEC sp_lock


select OBJECT_NAME(ObjId) as [Имя объекта], Mode [Тип блокировки (код)],

CASE
     WHEN Mode='Sch-S' THEN 'Блокировка стабильности схемы. Гарантирует, что элемент схемы, такой как таблица или индекс, не будет удален до тех пор, пока сеанс связи удерживает блокировку стабильности схемы на данный элемент схемы;'

WHEN Mode='Sch-М' THEN '= Блокировка изменения схемы. Должен поддерживаться любым сеансом связи, во время которого предполагается изменить схему данного ресурса. Гарантирует, что другие сеансы не имеют ссылок на обозначенный объект;'

WHEN Mode='S' THEN 'S = Коллективная блокировка. Удерживающему сеансу предоставлен коллективный доступ к ресурсу;'

WHEN Mode='U' THEN 'U = Блокировка обновления. Указывает блокировку обновления, полученную на ресурсы, которые со временем могут быть обновлены. Используется для предотвращения общей формы взаимоблокировки, которая возникает, когда множество сеансов блокируют ресурсы для потенциального обновления в последующее время;'

WHEN Mode='X' THEN 'X = Монопольная блокировка. Удерживающему сеансу предоставлен исключительный доступ к ресурсу;'

WHEN Mode='IS' THEN 'IS = Блокировка с намерением коллективного доступа. Указывает намерение поместить S блокировки на некоторые подчиненные ресурсы в иерархии блокировок;'

WHEN Mode='IU' THEN 'IU = Блокировка с намерением обновления. Указывает намерение поместить U блокировки на некоторые подчиненные ресурсы в иерархии блокировок;'

WHEN Mode='IX' THEN 'IX = Блокировка с намерением монопольного доступа. Указывает намерение поместить X блокировки на некоторые подчиненные ресурсы в иерархии блокировок;'

WHEN Mode='SIU' THEN 'SIU = Коллективная блокировка с намерением обновления. Указывает коллективный доступ к ресурсу с намерением получения блокировок обновления на подчиненные ресурсы в иерархии блокировок;'

WHEN Mode='SIX' THEN 'SIX = Коллективная блокировка с намерением монопольного доступа. Указывает коллективный доступ к ресурсу с намерением получения монопольных блокировок на подчиненные ресурсы в иерархии блокировок;'

WHEN Mode='UIX' THEN 'UIX = Блокировка обновления с намерением монопольного доступа. Указывает блокировку обновления ресурса с намерением получения монопольных блокировок на подчиненные ресурсы в иерархии блокировок;'

WHEN Mode='BU' THEN 'BU = Блокировка массового обновления. Используется для массовых операций;'
     --[ ELSE else_result_expression ]
END as [Тип блокировки]

,syspr.spid, syspr.dbid, syspr.open_tran, syspr.status, syspr.hostprocess, syspr.loginame, syspr.hostname

From
#LOCK_01_01

inner join master.dbo.sysprocesses as syspr
on syspr.spid = #LOCK_01_01.spid and syspr.dbid = #LOCK_01_01.dbid

where
#LOCK_01_01.Type = 'TAB'
and
#LOCK_01_01.dbid = @dbid    

/* Чем занят сервер*/
SELECT s.[spid]
      ,s.[loginame]
      ,s.[open_tran]
      ,s.[blocked]
      ,s.[waittime]
      ,s.[cpu]
      ,s.[physical_io]
      ,s.[memusage]
       INTO #sysprocesses
FROM   sys.[sysprocesses] s

WAITFOR DELAY '00:00:01'

SELECT txt.[text]
      ,s.[spid]
      ,s.[loginame]
      ,s.[hostname]
      ,DB_NAME(s.[dbid]) [db_name]
      ,SUM(s.[waittime] -ts.[waittime]) [waittime]
      ,SUM(s.[cpu] -ts.[cpu]) [cpu]
      ,SUM(s.[physical_io] -ts.[physical_io]) [physical_io]
      ,s.[program_name]
FROM   sys.[sysprocesses] s
       JOIN #sysprocesses ts
            ON  s.[spid] = ts.[spid]
            AND s.[loginame] = ts.[loginame]
       OUTER APPLY sys.[dm_exec_sql_text](s.[sql_handle]) AS txt
WHERE  s.[cpu] -ts.[cpu]
       + s.[physical_io] -ts.[physical_io]
       > 500
       OR  (s.[waittime] -ts.[waittime]) > 3000
GROUP BY
       txt.[text]
      ,s.[spid]
      ,s.[loginame]
      ,s.[hostname]
      ,DB_NAME(s.[dbid])
      ,s.[program_name]
ORDER BY
       [physical_io] DESC
      
DROP TABLE #sysprocesses
26 Одинесю
 
11.06.15
11:46
(25) Этим скриптом обычно и смотрел, но судя по всему обработка поудобнее.
27 dcvetkov
 
11.06.15
11:49
(25) Какай бы ни был скрипт для SQL, он ведь не покажет поименно пользователей 1С.
28 Попытка1С
 
11.06.15
11:56
(27) Да там будет id процесса 1ски на терминале.
С пользователями конечно удобнее.
29 tridog
 
11.06.15
12:00
(0) От понимания того, доступ к какому ресурсу защищен блокировкой, пользы стало бы сильно больше.

Я это не к тому, что "туфта бесполезная", а к тому, что можно улучшить ;)

Но это надо ТЖ парсить.
30 dcvetkov
 
11.06.15
12:05
(29) Я уже двигаюсь в этом направлении. На сервере SQL я вижу, какую таблицу заблочил юзер. Осталось превратить имя таблицы "AccumRgTn29591" вот что-то человеческое.
31 D_E_S_131
 
11.06.15
12:16
(0) Большое спасибо и респект.
32 tridog
 
11.06.15
12:27
(30) Превратить такое имя во что-то человеческое можно, вызвав ПолучитьСтруктураХраненияБазыДанных().

Например, через то же COM-соединение.

Но это будет работать только с блокировками на уровне СУБД.

А вот чтобы получить детальную информация по управляемым блокировкам - таки придется парсить ЖР.

Учитывая, что первое и так умеет делать ЦУП, а второе нет (во всяком случае когда смотрел на него) - второе кажется более интересным.
33 D_E_S_131
 
11.06.15
12:30
Почему-то к SQL пытается залогиниться от имени доменного пользователя, а не указанного в ini.
34 чувак
 
11.06.15
12:33
(0) А где можно увидет результат?
35 чувак
 
11.06.15
12:42
(33) та же фигня
36 qeos
 
11.06.15
13:01
(0) по-моему в консоли все видно.. или не?
37 D_E_S_131
 
11.06.15
13:22
(36) Консоль это "вчерашний день". "Командную строку" возраждаем! :)
38 D_E_S_131
 
11.06.15
13:29
И еще СОМ-соединение с сервером 1С идет с помощью последней установленной платформы, а на серваке может быть ниже релиз. Хотя это скорее всего никак не поборешь.
39 dcvetkov
 
11.06.15
13:35
(36) Покажите мне пож-та, где в консоли видно _кто кого_ блокирует. С именами пользователей, на одном экране.
40 dcvetkov
 
11.06.15
13:36
(38) борется вроде тем, что делаем "regsvr32.exe comcntr.dll " для нужного релиза.
41 чувак
 
11.06.15
13:41
(40) В логе не видно слов blocking и blocked by
42 dcvetkov
 
11.06.15
13:46
(41) значит на этот момент нет конфликта блокировок
43 чувак
 
11.06.15
14:11
(42) Ище один вопрос.
Не пускает в СКЛ потомучто авторизация идет через доменного юзера
44 Aprobator
 
11.06.15
16:44
(0) Технологический журнал не катит? Или там не тот уровень описания блокировки? Вроде указывается - кто и кого блокирует.
45 bolobol
 
11.06.15
16:53
Консоль сервера предприятия не аналогичную ли информацию показывает?
46 dcvetkov
 
13.06.15
08:04
(33) (43)
Действительно, нашёл ошибку в методе подключения к SQL-серверу.
На неделе обновлю программу, как оттестирую. Реализовал отображение заблокированных таблиц.

Вопрос - тут нельзя менять свои сообщения? Т.е. если обновил программу, надо новую тему начать, чтобы все увидели?
47 Web00001
 
13.06.15
08:53
(46)Это миста, тут еще много чего нельзя. Но ВР это не волнует. И так работает, пользователи они че, им бежать некуда.
48 dcvetkov
 
15.06.15
12:05
Эту тему можно закрыть.
Новая версия программы выложена тут:
Написал программу для получения списка блокировок, версия 2
49 Demiurg
 
15.06.15
14:32
(7) это не так, анализ в инструменте бесплатный