Имя: Пароль:
1C
1С v8
Блокировка объекта при открытии формы
0 Ayvengo
 
03.04.12
14:20
Думаю, что кто-то встречался с такой проблемой: пользователь открывает карточку номенклатуры, вносит какие-то изменения, нажимает на кнопку сохранить/записать и видит сообщение:
шибка блокировки объекта. Объект уже заблокирован или объект уже был изменен, нужно перечитать/обновить форму.

Появилась идея избежать этого и не дать пользователю внести какие-то изменения, если у кого-то этот объект уже заблокирован.

Опять же, мне не хочется вызывать эту процедуру при открытии/при создании на сервере формы. Хочется сделать какой-то уникальный инструмент, но я нарвался на одну проблему ...

Что бы заблокировать объект и я мог в нем, что-то делать, нужно указать уникальный идентификатор самой формы, до её открытия.

На данный момент делаю следующим образом:
Создал подписку на событие "ОбработкаПолученияФормы", в процедуре я вызываю процедуру блокировки

Процедура ЗаблокированОбъект(Ключ, УИД)
   Если ЗначениеЗаполнено(Ключ) Тогда
       Попытка
           ЗаблокироватьДанныеДляРедактирования(Ключ,,УИД);
       Исключение
           ИнформацияОбОшибке    = ИнформацияОбОшибке();
           ТекстОшибки        = ИнформацияОбОшибке.Причина.Описание;
           Сообщение = Новый СообщениеПользователю;
           Сообщение.Текст = ТекстОшибки + " Доступен только просмотр.";
           Сообщение.Сообщить();
       КонецПопытки;
   КонецЕсли;
КонецПроцедуры

Как можно получить УникальныйИдентификатор формы в подписке ОбработкаПолученияФормы?
Может быть кто-то решал эту проблему более интересным способом? :)
1 Дикообразко
 
03.04.12
14:24
т.е. ты хочешь сделать так как было в 77 что ли?
2 Serg_1960
 
03.04.12
14:28
(0) Что-то ты не с того конца взялся за решение проблемы. Анализировал причину появления этого сообщения?

PS: желательно озвучить версии конфы и платформы.
3 Serg_1960
 
03.04.12
14:31
Имхо: такого рода ошибки возникают при использовании конструкции типа "Объект.ОбменДанными.Загрузка = Истина". Проведении обмена данными во время работы пользователей, например...
4 Maxus43
 
03.04.12
14:32
скорее 2 юзера просто одновременно открыли один и тот же элемент, тут срабатывает принцип - кто первый записал того и тапки
5 Feanor
 
03.04.12
14:36
(0) чво-то у меня нет такого события в подписках. мб это в последних версиях платформы?
6 Ayvengo
 
03.04.12
14:37
(5) 8.2.13.301 платформа. Хм, кажется я что-то лишнее делаю. Это уже и так без меня работает :)
7 Ayvengo
 
03.04.12
14:38
+(6) при чем блокировка происходит в момент первого изменения.
8 Kashemir
 
03.04.12
14:38
БлокировкаДанных
Предназначен для явной блокировки данных от чтения или изменения другими сессиями.
9 Feanor
 
03.04.12
14:39
(6) странно, у меня 8.2.14, а объект для подписки - СправочникОбъект?
10 Ayvengo
 
03.04.12
14:39
(9) простите, 8.2.15.301
11 Feanor
 
03.04.12
14:40
(10) понятнО)
12 Ayvengo
 
03.04.12
14:40
(9) объект, справочник менеджер
13 Feanor
 
03.04.12
14:40
(12) а там нет события при создании на сервере?
14 Ayvengo
 
03.04.12
14:41
(13) к сожалению, нет :(
15 simol
 
03.04.12
14:42
(0)Да вы батенька поди где-то номенклатуру записываете не интерактивно. Я бы с этим разбирался бы.
16 Feanor
 
03.04.12
14:44
"Хм, кажется я что-то лишнее делаю. Это уже и так без меня работает" - т.е. автоматом блокируется?
17 Ayvengo
 
03.04.12
14:47
(16) да, все отлично работает. Это пережитки прошлого .. видимо осадок остался ... дума "ЩА ТУТ ВСЕ ПОПРАВЛЮ, СДЕЛАЮ КАК НАДО" :)
18 Feanor
 
03.04.12
14:55
(17) видимо, это тоже фишка 15-ой платформы, в 14-ой автоматом не блокируется вроде
19 Ayvengo
 
03.04.12
14:57
(18) попробуй открыть 2 1Ски и одну и туже карточку номенклатуры, потом попробуй внести изменения в 1ой 1Ске и потом во 2й, заодно и узнаем :)
20 Feanor
 
03.04.12
15:01
(19) "Данные были изменены или удалены другим пользователем", конфа не типовая.
21 Ayvengo
 
03.04.12
15:03
(20) у меня тоже не типовая. ты не записывай объект, просто открой, что-то внеси в него. и, если даже записал, он тебе дает внести изменения или сразу пишет ошибку, что данные были изменены?
22 Feanor
 
03.04.12
15:04
(21) открыл в двух разных сеансах один и тот же объект, в первом изменил и записал. во втором пытаюсь что-то изменить - сразу ругается.
23 kosts
 
03.04.12
15:05
(0) Можно в "ПриОткрытии" попробовать
ЭтотОбъект.Заблокировать();
24 Ayvengo
 
03.04.12
15:06
(23) идея была в том, что бы не нужно было делать это в каждом справочнике, документе. Но в 8.2.15.301 все работает и без вмешательства.
25 GROOVY
 
03.04.12
15:37
Коллеги, вы про оптимистические и пессимистичные блокировки объектов? Во всех версиях 8.2 по дефолту работает оптимистичная.

Из ИТС: Для объектов обеспечивается оптимистическая блокировка. То есть объект не может быть записан, если он был изменен в базе данных после считывания. Этот механизм обеспечивает логическую целостность изменения объектов. Каждый, кто меняет объект, может быть уверен, что его изменения не "затрут" изменений сделанных другими пользователями (сессиями) или другими объектами в этой же сессии. Такая блокировка не препятствует изменению объекта другими сессиями или этой сессией. Однако если с момента считывания объекта и до попытки его записи объект был изменен в базе данных, то запись не будет выполнена.  

Кроме того, существует механизм пессимистической блокировки, который запрещает изменения другими сессиями или этой сессией, до снятия блокировки этим объектом встроенного языка. Данный механизм необходимо включать в явном виде методом Заблокировать(). В основном он предназначен для блокировки объектов, редактируемых в форме. Расширение формы элемента справочника автоматически включает блокировку, чтобы пользователь был уверен что, начав редактировать объект, он сможет его записать.
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший