Имя: Пароль:
1C
1С v8
Управляемые блокировки
0 Мэс33
 
17.10.13
16:09
Вопрос назрел, други.
Правильно ли будет устанавливать управляемую блокировку на Регистр бухгалтерии таким образом?

ОбъектБлокировки_БУ = Блокировка.Добавить("РегистрБухгалтерии.Типовой.
ОбъектБлокировки_БУ.Режим = РежимБлокировкиДанных.Исключительный;
ОбъектБлокировки_БУ.УстановитьЗначение("Регистратор", СтруктураШапкиДокумента.Ссылка);

Документ должен просто записать данные в регистр, остатки и прочее - не важны. Используется Oracle в качестве БД.
1 Мэс33
 
17.10.13
16:09
Сорри, скопировал неверно:

ОбъектБлокировки_БУ = Блокировка.Добавить("РегистрБухгалтерии.Типовой.НаборЗаписей");
ОбъектБлокировки_БУ.Режим = РежимБлокировкиДанных.Исключительный;
ОбъектБлокировки_БУ.УстановитьЗначение("Регистратор", СтруктураШапкиДокумента.Ссылка);
2 Господин ПЖ
 
17.10.13
16:10
если его там еще нет - не заблокируется вся таблица?
3 Господин ПЖ
 
17.10.13
16:12
и вообще смысл глобальный блокировать руками если надо "просто записать"
4 Мэс33
 
17.10.13
16:12
Тоже отличный вопрос?
5 Мебиус
 
17.10.13
16:12
Вопрос
Если нет чтения данных
зачем вообще в этом случае  устанавливать исключительную блокировку?
6 Мэс33
 
17.10.13
16:13
Руками как понимает имеет смысл - так как этот один документ вводится массово. А оракл блокирует всю таблицу.
7 Мебиус
 
17.10.13
16:14
блокировка всей таблицы происходит если в таблице нет или очень мало записей
8 krbIso
 
17.10.13
16:14
при записи блокировки автоматом ставятся.
9 Мэс33
 
17.10.13
16:14
Что-то с моим "русским языком" не то.. под вечер с ошибками пишу. Заранее извиняюсь.
10 Мебиус
 
17.10.13
16:15
(6)
в транзакции блокируются только те записи, что читаются или изменяются
11 Мэс33
 
17.10.13
16:15
А при перепроведении?
12 Мэс33
 
17.10.13
16:16
(10) То есть при записи - необходимости в блокировке нет точно?
13 Мебиус
 
17.10.13
16:17
да нет
14 Мебиус
 
17.10.13
16:17
только при проведении или перепроведении
15 Мебиус
 
17.10.13
16:18
и необходимости в управляемой блокировке вообще в данном случае нет
16 Мэс33
 
17.10.13
16:18
Но он - не мешает? По крайней мере?
17 Мэс33
 
17.10.13
16:20
(14) То есть, при создании движений, пока еще в регистре бухгалтерии нет записей по данному документу, блокировка в принципе не нужна? И блокировок не будет?
А если в этот момент создается другой документ? Или документ другого вида? Массово?
18 Мебиус
 
17.10.13
16:22
(16)
Мешает, потому что ты блокируешь записи преждевременно
в этот момент другой документ мог бы туда что нибудь записать
то есть ты снижаешь производительность
19 Infsams654
 
17.10.13
16:22
(0) из-за чего такой вопрос? Есть обработка, которая долго чего пишет ? Если такй нет, то и нечего блокировку ставить
20 Мэс33
 
17.10.13
16:23
(18) Какие записи блокируются преждевременно, если их нет на момент создания проводок?
21 Мебиус
 
17.10.13
16:24
(17)
управляемые блокировки имеют смысл только в том случае если ты что прочитал в транзакции (например таблицу партии для списания) а затем хочешь изменить
22 Новиков
 
17.10.13
16:25
(20) откуда инфа? Космос? :)
23 Новиков
 
17.10.13
16:26
(20) посвечу в ваш космос своим дартаньяновским лучиком: а как же таблица итогов регистра? Она не изменяется, не - когда вы проводки то пишите? :)
24 Мэс33
 
17.10.13
16:26
(19) Есть УПП, в нем есть несколько документов с использованием управляемых блокировок. Остальные - с автоматическими блокировками.

Вопрос возникает, а если все важные документы перевести на управляемые? Но многие документы не проверяют остатки, а просто пишут проводки. Стоит ли тогда переводить на управляемые?
25 Мэс33
 
17.10.13
16:26
(22) А вот я и не знаю. Вопрошать пришел сюда потому.
26 Мэс33
 
17.10.13
16:27
(23) Тут наверху сказали - зачем блокировать, если записи только создаются?
27 Новиков
 
17.10.13
16:28
(26) правильно сказали. Руками смысл блокировки только при записи никакой нет.
28 Мэс33
 
17.10.13
16:29
Хм... пошел думать. Домой.
Завтра продолжу эту ветку. Есть интересные вопросы.
29 Новиков
 
17.10.13
16:33
>> Вопрос возникает, а если все важные документы перевести на управляемые?

Нужно смотреть не документы, а регистры. Выявлять те регистры, на которых проявляются блокировки. И  уже по ним делать управляемые блокировки.

>> Но многие документы не проверяют остатки, а просто пишут проводки.
Ну и отлично. В РБ у тебя стоит скорее всего "разрешить разделение итогов". Это обеспечит отсутствие блокировок в момент записи. Всё гут.

Зачем ты вообще задался этим вопросом? :) Пользователя начали жаловаться? Проявляются какие-то артефакты в прикладной логике решения? Или делать нефик просто? Если делать нефик - учи СКД, БСП, КД. Просто с дурки, как ты, можно сделать гораздо хуже, чем уже есть :)
30 Infsams654
 
17.10.13
16:34
(28) "Есть УПП, в нем есть несколько документов с использованием управляемых блокировок" - это сродни тому, что "Есть обработка, которая долго чего пишет ". Т.е. при проведении этих документов не должно что-то такое нахлыбустнуть от кого-то постороннего.
Но это уж явно крайне редкий случай
31 Мебиус
 
17.10.13
16:38
(30)
то за бред?

ТС пытался установить приправляемую блокировку там где она в принципе не нужна, ему объяснили что это неправильно

а ты о чем?
32 Мебиус
 
17.10.13
16:38
(30)
"Т.е. при проведении этих документов не должно что-то такое нахлыбустнуть от кого-то постороннего"


это явно клинический случай))
33 Новиков
 
17.10.13
16:40
(32) задайся вопросом, ТС помнит наизусть табличку, в которой показано какая блокировка будет установлена в транзакции, в зависимости от типа управления блокировкой на документе и регистре.

Ну кароче. Совет автору - не лазить пока туда. 100% решение верное, в данном случае :)
34 exwill
 
17.10.13
16:45
(0) Блокировки имеет смысл устанавливать на другие поля, но не на регистратор. Подумай сам, какой смысл в блокировке на регистратор?
35 Новиков
 
17.10.13
16:49
(34) Если ТС пишет запрос, в котором принимает решение об отказе по анализу регистратора, то вот тебе и смысл. Его тупо никто не должен даже прочитать. В чем проблема?
36 exwill
 
17.10.13
16:56
(35) Блокируется регистр.
37 Мебиус
 
17.10.13
16:59
(35)
кого прочитать? регистратор?

(34)смысл может быть но не в данном случае
38 Новиков
 
17.10.13
17:01
(37) регистратор. Если так алгоритм построен, что отказ принимается по прочитке какого-то потрошонка из регистратора

(36) с чего вдруг?
39 Новиков
 
17.10.13
17:04
(37) хотя в этом случае, в упр.блокировках нужно разделяемую блокировку накладывать, а не исключительную. Исключительную, если мы вдруг соберемся потрошонка менять. Вот так я полагаю как-то. Есть смысл, когда стоит лочить сам регистратор.

Я пока такого в практике не видел, но скорее всего, такое бывает :)
40 McNamara
 
17.10.13
17:09
(0)Давайте рассуждать логически, есть 4 уровня изоляции:

1)запись-запись  
2)запись-чтение
3)чтение-запись
4)чтение-запись новой

Управляемая блокировка в 1с понижает уровень изоляции до 2. То есть при записи будет все просходить все равно автоматически, а при чтении уже можно что-то изолировать в коде.
Следовательно вывод, если транзакция пишет данные и ничего не читает, то система и так отработает сама, никакие блокировки устанавливать не нужно.
41 McNamara
 
17.10.13
17:14
(0) то есть если ты пишешь в регистр, то это транзакция записи. И она будет защищена от других транзакций по 2 уровню изоляции. То есть система сама при таком уровне изоляции не даст другим читающим и пишушим транзакциям ничего одновременн записать. Делать в этом случае блокировку в коде- ни на что не повлияет то есть бессмысленно...вроде так.
42 Мэс33
 
18.10.13
06:52
Доброе утро.

Итак... я на работе. Пришел снова с теми вопросами.
Насчет моего кода во втором комментарии - он уже стоит в документе, его написали до меня.

Как понимаю, есть два вывода:
1) чтобы при перепроведении не было взаимоблокировок, лучше ставить управляемую блокировку (напомню, БД - Оракл, на регистре бухгалтерии и в документе стоит - управляемые блокировки);
2) применить лучше разделяемые блокировки, так как в принципе  в этом документе не важны, какие были остатки на счетах, блокировать нечего для чтения другими документами. Верно?

(41) Это я уже понял, что при записи будет блокировка в любом случае. Но при перепроведении - лучше ставить? Или я не прав. ЖКХ - читал, но видимо мне этого недостаточно. Есть примеры в инете, но все авторы там рассуждают о списании остатков товаров, где важно иметь точные данные об остатках.
43 floody
 
18.10.13
06:58
вроде уже выяснили, что блокировки накладывать в данном случае не нужно?
44 Мэс33
 
18.10.13
07:07
А теперь - внимание.
Код другого документа. Там есть движения по регистру накопления, остатки которого на момент проведения документа - важны.
Имеется код, уже написанный, кто прокомментирует?

Блокировка = Новый БлокировкаДанных;
ОбъектБлокировки_БУ = Блокировка.Добавить("РегистрБухгалтерии.Типовой.НаборЗаписей");
ОбъектБлокировки_БУ.Режим = РежимБлокировкиДанных.Исключительный;
ОбъектБлокировки_БУ.УстановитьЗначение("Регистратор", СтруктураШапкиДокумента.Ссылка);
//
Для каждого СтрокаНовыйДоговор из ТаблицаПоГрафику Цикл
    Если не ПустаяСтрока(СтрокаНовыйДоговор.НомерНовогоДоговора) Тогда
        ОбъектБлокировки_НовыйДоговор_БУ = Блокировка.Добавить("РегистрНакопления.НекийРегистр");
        ОбъектБлокировки_НовыйДоговор_БУ.Режим = РежимБлокировкиДанных.Исключительный;
        ОбъектБлокировки_НовыйДоговор_БУ.УстановитьЗначение("НомерДоговора", СтрокаНовыйДоговор.НомерНовогоДоговора);
    КонецЕсли;
КонецЦикла;
//
ОбъектБлокировки_НовыйДоговор = Блокировка.Добавить("Документ.НекийДокумент");
ОбъектБлокировки_НовыйДоговор.Режим = РежимБлокировкиДанных.Разделяемый;
ОбъектБлокировки_НовыйДоговор.УстановитьЗначение("Ссылка", СтруктураШапкиДокумента.Ссылка);
//
ОбъектБлокировки_НовыйДоговор_БУ = Блокировка.Добавить("РегистрНакопления.НекийРегистр");
ОбъектБлокировки_НовыйДоговор_БУ.Режим = РежимБлокировкиДанных.Разделяемый;
ОбъектБлокировки_НовыйДоговор_БУ.УстановитьЗначение("НомерДоговора", СтруктураШапкиДокумента.Номер);
//
ОбъектБлокировки_НовыйДоговор_БУ = Блокировка.Добавить("РегистрБухгалтерии.Типовой");
ОбъектБлокировки_НовыйДоговор_БУ.Режим = РежимБлокировкиДанных.Разделяемый;
ОбъектБлокировки_НовыйДоговор_БУ.УстановитьЗначение("Счет",      ПланыСчетов.Типовой.НекийСчет);
ОбъектБлокировки_НовыйДоговор_БУ.УстановитьЗначение("Субконто2", СтруктураШапкиДокумента.Ссылка); //в субконто ссылка на сам документ
Блокировка.Заблокировать();
//{тут собственно проводки формируются  с расчетом остатков по РН.НекийРегистр
//тут собственно проводки формируются}
ПроводкиБУ.Записать(Ложь);
ДвиженияПереносимыхПремий.Записать(Ложь);
45 Мэс33
 
18.10.13
08:33
UP
46 mikeA
 
18.10.13
09:16
(45) что ап, спалился ты )))
ДвиженияПереносимыхПремий.Записать(Ложь);
47 Мэс33
 
18.10.13
09:27
(46) Вот блин :-)) а вроде старался тариться :-)
48 Infsams654
 
18.10.13
09:39
(31) еще на мотоцикле. Это не Defender ?
49 Новиков
 
18.10.13
10:22
(44) пояснения к твоему коду:

Набор записей РБ документа будет где-то дальше изменяться, т.к. он лочится исключительно.

Дальше идет глупейший цикл, но смысл тот же: в РегистрНакопления.НекийРегистр будет что-то писаться.

Из РегистрНакопления.НекийРегистр будет что-то читаться ниже.

Из РБ также будет что-то читаться с отбором по счету и субконто2.

Кроме цикла, претензий у меня нет. Все гут.
50 Мэс33
 
18.10.13
10:31
Ну слава Аллаху.