Имя: Пароль:
1C
 
1с блокировка объектов
0 Мафусаил
 
13.01.20
15:03
Привет!
Как можно узнать, заблокирован ли объект не блокируя его?
Скажем если я делаю:
Объект.Заблокировать(); // в таком случае для пользователя ИБ документ будет заблокирован
А как узнать из кода, заблокировал ли пользователь (открыл ли форму документа)
Объект.Заблокирован(); // у меня показываешь ложь
1 Ёпрст
 
13.01.20
15:06
сам блокируешь, если удача, объект свободен, иначе заблокирован
2 fisher
 
13.01.20
15:13
(0) > Объект.Заблокирован(); // у меня показываешь ложь
А если прочитать СП по "Заблокирован", можно даже узнать - почему.
3 fisher
 
13.01.20
15:14
В общем, только попыткой блокировки, как уже сказали.
Если уже заблокировано пользователем - будет исключение.
4 Мафусаил
 
13.01.20
15:18
То есть без попытки блокировки ни как?
5 fisher
 
13.01.20
15:22
(4) Не-а. А в чем проблема разблокировать, если блокировка успешна?
6 Мафусаил
 
13.01.20
15:23
(5) я попробовал это сделать. но по какой то причине документ остаётся заблокированный на какое то время, на секунд 5
7 Rovan
 
гуру
13.01.20
15:25
https://its.1c.ru/db/metod8dev/content/2880/hdoc

При редактировании в форме объект не блокируется при открытии формы. Блокировка ставится при попытке интерактивного изменения объекта. То есть в форме блокировка ставится на объект только в тот момент, когда пользователь пытается изменить объект, вводя данные в элементы управления формы, связанные с реквизитами объекта. Так как между моментом считывания и моментом блокировки может произойти изменение объекта другим пользователем, то в момент блокировки производится проверка, что объект не был изменен. Если объект все же был изменен или в данный момент редактируется другим пользователем, то выдается сообщение о невозможности заблокировать объект. После этого пользователь должен перечитать данные и опять попытаться начать редактирование объекта. Разблокирование объекта происходит только после закрытия формы. То есть после записи объекта остается заблокированным.
8 fisher
 
13.01.20
15:27
(6) Хм... Странно... Разблокируешь для того же ПРОГРАММНОГО объекта, в котором блокировал?
9 Мафусаил
 
13.01.20
15:41
Объект = Ссылка.ПолучитьОбъект();

Попытка
    Объект.Заблокировать();
Исключение
    Возврат "Невозможно заблокировать " + Символы.ПС + ОписаниеОшибки();    
КонецПопытки;

Объект.Комментарий = ТекущаяДата();
Объект.Записать(РежимЗаписиДокумента.Проведение);
Объект.Разблокировать();


а пользователь сразу после заходит в документ и получает ошибку "операция не может быть выполнена из-за несоответствия версии или отсутствия записи базы данных"

Через 10 секунд информация в объекте обновляется и пользователь может работать с объектом.

Может стоит уточнить, это всё происходил на web сервисе
10 Ёпрст
 
13.01.20
15:47
(9) странный код...нафига проводить ради комментария ?
11 Мафусаил
 
13.01.20
15:48
(10) это тест
12 Мафусаил
 
13.01.20
15:55
не понимаю по какой причине объект может блокироваться на 10 секунд после его записи и тем более "Объект.Разблокировать();"
13 Ёпрст
 
13.01.20
15:56
(11) мот тогда с другой стороны зайти ?
в ПриОткрытии в Попытке делаешь блокировку, если НЕ удача, то всей форме делаешь толькопросмотр = истина и сообщение - что заблокирована (из сообщения об ошибки получаешь имя того, кто открыл объект и показываешь его пользователю).

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

У нас так, например.
14 Ёпрст
 
13.01.20
15:57
(12) видать время обновления бла бла бла ..10 сек
15 Мафусаил
 
13.01.20
15:59
(13) ну это как костыль получается, а при выходе из формы разблокировать()? И всё равно не понятно, почему объект заблокирован на 10 секунд
16 Ёпрст
 
13.01.20
16:10
(15) ничего не надо, оно само разблокируется, объекта то нет уже
17 Мафусаил
 
13.01.20
16:21
(16) а откуда берутся эти 10 секунд?
18 pechkin
 
13.01.20
16:22
делай лучше
ЗаблокироватьДанныеДляредактирования
19 Ёпрст
 
13.01.20
16:23
(17) период опроса таблиц иб
20 Мафусаил
 
13.01.20
16:25
(19) это можно как то обыграть?
21 Ёпрст
 
13.01.20
16:27
(20) хз, как там оно в web сервисе реализовано, по мне, так лучше самому этим управлять, проще в при открытии блокировать
22 Мафусаил
 
13.01.20
16:31
О отдельно имя пользователя тоже не получить, кто занял документ? Он же только в ОписаниеОшибки() которую парсить не получиться
23 Ёпрст
 
13.01.20
16:37
(22) Почему не получиться ?

Ошибка_Содержание = ОписаниеОшибки();
        ОбщегоНазначения.Сообщение("Документ используется другим пользователем!"+Символы.ПС+Сред(Ошибка_Содержание,Найти(Ошибка_Содержание,"Объект уже заблокирован")),Перечисления.ВидыСообщений.ВажнаяИнформация);