Имя: Пароль:
1C
1С v8
Блокировки
0 serianomer
 
13.07.11
11:42
Добрый день. Подскажите, пожалуйста, кто может сталкивался
1 ДенисЧ
 
13.07.11
11:42
никто
2 butterbean
 
13.07.11
11:43
может быть
3 Maxus43
 
13.07.11
11:43
Я, у меня сегодня дверь заблокировало...
4 serianomer
 
13.07.11
11:45
упс.
)
при проведении документа1 в обработкеПроведения
стоит
преждупреждение("1")
и поэтому при проведении
нельзя зайти в 1С и провести другие документы
если поставить такое же предупреждение в модуль другого документа работа другого пользователя не блокируется
5 Maxus43
 
13.07.11
11:45
при проведении документа1 в обработкеПроведения
стоит
преждупреждение("1")

О_о
6 Fragster
 
гуру
13.07.11
11:45
нафейхуа предупреждение в обработке проведения?
7 serianomer
 
13.07.11
11:46
в чем разница этих документов, кроме регистров по которым они делают движения?
8 Maxus43
 
13.07.11
11:46
только сообщения, и то на крайняк. СообщитьОбОшибке Типовое кошерней
9 serianomer
 
13.07.11
11:46
для тестирования
10 serianomer
 
13.07.11
11:46
почему нельзя зайти в 1С когда висит проведение какого-то документа у одного пользователя?
11 Господин ПЖ
 
13.07.11
11:47
(9) толково...
12 Escander
 
13.07.11
11:49
(9) почерк клюшечника! На снеговике так не отлаживают!
13 serianomer
 
13.07.11
11:49
(11)причем модуль проведения весь закоментирован кроме предупреждения
14 serianomer
 
13.07.11
11:50
(12)уже много чего пробую
15 Maxus43
 
13.07.11
11:50
(14) смысл отладки в чем вобще? зачем это всё (4)(13)?
16 serianomer
 
13.07.11
11:51
(15) -> (10)
17 Escander
 
13.07.11
11:52
(15) скорее всего что-то там планировал выводить доброе и вечное, а по факту сподобился на "1". А может только контролировал что этот кусок кода отрабатывает
18 Maxus43
 
13.07.11
11:52
(16) проведение "висеть" не должно в принципе, и что значит нельзя зайти в 1С? что пишет?
19 MM
 
13.07.11
12:01
База файловая или клиент-серверная (на каком SQL-сервере)? Какой режим управления блокировками у конфигурации?
Без ответа на эти вопросы дальше не сдвинуться.
20 hhhh
 
13.07.11
12:01
(13) а на закладке "движения" точно все движения у документа поудалял?
21 serianomer
 
13.07.11
12:03
при проведении документа одного пользователя выводится предупреждение("1"), при этом
у другие не могут войти в 1С или провести другой документ
1С висит потом выходит сообщение
"конфликт блокировок при выполеннии транзакции"
LOck request time out exceedeed.
в списке соеденений в консоле 1С Сервера видно что сессии пользователей блокируются.
1C 8.1.14 MS SQL 2005
22 serianomer
 
13.07.11
12:04
(19) режим управления блокировками автоматический
23 serianomer
 
13.07.11
12:05
(20)движения удалил, только ТЧ документа заполенны, но это ведь не должно влиять
24 Maxus43
 
13.07.11
12:07
(23) у документа автоматическое удаление движений?
25 mzelensky
 
13.07.11
12:07
(21) потому как "ПРЕДУПРЕЖДЕНИЕ" ждет пока не нажмешь кнопочку. Следовательно обработка висит ,следоватекльно объект блокируется!!!
26 serianomer
 
13.07.11
12:07
(24) да
27 serianomer
 
13.07.11
12:09
то что объект блокируется не проблема, проблема что в 1С нельзя зайти и что некоторые другие документы нельзя провести, непонятно почему они висят
28 mzelensky
 
13.07.11
12:11
(27) потому как процедура "проведения" затрагивает и блокирует не только данный документ но и ряд регистров, а то может и другие документы. Все это дело блокируется...а ты пытаешься с ними работать!

П.С. а если у тебя база файловая, то в регистрах блокируется ВСЯ таблица данных!!!
29 mzelensky
 
13.07.11
12:12
(28) а, сори...уже позже заметил "1C 8.1.14 MS SQL 2005"
30 Господин ПЖ
 
13.07.11
12:20
(27) sp_lock все знает...
31 Господин ПЖ
 
13.07.11
12:22
хотя по идее блокируются только KEY (X), на таблице должно висеть только намерение - IX...
32 YHVVH
 
13.07.11
12:26
а в чем вопрос то? или тут просто флудят.
33 YHVVH
 
13.07.11
12:28
34 hhhh
 
13.07.11
12:28
(32) автор всобачил Предупреждение в обработку проведения, и теперь удивляется, что другие пользователи не могут проводить документы.
35 serianomer
 
13.07.11
12:28
(32)->(21)
36 AlexNew
 
13.07.11
12:28
Уволить. За профнепригодность.
37 Господин ПЖ
 
13.07.11
12:29
ну типа чо за на...? зачем блокируются таблицы... а как им не блокироваться... при автомат. очистке движений записывается пустой набор в регистр и это блокируется всю таблицу (вроде так)...
38 serianomer
 
13.07.11
12:30
(34) а почему другие пользователи не должны проводить другие документы?
39 serianomer
 
13.07.11
12:30
(38)+блокируется один документ на работу других никак не должно влиять
40 Господин ПЖ
 
13.07.11
12:30
само по себе "Предупреждение" ни говорит ни о чем... весь вопрос в залоченных ресурсах одним процессом и в ожидании этих ресурсов другим процессом
41 Господин ПЖ
 
13.07.11
12:31
(39) не факт...
42 Господин ПЖ
 
13.07.11
12:32
(33) это какая-то хня для даунов...
43 YHVVH
 
13.07.11
12:32
(39) если у тебя в модуле проведения выбирались или изменялись объекты которые нужны для работы других юзеров то балдерес тебе.
почитай (33) на досуге
44 serianomer
 
13.07.11
12:33
(43) ты ветку читал? модуль проведения польностью закоментирован кроме вывода предупреждения
45 Maxus43
 
13.07.11
12:34
(44) Автоматическое удаление движений, оно лочит скорей всего все регистры
46 Господин ПЖ
 
13.07.11
12:34
(44) у тебя автоочистка движений стоит... а это скорее всего (37). Можно покурить типовые и посмотреть как старые движения документов убирают...
47 hhhh
 
13.07.11
12:35
(39) блокируется целиком таблица регистра, тебе же сказали в (37). Другой пользователь когда проводит свой документ, пытается записать в этот же регистр, ну и него не получается. Включай уже мозги.
48 Maxus43
 
13.07.11
12:36
(47) тока непонятен момент с тем что в 1с зайти не могут... чо там при старте системы то напихали
49 YHVVH
 
13.07.11
12:37
(44) хм. а зачем вообще так делать?
50 Maxus43
 
13.07.11
12:40
(49) ты ветку читал?))
51 YHVVH
 
13.07.11
12:41
(50) бред полный.
52 serianomer
 
13.07.11
12:42
(46) я открываю непроведенный документ
53 Господин ПЖ
 
13.07.11
12:45
(52) профайлер и sp_lock все знают...
54 Maxus43
 
13.07.11
12:45
(52) при автоочистке пофиг проведённый или нет, всё равно очищает и лочит
55 serianomer
 
13.07.11
12:45
(53)Не подскажите, как в профайлере можно отловить события нужные?
56 MM
 
13.07.11
12:55
Судя по всему проблема в том, что у документа есть пустые регистры, при их очистке (автоматической) происходит блокировка всего регистра, поскольку отдельные строки в нём заблокировать нельзя (их нет).
57 MM
 
13.07.11
12:58
(47) если регистр не пустой, то в автоматическом режиме может возникать блокировка на записи соседние с записываемыми, но в общем случае регистр будет не заблокирован.
58 braslavets
 
13.07.11
13:07
У меня как-то раз коллега на живой базе поставил брикпоинт в обработке проведения, поймал и .... пошел покурить :)
59 упс
 
13.07.11
13:10
(55) запаритесь вы с профайлером ковыряться, имхо. Но вообще - класс событий Locks. Там можно отловить и наложение блокировки на ресурс, и освобождение ресурса и таймауты
Смотрите вывод sys.dm_tran_locks/sp_lock (в sys.dm_tran_locks информации больше и она, имхо, в более читабельном виде), анализируйте.
60 serianomer
 
15.07.11
18:52
А почему, когда делается запрос в модуле проведения документа к остаткам рег. накоплений используется блокировка
SERIALIZABLE?

кусок запроса:
FROM _AccumRegTotals8115 WITH(SERIALIZABLE)
WHERE _AccumRegTotals8115._Period = P1 AND _AccumRegTotals8115._Fld8107RRef = @P2 AND _AccumRegTotals8115._Fld8108RRef = @P3 AND _AccumRegTotals8115._Fld8109 > @P4 AND (_AccumRegTotals8115._Fld8110 <> CAST(@P5 AS NUMERIC(1,0)) OR _AccumRegTotals8115._Fld8265 <> CAST(@P5 AS NUMERIC(1,0))

из-за этого невозможно сделать запись в рег. накопления за другой период в другом документе, который в это время проводится, если стоит режим разделения итогов по этому регистру накопления, а если не стоит, то проведение документа не начинается вовсе, а просто висит в ожидании.
61 serianomer
 
15.07.11
18:54
_AccumRegTotals8115 - таблица итогов
62 5 Элемент
 
15.07.11
19:03
63 Ник второй
 
16.07.11
08:22
Эх сколько дурней в нашей профессии, которые втыкают предупреждения в транзакции.
64 serianomer
 
19.07.11
10:27
(62) у меня нет доступа.
(63) ПНХ.
65 serianomer
 
19.07.11
10:27
выложите куда-нить статью
66 serianomer
 
19.07.11
10:28
из (62)
67 serianomer
 
19.07.11
10:44
(62) где можно взять пароль и пользователя?
68 unregistered
 
19.07.11
10:57
(60) >> А почему, когда делается запрос в модуле проведения документа к остаткам рег. накоплений используется блокировка
SERIALIZABLE

Потому что видимо не используются управляемые блокировки.
СУБД не в курсе дел вашей прикладной модели и особенностей взаимосвязей таблиц в БД и страхуется, накладывая максимальные излишние блокировки.

При использовании управляемых блокировок в случаях, когда в обработке проведение производится чтение таблиц, которые в последствии будут изменяться (например, таблицы итогов регистров накопления или бух.), следует программно устанавливать управляемые блокировки на нужные диапазоны записей (по измерениям, счетам, видам и значениям субконто, периодам), во избежании излишних блокировок.
69 unregistered
 
19.07.11
11:01
70 unregistered
 
19.07.11
11:02
(67) >> где можно взять пароль и пользователя?

А от ИТС не подходит?
71 serianomer
 
19.07.11
11:12
(69) ничего не написано, что можно сделать для оптимизации конфигурации пи автоматических блоикровках.
или ничего нельзя сделать?
72 unregistered
 
19.07.11
11:24
(71) >> пи автоматических блоикровках

перевести конфу на управляемые.

ИМХО, это очевидно... Разве нет?

Если перевод в режим управляемых блокировок по каким-либо причинам невозможен, то смотреть алгоритмы (проведения, записи) и оптимизировать их.

Вот почитай еще: http://www.its.1c.ru/db/metod81#content:4053:1

И не говори, что у тебя нет доступа к ИТС.
73 Господин ПЖ
 
19.07.11
11:27
SERIALIZABLE это не вид, а уровень изоляции. сам по себе без конкретного контекста ничего не значит...
74 serianomer
 
19.07.11
11:49
(73) в документеА в модуле проведения выполняется запрос - чтение остатков регНак за период1, в профайлере видно что уровень изоляции установливается SERIALIZABLE,
документБ в это время пытается выполнить запись в тот же регНак, но за период2, более поздний, выходит ошибка, конфликт блокировок

запрос, который блокирует регистр накопления
exec sp_executesql N'SELECT
#V8TblAli1_Q_000_T_001._Q_001_F_000_TYPE AS _sf_2_TYPE,
#V8TblAli1_Q_000_T_001._Q_001_F_000_S AS _sf_2_S,
#V8TblAli1_Q_000_T_001._Q_001_F_000_RRRef AS _sf_2_RRRef,
#V8TblAli1_Q_000_T_001._Q_001_F_001 AS _sf_1,
CAST(SUM(#V8TblAli1_Q_000_T_001._Q_001_F_002) AS NUMERIC(38,8)) AS f_1,
CAST(SUM(#V8TblAli1_Q_000_T_001._Q_001_F_003) AS NUMERIC(38,8)) AS f_2,
CAST(SUM(#V8TblAli1_Q_000_T_001._Q_001_F_004) AS NUMERIC(7,0)) AS f_3,
CAST(SUM(#V8TblAli1_Q_000_T_001._Q_001_F_005) AS NUMERIC(7,0)) AS f_4,
#V8TblAli2_Q_000_T_002._Fld6671RRef AS f_5,
CAST(SUM(#V8TblAli1_Q_000_T_001._Q_001_F_007) AS NUMERIC(38,8)) AS f_6
FROM
(
SELECT
CASE
WHEN #V8TblAli1_Q_001_T_001._Fld8108RRef IS NOT NULL
THEN 0x08
ELSE NULL
END AS _Q_001_F_000_TYPE,
CASE
WHEN #V8TblAli1_Q_001_T_001._Fld8108RRef IS NULL
THEN CAST(NULL AS NVARCHAR(5))
ELSE CAST(N'''' AS NVARCHAR(5))
END AS _Q_001_F_000_S,
#V8TblAli1_Q_001_T_001._Fld8108RRef AS _Q_001_F_000_RRRef,
#V8TblAli1_Q_001_T_001._Fld8109 AS _Q_001_F_001,
CAST(SUM(#V8TblAli1_Q_001_T_001._Fld8110Balance) AS NUMERIC(32,2)) AS _Q_001_F_002,
CAST(SUM(#V8TblAli1_Q_001_T_001._Fld8265Balance) AS NUMERIC(32,2)) AS _Q_001_F_003,
CAST(0. AS NUMERIC(1,0)) AS _Q_001_F_004,
CAST(0. AS NUMERIC(1,0)) AS _Q_001_F_005,
#V8TblAli1_Q_001_T_001._Fld8107RRef AS _Q_001_F_006RRef,
CAST(CAST(0. AS NUMERIC(1,0)) AS NUMERIC(38,8)) AS _Q_001_F_007
FROM
(
SELECT
#V8TblAli1_T._Fld8107RRef AS _Fld8107RRef,
#V8TblAli1_T._Fld8108RRef AS _Fld8108RRef,
#V8TblAli1_T._Fld8109 AS _Fld8109,
CAST(SUM(#V8TblAli1_T._Fld8110Balance) AS NUMERIC(32,2)) AS _Fld8110Balance,
CAST(SUM(#V8TblAli1_T._Fld8265Balance) AS NUMERIC(32,2)) AS _Fld8265Balance
FROM
(
SELECT
_AccumRegTotals8115._Fld8107RRef AS _Fld8107RRef,
_AccumRegTotals8115._Fld8108RRef AS _Fld8108RRef,
_AccumRegTotals8115._Fld8109 AS _Fld8109,
CAST(SUM(_AccumRegTotals8115._Fld8110) AS NUMERIC(26,2)) AS _Fld8110Balance,
CAST(SUM(_AccumRegTotals8115._Fld8265) AS NUMERIC(26,2)) AS _Fld8265Balance
FROM
_AccumRegTotals8115 WITH(SERIALIZABLE)
WHERE
_AccumRegTotals8115._Period = P1 AND _AccumRegTotals8115._Fld8107RRef = @P2 AND _AccumRegTotals8115._Fld8108RRef = @P3 AND _AccumRegTotals8115._Fld8109 > @P4
GROUP BY
_AccumRegTotals8115._Fld8107RRef,
_AccumRegTotals8115._Fld8108RRef,
_AccumRegTotals8115._Fld8109
HAVING
CAST(SUM(_AccumRegTotals8115._Fld8110) AS NUMERIC(26,2)) <> CAST(@P5 AS NUMERIC(1,0)) OR
CAST(SUM(_AccumRegTotals8115._Fld8265) AS NUMERIC(26,2)) <> CAST(@P5 AS NUMERIC(1,0))
UNION ALL
SELECT
_AccumReg8103._Fld8107RRef AS _Fld8107RRef,
_AccumReg8103._Fld8108RRef AS _Fld8108RRef,
_AccumReg8103._Fld8109 AS _Fld8109,
CAST(CAST(SUM(CASE
WHEN _AccumReg8103._RecordKind = CAST(0. AS NUMERIC(1,0))
THEN - _AccumReg8103._Fld8110
ELSE _AccumReg8103._Fld8110
END) AS NUMERIC(20,2)) AS NUMERIC(27,2)) AS _Fld8110Balance,
CAST(CAST(SUM(CASE
WHEN _AccumReg8103._RecordKind = CAST(0. AS NUMERIC(1,0))
THEN - _AccumReg8103._Fld8265
ELSE _AccumReg8103._Fld8265
END) AS NUMERIC(20,2)) AS NUMERIC(27,2)) AS _Fld8265Balance
FROM
_AccumReg8103 WITH(SERIALIZABLE)
WHERE
_AccumReg8103._Period > @P4 AND _AccumReg8103._Period < P1 AND _AccumReg8103._Active = @P6 AND _AccumReg8103._Fld8107RRef = @P2 AND _AccumReg8103._Fld8108RRef = @P3 AND _AccumReg8103._Fld8109 > @P4
GROUP BY
_AccumReg8103._Fld8107RRef,
_AccumReg8103._Fld8108RRef,
_AccumReg8103._Fld8109
HAVING
CAST(SUM(CASE
WHEN _AccumReg8103._RecordKind = CAST(0. AS NUMERIC(1,0))
THEN - _AccumReg8103._Fld8110
ELSE _AccumReg8103._Fld8110
END) AS NUMERIC(20,2)) <> CAST(@P5 AS NUMERIC(1,0)) OR
CAST(SUM(CASE
WHEN _AccumReg8103._RecordKind = CAST(0. AS NUMERIC(1,0))
THEN - _AccumReg8103._Fld8265
ELSE _AccumReg8103._Fld8265
END) AS NUMERIC(20,2)) <> CAST(@P5 AS NUMERIC(1,0))
) #V8TblAli1_T
GROUP BY
#V8TblAli1_T._Fld8107RRef,
#V8TblAli1_T._Fld8108RRef,
#V8TblAli1_T._Fld8109
HAVING
CAST(SUM(#V8TblAli1_T._Fld8110Balance) AS NUMERIC(32,2)) <> CAST(@P5 AS NUMERIC(1,0)) OR
CAST(SUM(#V8TblAli1_T._Fld8265Balance) AS NUMERIC(32,2)) <> CAST(@P5 AS NUMERIC(1,0))
) #V8TblAli1_Q_001_T_001
GROUP BY
#V8TblAli1_Q_001_T_001._Fld8109,
#V8TblAli1_Q_001_T_001._Fld8108RRef,
#V8TblAli1_Q_001_T_001._Fld8107RRef
UNION ALL
SELECT
CASE
WHEN #V8TblAli1_Q_002_T_001._Fld8108RRef IS NOT NULL
THEN 0x08
ELSE NULL
END AS _Q_001_F_000_TYPE,
CASE
WHEN #V8TblAli1_Q_002_T_001._Fld8108RRef IS NULL
THEN CAST(NULL AS NVARCHAR(5))
ELSE CAST(N'''' AS NVARCHAR(5))
END AS _Q_001_F_000_S,
#V8TblAli1_Q_002_T_001._Fld8108RRef AS _Q_001_F_000_RRRef,
#V8TblAli1_Q_002_T_001._Fld8109 AS _Q_001_F_001,
CAST(SUM(#V8TblAli1_Q_002_T_001._Fld8110Balance) AS NUMERIC(32,2)) AS _Q_001_F_002,
CAST(SUM(#V8TblAli1_Q_002_T_001._Fld8265Balance) AS NUMERIC(32,2)) AS _Q_001_F_003,
CAST(0. AS NUMERIC(1,0)) AS _Q_001_F_004,
CAST(0. AS NUMERIC(1,0)) AS _Q_001_F_005,
#V8TblAli1_Q_002_T_001._Fld8107RRef AS _Q_001_F_006RRef,
CAST(SUM(#V8TblAli1_Q_002_T_001._Fld8420Balance) AS NUMERIC(32,2)) AS _Q_001_F_007
FROM
(
SELECT
#V8TblAli1_T._Fld8107RRef AS _Fld8107RRef,
#V8TblAli1_T._Fld8108RRef AS _Fld8108RRef,
#V8TblAli1_T._Fld8109 AS _Fld8109,
CAST(SUM(#V8TblAli1_T._Fld8110Balance) AS NUMERIC(32,2)) AS _Fld8110Balance,
CAST(SUM(#V8TblAli1_T._Fld8265Balance) AS NUMERIC(32,2)) AS _Fld8265Balance,
CAST(SUM(#V8TblAli1_T._Fld8420Balance) AS NUMERIC(32,2)) AS _Fld8420Balance
FROM
(
SELECT
_AccumRegTotals8115._Fld8107RRef AS _Fld8107RRef,
_AccumRegTotals8115._Fld8108RRef AS _Fld8108RRef,
_AccumRegTotals8115._Fld8109 AS _Fld8109,
CAST(SUM(_AccumRegTotals8115._Fld8110) AS NUMERIC(26,2)) AS _Fld8110Balance,
CAST(SUM(_AccumRegTotals8115._Fld8265) AS NUMERIC(26,2)) AS _Fld8265Balance,
CAST(SUM(_AccumRegTotals8115._Fld8420) AS NUMERIC(28,2)) AS _Fld8420Balance
FROM
_AccumRegTotals8115 WITH(SERIALIZABLE)
WHERE
_AccumRegTotals8115._Period = P1 AND _AccumRegTotals8115._Fld8107RRef = @P2 AND _AccumRegTotals8115._Fld8108RRef = @P7 AND _AccumRegTotals8115._Fld8109 > @P4
GROUP BY
_AccumRegTotals8115._Fld8107RRef,
_AccumRegTotals8115._Fld8108RRef,
_AccumRegTotals8115._Fld8109
HAVING
CAST(SUM(_AccumRegTotals8115._Fld8110) AS NUMERIC(26,2)) <> CAST(@P5 AS NUMERIC(1,0)) OR
CAST(SUM(_AccumRegTotals8115._Fld8265) AS NUMERIC(26,2)) <> CAST(@P5 AS NUMERIC(1,0)) OR
CAST(SUM(_AccumRegTotals8115._Fld8420) AS NUMERIC(28,2)) <> CAST(@P5 AS NUMERIC(1,0))
UNION ALL
SELECT
_AccumReg8103._Fld8107RRef AS _Fld8107RRef,
_AccumReg8103._Fld8108RRef AS _Fld8108RRef,
_AccumReg8103._Fld8109 AS _Fld8109,
CAST(CAST(SUM(CASE
WHEN _AccumReg8103._RecordKind = CAST(0. AS NUMERIC(1,0))
THEN - _AccumReg8103._Fld8110
ELSE _AccumReg8103._Fld8110
END) AS NUMERIC(20,2)) AS NUMERIC(27,2)) AS _Fld8110Balance,
CAST(CAST(SUM(CASE
WHEN _AccumReg8103._RecordKind = CAST(0. AS NUMERIC(1,0))
THEN - _AccumReg8103._Fld8265
ELSE _AccumReg8103._Fld8265
END) AS NUMERIC(20,2)) AS NUMERIC(27,2)) AS _Fld8265Balance,
CAST(CAST(SUM(CASE
WHEN _AccumReg8103._RecordKind = CAST(0. AS NUMERIC(1,0))
THEN - _AccumReg8103._Fld8420
ELSE _AccumReg8103._Fld8420
END) AS NUMERIC(22,2)) AS NUMERIC(29,2)) AS _Fld8420Balance
FROM
_AccumReg8103 WITH(SERIALIZABLE)
WHERE
_AccumReg8103._Period >= @P4 AND _AccumReg8103._Period < P1 AND _AccumReg8103._Active = @P6 AND _AccumReg8103._Fld8107RRef = @P2 AND _AccumReg8103._Fld8108RRef = @P7 AND _AccumReg8103._Fld8109 > @P4
GROUP BY
_AccumReg8103._Fld8107RRef,
_AccumReg8103._Fld8108RRef,
_AccumReg8103._Fld8109
HAVING
CAST(SUM(CASE
WHEN _AccumReg8103._RecordKind = CAST(0. AS NUMERIC(1,0))
THEN - _AccumReg8103._Fld8110
ELSE _AccumReg8103._Fld8110
END) AS NUMERIC(20,2)) <> CAST(@P5 AS NUMERIC(1,0)) OR
CAST(SUM(CASE
WHEN _AccumReg8103._RecordKind = CAST(0. AS NUMERIC(1,0))
THEN - _AccumReg8103._Fld8265
ELSE _AccumReg8103._Fld8265
END) AS NUMERIC(20,2)) <> CAST(@P5 AS NUMERIC(1,0)) OR
CAST(SUM(CASE
WHEN _AccumReg8103._RecordKind = CAST(0. AS NUMERIC(1,0))
THEN - _AccumReg8103._Fld8420
ELSE _AccumReg8103._Fld8420
END) AS NUMERIC(22,2)) <> CAST(@P5 AS NUMERIC(1,0))
) #V8TblAli1_T
GROUP BY
#V8TblAli1_T._Fld8107RRef,
#V8TblAli1_T._Fld8108RRef,
#V8TblAli1_T._Fld8109
HAVING
CAST(SUM(#V8TblAli1_T._Fld8110Balance) AS NUMERIC(32,2)) <> CAST(@P5 AS NUMERIC(1,0)) OR
CAST(SUM(#V8TblAli1_T._Fld8265Balance) AS NUMERIC(32,2)) <> CAST(@P5 AS NUMERIC(1,0)) OR
CAST(SUM(#V8TblAli1_T._Fld8420Balance) AS NUMERIC(32,2)) <> CAST(@P5 AS NUMERIC(1,0))
) #V8TblAli1_Q_002_T_001
GROUP BY
#V8TblAli1_Q_002_T_001._Fld8109,
#V8TblAli1_Q_002_T_001._Fld8108RRef,
#V8TblAli1_Q_002_T_001._Fld8107RRef
UNION ALL
SELECT
CASE
WHEN #V8TblAli1_Q_004_T_001._Q_003_F_000 IS NOT NULL
THEN 0x05
ELSE NULL
END AS _Q_001_F_000_TYPE,
#V8TblAli1_Q_004_T_001._Q_003_F_000 AS _Q_001_F_000_S,
CASE
WHEN #V8TblAli1_Q_004_T_001._Q_003_F_000 IS NULL
THEN CAST(NULL AS BINARY(16))
ELSE 0x00000000000000000000000000000000
END AS _Q_001_F_000_RRRef,
#V8TblAli1_Q_004_T_001._Q_003_F_001 AS _Q_001_F_001,
CAST(CAST(SUM(CAST(0. AS NUMERIC(1,0))) AS NUMERIC(7,0)) AS NUMERIC(38,8)) AS _Q_001_F_002,
CAST(CAST(SUM(#V8TblAli1_Q_004_T_001._Q_003_F_002) AS NUMERIC(28,2)) AS NUMERIC(38,8)) AS _Q_001_F_003,
CAST(0. AS NUMERIC(1,0)) AS _Q_001_F_004,
CAST(0. AS NUMERIC(1,0)) AS _Q_001_F_005,
#V8TblAli1_Q_004_T_001._Q_003_F_003RRef AS _Q_001_F_006RRef,
CAST(CAST(0. AS NUMERIC(1,0)) AS NUMERIC(38,8)) AS _Q_001_F_007
FROM
(
SELECT
N''ТРАНШ'' AS _Q_003_F_000,
_Document245_VT4073_Q_003_T_001._Fld4075 AS _Q_003_F_001,
CAST(SUM(_Document245_VT4073_Q_003_T_001._Fld4080) AS NUMERIC(21,2)) AS _Q_003_F_002,
_Document245_1._Fld4050RRef AS _Q_003_F_003RRef
FROM
_Document245_VT4073 _Document245_VT4073_Q_003_T_001 WITH(REPEATABLEREAD)
LEFT OUTER JOIN _Document245 _Document245_1 WITH(REPEATABLEREAD)
ON _Document245_VT4073_Q_003_T_001._Document245_IDRRef = _Document245_1._IDRRef
WHERE
_Document245_VT4073_Q_003_T_001._Document245_IDRRef = @P8 AND _Document245_VT4073_Q_003_T_001._Fld4080 > CAST(@P5 AS NUMERIC(1,0)) AND _Document245_VT4073_Q_003_T_001._Fld4075 > @P4
GROUP BY
_Document245_VT4073_Q_003_T_001._Fld4075,
_Document245_1._Fld4050RRef
) #V8TblAli1_Q_004_T_001
GROUP BY
#V8TblAli1_Q_004_T_001._Q_003_F_001,
#V8TblAli1_Q_004_T_001._Q_003_F_000,
#V8TblAli1_Q_004_T_001._Q_003_F_003RRef
) #V8TblAli1_Q_000_T_001
LEFT OUTER JOIN (
SELECT
_InfoReg6668_IR12._Fld6669RRef AS _Fld6669RRef,
_InfoReg6668_IR12._Fld6671RRef AS _Fld6671RRef
FROM
(
SELECT
#V8TblAli1_IR1._Fld6669RRef AS _Fld6669RRef,
#V8TblAli1_IR1._Fld6670RRef AS _Fld6670RRef,
#V8TblAli1_IR1._MAXPERIOD AS _MAXPERIOD,
SUBSTRING(MAX(_InfoReg6668_IR2._RecorderTRef + _InfoReg6668_IR2._RecorderRRef), 1, 4) AS _MAXRECORDERTRef,
SUBSTRING(MAX(_InfoReg6668_IR2._RecorderTRef + _InfoReg6668_IR2._RecorderRRef), 5, 16) AS _MAXRECORDERRRef
FROM
(
SELECT
_InfoReg6668._Fld6669RRef AS _Fld6669RRef,
_InfoReg6668._Fld6670RRef AS _Fld6670RRef,
MAX(_InfoReg6668._Period) AS _MAXPERIOD
FROM
_InfoReg6668 WITH(SERIALIZABLE)
WHERE
_InfoReg6668._Period <= @P4 AND _InfoReg6668._Active = @P6 AND _InfoReg6668._Fld6670RRef = @P9 AND _InfoReg6668._Fld6669RRef = @P2
GROUP BY
_InfoReg6668._Fld6669RRef,
_InfoReg6668._Fld6670RRef
) #V8TblAli1_IR1
INNER JOIN _InfoReg6668 _InfoReg6668_IR2 WITH(SERIALIZABLE)
ON #V8TblAli1_IR1._Fld6669RRef = _InfoReg6668_IR2._Fld6669RRef AND #V8TblAli1_IR1._Fld6670RRef = _InfoReg6668_IR2._Fld6670RRef AND #V8TblAli1_IR1._MAXPERIOD = _InfoReg6668_IR2._Period
WHERE
_InfoReg6668_IR2._Active = @P6 AND _InfoReg6668_IR2._Fld6670RRef = @P9 AND _InfoReg6668_IR2._Fld6669RRef = @P2
GROUP BY
#V8TblAli1_IR1._Fld6669RRef,
#V8TblAli1_IR1._Fld6670RRef,
#V8TblAli1_IR1._MAXPERIOD
) #V8TblAli1_IR11
INNER JOIN _InfoReg6668 _InfoReg6668_IR12 WITH(SERIALIZABLE)
ON #V8TblAli1_IR11._Fld6669RRef = _InfoReg6668_IR12._Fld6669RRef AND #V8TblAli1_IR11._Fld6670RRef = _InfoReg6668_IR12._Fld6670RRef AND #V8TblAli1_IR11._MAXPERIOD = _InfoReg6668_IR12._Period AND #V8TblAli1_IR11._MAXRECORDERTRef = _InfoReg6668_IR12._RecorderTRef AND #V8TblAli1_IR11._MAXRECORDERRRef = _InfoReg6668_IR12._RecorderRRef
) #V8TblAli2_Q_000_T_002
ON #V8TblAli1_Q_000_T_001._Q_001_F_006RRef = #V8TblAli2_Q_000_T_002._Fld6669RRef
GROUP BY
#V8TblAli1_Q_000_T_001._Q_001_F_001,
#V8TblAli1_Q_000_T_001._Q_001_F_000_TYPE,
#V8TblAli1_Q_000_T_001._Q_001_F_000_S,
#V8TblAli1_Q_000_T_001._Q_001_F_000_RRRef,
#V8TblAli2_Q_000_T_002._Fld6671RRef
ORDER BY
#V8TblAli1_Q_000_T_001._Q_001_F_001,
#V8TblAli1_Q_000_T_001._Q_001_F_000_TYPE DESC,
#V8TblAli1_Q_000_T_001._Q_001_F_000_S DESC,
#V8TblAli1_Q_000_T_001._Q_001_F_000_RRRef DESC', N'P1 datetime,@P2 varbinary(16),@P3 varbinary(16),@P4 datetime,@P5 numeric(1,0),@P6 varbinary(1),@P7 varbinary(16),@P8 varbinary(16),@P9 varbinary(16)', {ts '2011-07-01 00:00:00'}, 0x91B4001EC9EB581A11E001F37F47049B, 0x80E313D473D00129491A2D67BD69B16C, {ts '2011-06-25 20:02:00'}, 0, 0x01, 0xAE058527C15B19A440E1A12D9527BACE, 0x91B4001EC9EB581A11E001F37F47049E, 0x00000000000000000000000000000000
75 serianomer
 
19.07.11
11:52
(72) нет доступа(
76 serianomer
 
19.07.11
11:57
(74)+ вообще-то блокируется и регистр сведений
77 Господин ПЖ
 
19.07.11
12:35
(74) смотреть надо конкретно через sp_lock() какие ресурсы заблокированы

SERIALIZABLE говорит лишь о том что прочитанные ресурсы не будут отпущены до конца транзакции. И все.
78 unregistered
 
19.07.11
12:45
(74) >> в документеА в модуле проведения выполняется запрос - чтение остатков регНак за период1, в профайлере видно что уровень изоляции установливается SERIALIZABLE,
документБ в это время пытается выполнить запись в тот же регНак, но за период2, более поздний, выходит ошибка, конфликт блокировок

Ну всё правильно. Так и должно быть. В чем вопрос?
Либо ты наконец-то пойдешь и начнешь переводить поэтапно свою конфу в режим управляемых блокировок, где будешь ручками прописывать по каким периодам и измерениям надо блокировать таблицы регистров при чтении в транзакции, либо всё так и останется: максимальный уровень изоляции по максимальным диапазонам или всей таблице.
79 unregistered
 
19.07.11
12:47
(75) У твоего работодателя не нашлось денег на подписку ИТС?
Увольняйся оттуда. А то рано или поздно у них не найдется денег тебе на з/п.

Ну или подпишись сам в конце концов...

Копия статьи: http://1cexpo.ru/metodiki/21-tipichnye-prichiny-izbytochnyx-blokirovok-i-metody-optimizaczii.html
80 Господин ПЖ
 
19.07.11
12:54
>максимальный уровень изоляции по максимальным диапазонам или всей таблице.

бред...
81 unregistered
 
19.07.11
12:57
(80) Что не так?

В автоматическом режиме без указания в запросе ДЛЯ ИЗМЕНЕНИЯ будет тупо заблокирована вся таблица итогов регистра вплоть до окончания транзакции (обработки проведения и записи наборов). Разве я не прав?
82 Господин ПЖ
 
19.07.11
13:40
(81) "простая выборка" это тип = shared lock, ДЛЯ ИЗМЕНЕНИЯ = for update...

покурите буквари что есть тип блокировки "for update".

И вообще все наоборот. И что будет заблокировано не известно, чтобы так с плеча рубить - "таблица и все тут". 1С в статьях сами пишут что МОГУТ приводить к избыточным блокировкам. А могут и нет.
83 serianomer
 
19.07.11
13:45
(78)нет времени переводить конфигурацию на управляемые блокировки. И вообще не я писал эту конфигурацию.

(82)похоже на то, что у меня "блокирующее чтение остатков в начале транзакции"
в течении проведения проводятся длительные расчеты, все это время таблица залочена.
84 vde69
 
19.07.11
13:52
у кого как а у меня проблемма не от блокировок а от их отсутствия, вот просвещаюсь http://msdn.microsoft.com/ru-ru/library/aa337440.aspx

все висит хотя блокировок и нет!
85 Господин ПЖ
 
19.07.11
13:56
(84) скуль сожрал всю память наверное...

блокировка тоже ресурсов требует:

Блокировка занимает 96 байт. Общее количество блокировок может варьироваться от 5000 до 2 147 483 647. Конкретное значение можно задать с помощью хранимой процедуры sp_configure с параметром locks
86 unregistered
 
19.07.11
14:34
(82) >> "простая выборка" это тип = shared lock

Речь идёт о запросах в транзакции (точнее в обработке проведения). Здесь тип блокировки на таблицы двигаемых документом регистров при первом же обращении (при запросе к итогам, например) будет выше share lock. В случае использования автоматического режима  блокировок (как у автора) блокировки накладываются по самому худшему варианту.

>> И что будет заблокировано не известно, чтобы так с плеча рубить - "таблица и все тут". 1С в статьях сами пишут что МОГУТ приводить к избыточным блокировкам. А могут и нет.

Это действительно так, но проще считать, что будет заблокирована вся таблица, чем гадать как именно отработает менеджер блокировок СУБД. А правильнее использовать менеджера блокировок 1С, включив режим управляемых блокировок в конфе.
87 unregistered
 
19.07.11
14:49
(83) >> похоже на то, что у меня "блокирующее чтение остатков в начале транзакции"
в течении проведения проводятся длительные расчеты, все это время таблица залочена.

Совершенно верно.
Как вариант - переписывание механизма контроля остатков на момент после принудительной записи наборов по всем регистрам документа.

>> нет времени переводить конфигурацию на управляемые блокировки

Включай в конфе режим "Автоматически и управляемый" и переводи только самые проблемные документы и регистры.
Если речь идет об одном-двух документах и пяти - семи регистрах, то это займет не более одного дня.
Прописать удаление движений (можно стырить с типовых).
Прописать установку управляемых блокировок перед запросами к остаткам.
Переписать алгоритмы контроля остатков (уже по желанию) для уменьшения времени блокирования таблиц при проведении.
88 serianomer
 
19.07.11
14:55
(87) ок, спасибо за помощь
89 MM
 
19.07.11
15:59
(86) Там не только гадание, заблокировано будет только то, что будет прочитано (и по "краям" для SERIALIZABLE). При наличии индекса читаться скорее всего будет то, что подпадёт под него, если сервер не довели до эскалации блокировок.
Если бы блокировалась вся таблица, то от клиент-серверного режима было бы не много толку в сравнении с файловым вариантом.
90 serianomer
 
19.07.11
16:26
(89) после выполнения запроса в (74) возникает событие Lock:Escalation
91 serianomer
 
19.07.11
16:27
(89)каким образом "сервер можно довести до эскалации блокировок"?
92 MM
 
19.07.11
16:34
(91) http://www.gilev.ru/1c/81/lock/lock.htm#escalation
Прежде всего недостаток памяти.
93 serianomer
 
20.07.11
12:27
(92) Table Lock Escalations/sec = 285
94 serianomer
 
20.07.11
14:17
АП.
95 serianomer
 
20.07.11
14:17
Подскажите, что можно посмотреть в настройках скуля
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.