Имя: Пароль:
1C
 
пессимистическая блокировка vs транзакционная
,
0 OldCondom
 
31.03.23
13:51
Открываю форму документа, по идее должна сработать пессимистическая. В тоже время в коде: ...ПолучитьОбъект().Записать() - и таки записывает. Нажимаю перечитать документ на форме и да, данные изменены.
Видимо я неправильно поинмаю объектные блокировки. В моем понимании этот объект должен был быть заблокирован для изменения и при методе записать() сработало бы исключение.
1 DimVad
 
31.03.23
13:56
(0) А Вы начните что-нибудь менять в открытой форме...
2 OldCondom
 
31.03.23
13:59
(1) да это уже понятно, там оптимистическая сработает.
3 OldCondom
 
31.03.23
14:00
Таккк. Смотрю на ИТС: Оптимистическая блокировка запрещает запись объекта в базу данных, если после считывания объекта он был изменен в базе данных другими сеансами или другими программными объектами этого же сеанса.

А как объект может быть изменен , если существует пессимистическая и никак другой сеанс по идее ничего не должен сделать?
4 OldCondom
 
31.03.23
14:02
Я про это: Пессимистическая блокировка объектов базы данных предназначена для того, чтобы запретить изменение данных определенного объекта другими сеансами или данным сеансом до тех пор, пока блокировка не будет снята этим объектом встроенного языка.
5 ИУБиПовиц
 
31.03.23
14:03
ПолучитьОбъект().Записать() - и таки записывает . Вроде надо перед записать попробовать заблокировать().
6 vicof
 
31.03.23
14:04
7 OldCondom
 
31.03.23
14:04
(5) так ведь Заблокировать() сработал при открытии формы другим сеансом. Далее другой сеанс делаеть программно Записать() и унего получается, вот для меня это загадка
8 OldCondom
 
31.03.23
14:09
(6) Ок, читаю: Пессимистическая блокировка объектов базы данных предназначена для того, чтобы запретить изменение данных определенного объекта другими сеансами или данным сеансом до тех пор, пока блокировка не будет снята этим объектом встроенного языка.

В основном механизм пессимистической блокировки используется системой 1С:Предприятие 8.1 для блокировки объектов, редактируемых в форме. В тот момент, когда пользователь начинает модификацию объекта в форме, расширение формы устанавливает пессимистическую блокировку.

Я открыл форму документа, установилась пессимистическая блокировка.

Далее программно перезаписываю этот документ и... ничего, никакой блокировки.
9 OldCondom
 
31.03.23
14:11
Еще считать грубо говоря "пользовательским" вариантом? Так как транзакционной как-то все равно на объектную и они запишет новые состояние именно в таблицах, а не объекте?
10 OldCondom
 
31.03.23
14:11
Или*
11 ИУБиПовиц
 
31.03.23
14:12
(7) Перед записать другим сеансом надо заблокировать, если заблокируется - запись возможна, если нет - будет ошибка
12 OldCondom
 
31.03.23
14:14
(11) иными словами проверить объектную блокировку перед транзакционной? То есть транзакционна никак не смотрит на объектную?
13 vicof
 
31.03.23
14:16
(8) Форма у тебя открыта, когда ты под другим пользователем открываешь ту же форму и записываешь?
14 OldCondom
 
31.03.23
14:19
(13) под своим, тот же сеанс. Да, об этом думал, но: "тобы запретить изменение данных определенного объекта другими сеансами или данным сеансом до тех пор"
15 PuhUfa
 
31.03.23
14:24
(8) ну написано же: "в тот момент, когда пользователь НАЧИНАЕТ модификацию объекта в форме". До этого момента вообще нет никакой блокировки.
16 OldCondom
 
31.03.23
14:33
(15) а что подразумевается под словом "Начинает"? Начинаем менять реквизит? Или начинает запись? Потому как во втором случае срабатвает транзакция и накладывается транзакционная блокировка на уровне СУБД, и нафига тогда нужна объектная?
17 OldCondom
 
31.03.23
14:38
Ок. Открываю форму одного документа в двух разных сеансах, тогда все ок и понятно. Второй сеанс не сможет что-то даже поменять в форме, выдаст предупреждение. А вот программно изменить - не вопрос, пожалуйста.
Итого, объектную можно охарактеризовать как работа в пользовательском варианте?
18 vicof
 
31.03.23
14:44
Объектную можно наложить и программно.
Только она накладывается не в момент записи, а когда ты напишешь объект.заблокировать()
19 vicof
 
31.03.23
14:45
Только оно практически нигде не нужно
20 OldCondom
 
31.03.23
14:46
(18) а что именно она блокирует? Объект ведь, так? Тогда почему ПолучитьОБъект().Записать() - работает? Объект же заблокирован.
21 OldCondom
 
31.03.23
14:46
(19) в пользовательском варианте только, других вариантов я не вижу. Чтобы выскочило "Другой пользователь уже редактирует".
22 Шурик71
 
31.03.23
14:49
(20) Объект начнет быть заблокирован не при открытии - а когда ты изменишь какой-нибудь его реквизит (когда модифицированность = истина)
23 OldCondom
 
31.03.23
14:50
(22) пробовал. Меняю комментарий. Открываю второй сеанс, программно меняю комментарий и спокойно записывает.
24 OldCondom
 
31.03.23
14:51
если тоже самое сделать НЕ программно - да, ругается.
25 ДНН
 
31.03.23
14:51
(0) Пессимистическая блокировка защищает только от другой пессимистической блокировки. Про СУБД, транзакции и транзакционные блокировки она ничего не знает, поэтому и не может защитить от них.
26 OldCondom
 
31.03.23
14:55
(25) Вот, видимо это и надо держать в голове.
27 vicof
 
31.03.23
14:56
(23) ДокументОбъект.<Имя документа>.Заблокировать (DocumentObject.<Document name>.Lock)

ДокументОбъект.<Имя документа> (DocumentObject.<Document name>)

Заблокировать (Lock)

Доступен, начиная с версии 8.0.

Синтаксис:

Заблокировать()
Описание:

Выполняет блокировку объекта от изменения другими режимами или пользователями.

Доступность:

Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.

Пример:

Попытка
    НовДокумент.Заблокировать();
Исключение
    Предупреждение(НСтр("ru = 'Невозможно заблокировать документ.';"
     + " en = 'Can't lock the document.'"));
КонецПопытки;
28 OldCondom
 
31.03.23
15:02
(27) и?
Ну ок, не поленился)
об = объект.Реквизит1.ПолучитьОбъект();
об.Заблокировать();
ДатаВыхода = ТекущаяДата() + 15;
Пока ТекущаяДата() < ДатаВыхода Цикл
    а = 1;
КонецЦикла;    

Во втором сеансе программно меняю, все меняется в эти 15 сек.
29 vicof
 
31.03.23
15:11
И ты реквизит1 меняешь во втором сеансе?
30 OldCondom
 
31.03.23
15:13
нет, реквизит1 - это на форме, там документ. Запускаю этот код, ставлю этому документу пессимистическую блокировку, во втором сеансе этому же документ спокойно меняю комментарий и записываю
31 ДНН
 
31.03.23
15:14
(30) Во втором сеансе тоже нужно сделать Заблокировать
32 ДНН
 
31.03.23
15:15
И Заблокировать устарело. НА управляемых формах нужно использовать ЗаблокироватьДанныеДляРедактирования
33 OldCondom
 
31.03.23
15:18
(31) да кому нужно? Блокировка для того и блокирует, чтобы заблокировать. А не для того, чтобы по запросу выяснить, а не сказано ли, что она заблокирована?
(32) вот кстати в описании метода уже ясно и понятно написали: Заблокировать данные для редактирования в форме клиентского приложения.

Все, в форме клиентского приложения. Пользовательский вариант работы.