Как заблокировать объект документа чтобы его не могли менять другие пользователи #533758


#0 by pavlushov
Как программно заблокировать от изменения объект документа, чтобы его никто не смог изменить. То есть по принципу хранилища - захватили объект, изменили объект, поместили изменения (освободили объект).
#1 by Живой Ископаемый
как пробовал, почему не вышло?
#2 by Живой Ископаемый
#3 by Живой Ископаемый
или что имеется в виду? Программно заблокировать ветку метаданных? Так в конфигураторе все равно можно только одному находится
#4 by pavlushov
пробовал Док.ПолучитьОбъект.Заблокировать - но эффекта нет, т.к. открываю этот документ в форме, меняю и провожу. Вот нашел объект БлокировкаДанных, пока не понял, он может заблокировать всю таблицу (все документы) или можно и конкретный докумен забловировать?
#5 by pavlushov
не, мне надо блокировать объект от изменения пользователями, про хранилище это я в качестве примера. Мне надо заблокировать определенный документ, чтобы мог менять только тот кто заблокировал, а другие не могли
#6 by DmitrO
1)Сделать регистр сведений в котором хранить заблокированные документы. 2)Перед записью проверять наличие блокировки по текущему документу в регистре, если есть отказывать в записи. 3)Обеспечить автоматическое снятие блокировок (удаление из РС данных), по таймауту (регламентным заданием на сервере).
#7 by pavlushov
да, думал над этим вариантом
#8 by mikecool
хз, у меня используется Заблокировать перед этим проверять на Заблокирован - если истина, то объект в только просмотр
#9 by Wingless
Заблокирован (IsLocked) блаблабла Следует учитывать, что этот метод используется для проверки блокировки объекта базы данных конкретным объектом встроенного языка. Он не может быть использован для проверки, заблокирован ли вообще объект базы данных, например, другими пользователями. Как-то не согласуется.
#10 by pavlushov
у меня почему то это не работает
#11 by DmitrO
Метод Заблокировать не решает этой задачи.
#12 by pavlushov
Вобще не понятно зачем метод документа Заблокировать, после выполнения кода - Док.ПолучитьОбъект.Заблокировать;, док не блокируется и все тут, т.е. после блокировки проверяю а он нифига не заблокирован
#13 by pavlushov
неужели прийдется городить регистр сведений "ЗаблокированныеДокументы" ?
#14 by asady
Прочитать в транзакции не пробовал?
#15 by DmitrO
Объект БлокировкаДанных тоже не решает этой задачи. В платформе нет штатных средств для ее решения, в любом случае надо писать нечто типа .
#16 by DmitrO
А может документацию почитать на предмет назначения и использования этого метода? Или есть намерение ждать пока кто-нить популярно объяснит?
#17 by DmitrO
Такой код Док.ПолучитьОбъект.Заблокирован всегда будет возвращать Ложь.
#18 by pavlushov
дык почитал но не понял, потому если кто объяснит - буду благодарен, в справке написано Заблокировать - Выполняет блокировку объекта от изменения другими режимами или пользователями. Только на практике как то не воспроизводится, что такое другие режимы - я не знаю, а вот в плане того что объект блокируется для изменения другими пользователями - проверил - не блокируется.
#19 by pavlushov
- ну и нафига тогда такой метод? или он работает только в форме докумена?
#20 by pavlushov
метод Заблокировать - дает ошибку в том случа если у меня документ открыт в форме и объект модифицирован
#21 by Murzz
объект.Заблокировать работает только в пределах видимости переменной "объект". Если хочешь чтоб "заблокированность" длилась и после выхода из процедуры, где блокируешь, можно, нппример, делать "объект" реквизитом обработки/документа, где используешь его. еще можешь глянуть на "заблокироватьДанныеДляРедактирования".
#22 by pavlushov
ЗаблокироватьДанныеДляРедактирования - только для упр. форм
#23 by pavlushov
- то есть если я делаю обработку, в ней реквизит ОбъектДокумента и программно блокирую этот объект, то другой пользователь запустив эту же обработку при попытке заблокировать обломится?
#24 by pavlushov
- да! сработало!
#25 by DmitrO
Смысл метода Заблокировать в следующем. 1.У каждого объекта в базе есть поле Версия (просто число). 2.При каждой записи объекта это число увеличивается в транзакции записи. 3.При чтении объекта из базы его версия тоже читается. 4.А при записи объекта, в транзакции записи всегда проверяется  соответствует ли версия в базе, версии объекта в памяти (ранее прочитанного). Если не соответствует, то происходит исключение. Т.о. платформа проверяет не записал ли какой нить другой пользователь объект в период времени между того момента когда его читали (ПолучитьОбъект) и сейчас, когда его записывают. Если объект уже успел кто-то записать, то вероятно он мог изменить какие-то его реквизиты, и т.о. в памяти сейчас лежит неактуальная его версия, и писать эту версию в базу нельзя. 5.Метод Заблокировать просто увеличивает версию на 1, и записывает это значение в базу (и память своего объекта конечно). Конечно же проверяя перед этим не изменился ли объект в базе уже сейчас, в момент выполнения Заблокировать.
#26 by DmitrO
6.При изменении реквизита связанного с данными объекта в форме (интерактивном редактировании например), метод Заблокировать вызывается неявно.
#27 by pavlushov
то есть в открытой форме документа версия объекта меняется только после изменения любого реквизита документа?
#28 by DmitrO
Ну, наверно, с 6-м пунктом я погорячился, при интерактивном редактировании, просто версия проверяется и если она изменилась пользователю выдается предупреждение, что записать объект он уже не сможет.
#29 by DmitrO
Т.е. после вызова метода Заблокировать вы просто устроите облом тем, кто уже открыл форму документа и редактирует ее, но если тот пользователь закроет форму и откроет ее снова, у него все получится.
#30 by DmitrO
Мне кажется, 4 человека в этой ветке мне должны сказать спасибо.
#31 by pavlushov
СПАСИБО! )))
#32 by pavlushov
Вобщем то в итоге все решается малой кровью. Регистр создавать не надо, просто в обработке, в которой обрабатывается документ (который надо заблокировать) нужно созадть реквизит ДокОбъект (тип: объект документа), при открытии документа в нашей обработке следующий код:    Попытка ...
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С