Имя: Пароль:
1C
1С v8
Управляемые блокировки
0 amadeus2010
 
23.11.12
11:14
Добрый день, сразу вопрос. Перевел конфигурацию УПП в режим автоматические и управляемые блокировки,система РА, некоторые документы с регистрами по которым делаются движения переведены в управляемый режим блокировок для исключения взаимоблокировок при одновременном проведении. В процедуру ОбработкаПроведения() для каждого документа добавил такой код
////////////////////////////////////////////////////////
Блокировка = Новый БлокировкаДанных;
   ЭлементБлокировки = Блокировка.Добавить();
   ЭлементБлокировки.Область = "РегистрНакопления.ТоварыОрганизаций";
   ЭлементБлокировки.Область = "РегистрНакопления.ЗаказыПокупателей";
   ЭлементБлокировки.Область = "РегистрНакопления.УчетЗатрат";
   ЭлементБлокировки.Область = "РегистрНакопления.УчетЗатратРегл";
   ЭлементБлокировки.Область = "РегистрНакопления.Продажи";
   ЭлементБлокировки.Область = "РегистрНакопления.СвободныеОстатки";
   ЭлементБлокировки.Область = "РегистрНакопления.ТоварыНаСкладах";
   ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
   ЭлементБлокировки.ИсточникДанных =ЭтотОбъект.Товары;
   ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
   Блокировка.Заблокировать();
////////////////////////////////////////////////////////////
При одновременном проведении таких документов как РеализацияТоваровУслуг,ПеремещениеТоваров,ВозвратТоваровОтПокупателя выходит Ошибка при вызове метода контекста (Заблокировать)
   Блокировка.Заблокировать()
После этого документы проводятся поочередно.Как можно убрать эту ошибку?
1 Нуф-Нуф
 
23.11.12
11:18
а что за ошибка?
2 amadeus2010
 
23.11.12
11:33
Ошибка при вызове метода контекста (Заблокировать)
  Блокировка.Заблокировать()
Превышено время ожидания, т.е один документ на какие-то доли секунды успевает провестись, а для второго выходит это сообщение.Также у перечисленных выше документов есть общие регистры по которым они делают движения.Может при попытке одновременного проведения,документы пытаются сделать запись в один и тот же регистр и в результате выскакивает эта ошибка? Тогда как можно оптимизировать код установления блокировки?
3 Grimnir
 
23.11.12
12:08
Ну система все правильно пишет. В документах пересекающиеся товары есть?
4 amadeus2010
 
23.11.12
12:13
в принципе есть. Например я проверял работу кода по двум документам, перемещение и возврат.Значит получается что если один товар пытаться провести по двум разным документам выйдет ошибка блокировки, правильно ли я понял?
5 ДенисЧ
 
23.11.12
12:19
(4) логика железная...
6 ssh2012
 
23.11.12
12:19
(0) Странный код, явно избыточные блокировки устанавливаются, зачем он нужен?
7 Нуф-Нуф
 
23.11.12
12:20
все правильно у тебя ошибку выдает. увеличивай скорость проведения
8 Reset
 
23.11.12
12:23
(4) В нормальных условиях, если "один документ на какие-то доли секунды успевает провестись", ошибка не возникнет. Второй документ дождется освобождения и проведется
9 ssh2012
 
23.11.12
12:26
(0) Явную упр блокировку нужно ставить, когда ты прочитал данные из регистра, а затем анализируя полученные данные изменяешь регистр. Пример - партионное списание - перед получением остатков по партиям нужно установить упр исключит блокировку. Это нужно для того, чтобы параллельная транзакция не поменяла данные и не даже не начала чтение, пока не закончится первая транзакция
10 Grimnir
 
23.11.12
12:31
(4) Исходя из твоего кода да. Ты же накладываешь исключительную блокировку на все товары из данного регистра. Если документы по разным складам проводятся, то блокируй в разрезе склада, тогда параллельность будет.
Если по одному, то блокировка обязательно нужна, ты же одни и те же остатки хочешь списать разными документами.
А вообще почитай теорию блокировок и зачем они нужны, инфы сейчас полно.
11 amadeus2010
 
23.11.12
12:35
(7)как можно увеличить скорость проведения?
(10)в принципе товары в документах могут по разным складам проводиться, могут и на один склад. По теории блокировок инфу читал, код с небольшой доработкой был взят из примера на сайте.
12 Нуф-Нуф
 
23.11.12
12:35
(9) фигню сказал
13 ssh2012
 
23.11.12
12:35
(10) > Если по одному, то блокировка обязательно нужна, ты же одни и те же остатки хочешь списать разными документами.

Если идет просто движение по регистру то не нужно никаких блокировок ставить руками, платформа все сама делает
14 ssh2012
 
23.11.12
12:36
(12) обоснуй
15 max2309
 
23.11.12
12:36
(11), Судя по всему часть регистров не перевел в управляемый режим. Есть еще регистры сведений, регистры бухгалтерского учета, последовательности.
16 Нуф-Нуф
 
23.11.12
12:36
кстати да. накладывай более избирательную блокировку
17 Нуф-Нуф
 
23.11.12
12:37
(14) а не. перечитал еще раз. все по теме ) беру слова обратно
18 amadeus2010
 
23.11.12
12:42
(11)у меня в конфигурации стоит смешанный режим блокировки, а это дает возможность системе выбирать какой вид блокировки ставить документам и связанным с ними регистрами. Поэтому управляемую блокировку я поставил на те документы и связанные с ними регистры,которые являются общими для них
19 ssh2012
 
23.11.12
12:46
(18) поставь для нужных документов и регистров упр режим блокировок в конфигураторе и выкинь код установки явных блокировок, там где он не требуется по какой-то логике алгоритма
20 amadeus2010
 
23.11.12
12:55
я поставил для нужных документов и регистров управляемый режим блокировки+ добавил вышеуказанный код в обработку проведения этих документов, в  нужных регистрах только поставил управляемый режим блокировок.
21 Леха Дум
 
23.11.12
13:01
Странно, а что, "БлокироватьДляИзменения = Истина;" в модуле регистра в событии "ПередЗаписью" отменили?
22 ssh2012
 
23.11.12
13:12
(20) зачем код явных блокировок добавлен? Использование режима упр блокировок не означает, что везде нужно прописывать блокировки самостоятельно. Платформа продолжит сама накладывать неявные блокировки там, где это необходимо, но т.к. понижается уровень изоляции транзакций, может возникнуть нарушение логики работы некоторых алгоритмов (пример - контроль остатков до списания), написанных для авто режима, вот там, в нужный момент надо явно установить блокировку.
23 Нуф-Нуф
 
23.11.12
13:14
(22) блокировки в начале накладываются для избежания взаимоблокировок (дедлоков) в случаях непоследовательного захвата ресурсов разными документами.
24 pavig
 
23.11.12
13:14
(9) плюсую
(0) явно не нужная блокировка, убирай к чертем
(21) именно это ему и надо в данном случае
(22) плюсую
25 pavig
 
23.11.12
13:17
(23) скорее всего, дедлоки у него и не вылезут, зато избыточность блокировки явная. Я бы исходил из проблем: есть проблема дедлока - решал бы. Вряд ли у него они проявятся.
26 pavig
 
23.11.12
13:18
кстати, код:
   ЭлементБлокировки.Область = "РегистрНакопления.ТоварыОрганизаций";
   ЭлементБлокировки.Область = "РегистрНакопления.ЗаказыПокупателей";
   ЭлементБлокировки.Область = "РегистрНакопления.УчетЗатрат";
   ЭлементБлокировки.Область = "РегистрНакопления.УчетЗатратРегл";
   ЭлементБлокировки.Область = "РегистрНакопления.Продажи";

никого не смущает? мне одному кажется что заблокируется только область, описанная в последней инструкции?
27 Нуф-Нуф
 
23.11.12
13:22
(25) в принципе верно говоришь
28 Grimnir
 
23.11.12
13:24
(26) Кстати да :) Слона-то я и не приметил
29 ssh2012
 
23.11.12
13:27
(23) по ситуации нужно смотреть, явно залочить все регистры  это не решение
30 max2309
 
23.11.12
13:43
(0) Так,как режим стоит "автоматические и управляемые блокировки", то возможно проблема даже не в коде вовсе?. На сколько я помню при таком режиме работы, если что то "сверху" по метаданным стоит в режиме  "автоматической блокировки", то вся "операция" переводиться в автоматическую блокировку, соответственно и все регистры блокируются в автоматическом режиме. Например один из регистров не переведен в управляемую блокировку. ? Или в документе стоит автоматическое удаление движений. Но в УПП по моему стоит "не автоматическое удаление". Возможно автору все регистры перевести в режим управляемый блокировок.?
31 Леха Дум
 
23.11.12
14:00
(30) как правило, при попытке наложения разных вариантов блокировок объектов в одной транзакции платформа начинает материться
32 amadeus2010
 
23.11.12
14:04
(30)все регистры переводить в управляемый режим блокировок,замучаешься,ведь их полно.
(21)это обязательно делать если регистр переведен в управляемый режим блокировки?
(31)следует ли перевести целиком конфигурацию в управляемый режим блокировки, а документы и регистры оставить как есть?
33 Нуф-Нуф
 
23.11.12
14:07
(32) переводи конфигу в управляемый режим. этого будет достаточно
34 ЧеловекДуши
 
23.11.12
14:10
(32)Зачем тебе эту головную боль?
Что ты ожидаешь увидеть при управляемых блокировках?
35 Леха Дум
 
23.11.12
14:15
В каждом регистре делаешь как в (21), конфу переводишь в управляемый режим. Я к этому еще и контроль остатков переписывал - за примером его работы в УТ11.
(34) основной эффект после выполнения вышеописанного - существенное сокращение времени блокировки при проведении документов - блокировки накладываются в момент записи в регистр. Контроль остатков смотрит только на возникновение отрицательных остатков после записи наборов данных, но до завершения транзакции.
36 amadeus2010
 
23.11.12
14:16
хорошо, предположим перевел конфигурацию на управляемый режим блокировок, убрал код из обработки проведения, но не будет ли конфликта от того что вся конфа под управляемым режимом, а документы и регистры часть в управляемом, часть в автоматическом режимах?
(34) вся затея по написанию этого кода от того что возникла необходимость решить вопрос взаимоблокировок при одновременном проведениии некоторых документов, у которых есть общие регистры
37 Нуф-Нуф
 
23.11.12
14:17
(35) +1
38 Нуф-Нуф
 
23.11.12
14:17
(36) если конфига в управляемом режиме - то пофиг что у объектов стоит
39 EasyRider
 
23.11.12
14:17
(36)во всех этих регистрах нужен контроль остатков?
40 Нуф-Нуф
 
23.11.12
14:19
(36) я думаю идея с управляемым режимом - это уход от ожидания на блокировках, а не уход от взаимоблокировок. взаимоблокировки у тебя еще впереди
41 amadeus2010
 
23.11.12
14:19
(35)+(38) т.е при этом изчезает проблема с взаимоблокировками?
42 Нуф-Нуф
 
23.11.12
14:21
(41) взаимоблокировки - неразрешимые блокировки, дедлок. когда два документа захватили одни ресурсы и не могут разойтись.

а ожидания на блокировках - это когда документы работают с общими ресурсами, и один ждет пока закончится транзакция другого. именно этого и позволяет избежать (точнее уменьшить вероятность такого) управляемый режим
43 Нуф-Нуф
 
23.11.12
14:22
какая у тебя вообще сейчас проблема? пользователи получают сообщения "вы стали жертвой дедлока?"
44 amadeus2010
 
23.11.12
14:27
(42) т.е дедлок неизлечимая болезнь конфигурации
(43) что-то в этом духе, особенно при попытке одновременного проведения, реализация товаров, перемещение товаров и возврат товаров.
(39)в большинстве из них.Часть проблемы решилась за счет перевода в РАУЗ
45 amadeus2010
 
23.11.12
14:30
(21) кроме "БлокироватьДляИзменения = Истина;" нужно что то еще дописать в коде?
46 Нуф-Нуф
 
23.11.12
14:31
(44) тогда у тебя точно дедлоки. но это излечимо - как раз установкой предварительной блокировки на те ресурсы, которые будут изменяться в модуле проведения. только устанавливать их надо грамотно, не на все подряд, а с максимальным количеством отборов, иначе уже есть риск нарваться избыточные блокировки
47 ssh2012
 
23.11.12
14:33
(35) > В каждом регистре делаешь как в (21)

Какой смысл так делать везде? (БлокироватьДляИзменения = Истина;)? Это нужно только там где есть контроль остатков после записи. Писать БлокироватьДляИзменения [в модуле регистра в событии "ПередЗаписью"] без разбора имхо неверно.
48 amadeus2010
 
23.11.12
14:33
(46) я так думаю что можно сделать отбор по складам
49 Нуф-Нуф
 
23.11.12
14:34
(47) +1
50 Нуф-Нуф
 
23.11.12
14:34
(48) как минимум
51 amadeus2010
 
23.11.12
14:40
еще как правильней ЭлементБлокировки = Блокировка.Добавить(РегистрНакопления.ТоварыОрганизаций);
или так
   ЭлементБлокировки.Область = "РегистрНакопления.ТоварыОрганизаций";
52 pavig
 
23.11.12
14:40
(40) +1 ^-)
53 amadeus2010
 
23.11.12
14:41
потому что в синтаксис помощнике 1С пишется Блокировка.Добавить(РегистрНакопления.ТоварыОрганизаций); , а в примерах ЭлементБлокировки.Область = "РегистрНакопления.ТоварыОрганизаций";
54 Нуф-Нуф
 
23.11.12
14:43
в типовой ут 11 посмотри реализацию
55 Reset
 
23.11.12
14:43
(51) Это однофигственно
56 Reset
 
23.11.12
14:47
(51) Только, разумеется, в 1м случае имя пространства нужно тоже в кавычках
57 amadeus2010
 
23.11.12
14:57
понятно, сейчас стало немного
58 max2309
 
23.11.12
15:01
(57) А у тебя же SQL версия да?
59 amadeus2010
 
23.11.12
15:02
скл 2088 р2
60 max2309
 
23.11.12
15:15
(59) - Возможно, тебе придется полностью модуль проведения переписывать по документам, сложно, долго, но это единственный вариант. Только он даст эффект "качественного" проведения.  С блокировками стоит потренироваться на каркасной конфигурации для начала. Возможно придется избавится в конфигурации от "тормозящих" объектов. Если конечно бесстрашный в УПП такое делать. :)
61 amadeus2010
 
23.11.12
15:23
(59) иного не остается, и так конфа не тиовая, частично переписанная, но хотелось бы решить вопрос окончательно по взаимоблокировкам
62 amadeus2010
 
26.11.12
13:57
Добрый день в продолжении темы взаимоблокировок.Вернул с РАУЗ на партионный учет, онлайн списание по партиям, режим блокировок управляемый, в регистрах там где необходимо стоит БлокироватьДляИзменений=Истина, в обработке проведения оставил
/////////////////////////////////////////////////
Блокировка = Новый БлокировкаДанных;
   ЭлементБлокировки = Блокировка.Добавить();
   ЭлементБлокировки.Область = "РегистрНакопления.УчетЗатрат";
   ЭлементБлокировки.Область = "РегистрНакопления.УчетЗатратРегл";
   ЭлементБлокировки.Область = "РегистрНакопления.СвободныеОстатки";
   ЭлементБлокировки.Область = "РегистрНакопления.Продажи";
   ЭлементБлокировки.Область = "РегистрНакопления.ТоварыНаСкладах";
   ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
   ЭлементБлокировки.ИсточникДанных =ЭтотОбъект.Товары;
   ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
   ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Склад", "Склад");
   Блокировка.Заблокировать();
/////////////////////////////////////////////////////////
но все равно выходит ошибка блокировки при выполнении транзакции, превышено время ожидания.
63 amadeus2010
 
26.11.12
14:26
ПОЛУЧАЕТСЯ ЧТО ПРИ СПИСАНИЕ ПО ПАРТИЯ ОНЛАЙН ПРОИСХОДИТ ОЖИДАНИЕ ПО ВРЕМЕНИ ПРИ БЛОКИРОВКАХ. В КОНФИГУРАТОРЕ В АДМИНИСТРИРОВАНИИ В НАСТРОЙКАХ ИБ УВЕЛИЧИЛ ВРЕМЯ ОЖИДАНИЯ ПРИ БЛОКИРОВКАХ ДО 30 СЕК. ЧТО ЕЩЕ МОЖНО СДЕЛАТЬ?
64 krbIso
 
26.11.12
14:33
Ожидание происходит потому что граница последовательности по одной организации это одна запись в таблице.
Расчет себестоимости в онлайне невозможен. Увеличивать время таймаута нельзя.
65 amadeus2010
 
26.11.12
15:01
что-нибудь можно сделать в этом случае?
66 amadeus2010
 
26.11.12
15:04
может при онлайн списании есть регламентные процедуры? управляемые блокировки теоретически снижают взаимоблокировки
67 krbIso
 
26.11.12
15:33
(66)можно двигать границу последовательности регламентно. Есть обработка "Установка границы последовательности..."
У вас неверное представление об управляемом режиме и понятий блокировка и взаимоблокировка.
http://1cexpo.ru/metodiki/21-tipichnye-prichiny-izbytochnyx-blokirovok-i-metody-optimizaczii.html
Вообще изначально задача какая была? Рассчитывать себестоимость в онлайне?
68 amadeus2010
 
26.11.12
16:00
(67)изначальная задача настроить списание по партиям в онлайн,чтобы не выходила взаимоблокировка.Как можно это настроить?
69 dimaldinho
 
26.11.12
16:06
(64) +1
(68) убедить не списывать онлайн
70 amadeus2010
 
26.11.12
16:17
(69) снял в настройках учета галочки в списывать партии при проведении документов, также Гилев советует использовать регистр Свободные остатки и РАУЗ, но вот тут и возникает вопрос как настроить все правильно?
71 krbIso
 
26.11.12
16:19
(68) я так понял проблема в следующем
вам нужен расчет себестоимости в онлайн, вы начали использовать политику "списывать при проведении" в этом случаи у вас начали возникать ожидании на блокировках (20 сек таймаут). Затем вы решили расчитывать с помощью РАУЗ, но в этом случаи у вас начали проблемы со взаимоблокировками.
Значит вам нужно разобраться почему у вас возникают взаимоблокировки, ЦУП в помощь, если нет ЦУПа, профайлер событие дедлок граф. Если ни того ни другого нет, посмотрите в коде есть ли запись движение в регистры из разных документов вручную, и в каком порядке они выполняются.
72 amadeus2010
 
26.11.12
16:26
спасибо за совет
73 amadeus2010
 
27.11.12
09:53
доброе утро, еще раз возвращаясь к теме списание по партиям онлайн.Как советует Гилев в рекомендациях, отказаться от использования режима списания по партиям онлайн, перейти в оффлайн, использовать регистр Свободные остатки, перейти на РАУЗ и управляемые блокировки.Сделал все кроме РАУЗ, также добавил в регистры вызов управляемой блокировки и в обработке проведения добавил код управляемых блокировок.При проведении одновременно двух документов вышла такая ошибка

Ошибка при выполнении обработчика - 'ОбработкаПроведения'
по причине:
{Документ.РеализацияТоваровУслуг.МодульОбъекта(7004)}: Ошибка при вызове метода контекста (Выполнить)

по причине:

по причине:
Ошибка выполнения запроса
по причине:
Конфликт блокировок при выполнении транзакции:
Microsoft OLE DB Provider for SQL Server: Транзакция (идентификатор процесса 59) вызвала взаимоблокировку ресурсов блокировка с другим процессом и стала жертвой взаимоблокировки. Запустите транзакцию повторно.
HRESULT=80004005, SQLSrvr: SQLSTATE=40001, state=33, Severity=D, native=1205, line=1
74 amadeus2010
 
27.11.12
10:07
первая часть ошибки могла появиться так как одновременно с этим документом проводился Перемещение товаров.Как можно в дальнейшем при списании по партиям онлайн добиться исключения взаимоблокировок?
75 krbIso
 
27.11.12
16:35
выложи конфу нужно смотреть что ты там наделал