Вход | Регистрация
 

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

Как заблокировать объект документа чтобы его не могли менять другие пользователи
Я
   pavlushov
 
16.02.11 - 11:06
Как программно заблокировать от изменения объект документа, чтобы его никто не смог изменить. То есть по принципу хранилища - захватили объект, изменили объект, поместили изменения (освободили объект).
   Живой Ископаемый
1 - 16.02.11 - 11:06
как пробовал, почему не вышло?
   Живой Ископаемый
2 - 16.02.11 - 11:08
   Живой Ископаемый
3 - 16.02.11 - 11:09
или что имеется в виду? Программно заблокировать ветку метаданных? Так в конфигураторе все равно можно только одному находится
   pavlushov
 
4 - 16.02.11 - 11:10
пробовал Док.ПолучитьОбъект().Заблокировать() - но эффекта нет, т.к. открываю этот документ в форме, меняю и провожу. Вот нашел объект БлокировкаДанных, пока не понял, он может заблокировать всю таблицу (все документы) или можно и конкретный докумен забловировать?
   pavlushov
 
5 - 16.02.11 - 11:16
не, мне надо блокировать объект от изменения пользователями, про хранилище это я в качестве примера. Мне надо заблокировать определенный документ, чтобы мог менять только тот кто заблокировал, а другие не могли
   DmitrO
 
6 - 16.02.11 - 11:16
1)Сделать регистр сведений в котором хранить заблокированные документы.
2)Перед записью проверять наличие блокировки по текущему документу в регистре, если есть отказывать в записи.
3)Обеспечить автоматическое снятие блокировок (удаление из РС данных), по таймауту (регламентным заданием на сервере).
   pavlushov
 
7 - 16.02.11 - 11:22
(6) да, думал над этим вариантом
   mikecool
 
8 - 16.02.11 - 11:24
хз, у меня используется Заблокировать()
перед этим проверять на Заблокирован() - если истина, то объект в только просмотр
   Wingless
 
9 - 16.02.11 - 11:28
(8)
Заблокирован (IsLocked)
блаблабла 

Следует учитывать, что этот метод используется для проверки блокировки объекта базы данных конкретным объектом встроенного языка. Он не может быть использован для проверки, заблокирован ли вообще объект базы данных, например, другими пользователями.

Как-то не согласуется.
   pavlushov
 
10 - 16.02.11 - 11:54
(8) у меня почему то это не работает
   DmitrO
 
11 - 16.02.11 - 12:28
Метод Заблокировать() не решает этой задачи.
   pavlushov
 
12 - 16.02.11 - 12:29
Вобще не понятно зачем метод документа Заблокировать(), после выполнения кода - Док.ПолучитьОбъект().Заблокировать();, док не блокируется и все тут, т.е. после блокировки проверяю 
    Если Док.ПолучитьОбъект().Заблокирован() Тогда
        Предупреждение("Заблокирован");
    КонецЕсли;
а он нифига не заблокирован
   pavlushov
 
13 - 16.02.11 - 12:30
(11) неужели прийдется городить регистр сведений "ЗаблокированныеДокументы" ?
   asady
 
14 - 16.02.11 - 12:30
Прочитать в транзакции не пробовал?
   DmitrO
 
15 - 16.02.11 - 12:32
Объект БлокировкаДанных тоже не решает этой задачи.
В платформе нет штатных средств для ее решения, в любом случае надо писать нечто типа (6).
   DmitrO
 
16 - 16.02.11 - 12:34
(12)А может документацию почитать на предмет назначения и использования этого метода?
Или есть намерение ждать пока кто-нить популярно объяснит?
   DmitrO
 
17 - 16.02.11 - 12:37
Такой код Док.ПолучитьОбъект().Заблокирован() всегда будет возвращать Ложь.
   pavlushov
 
18 - 16.02.11 - 12:37
дык почитал но не понял, потому если кто объяснит - буду благодарен, в справке написано Заблокировать() - Выполняет блокировку объекта от изменения другими режимами или пользователями.
Только на практике как то не воспроизводится, что такое другие режимы - я не знаю, а вот в плане того что объект блокируется для изменения другими пользователями - проверил - не блокируется.
   pavlushov
 
19 - 16.02.11 - 12:38
(17) - ну и нафига тогда такой метод? или он работает только в форме докумена?
   pavlushov
 
20 - 16.02.11 - 12:42
метод Заблокировать() - дает ошибку в том случа если у меня документ открыт в форме и объект модифицирован
   Murzz
 
21 - 16.02.11 - 12:44
объект.Заблокировать() работает только в пределах видимости переменной "объект". Если хочешь чтоб "заблокированность" длилась и после выхода из процедуры, где блокируешь, можно, нппример, делать "объект" реквизитом обработки/документа, где используешь его. еще можешь глянуть на "заблокироватьДанныеДляРедактирования()".
   pavlushov
 
22 - 16.02.11 - 12:45
(21) ЗаблокироватьДанныеДляРедактирования() - только для упр. форм
   pavlushov
 
23 - 16.02.11 - 12:47
(21) - то есть если я делаю обработку, в ней реквизит ОбъектДокумента и программно блокирую этот объект, то другой пользователь запустив эту же обработку при попытке заблокировать обломится?
   pavlushov
 
24 - 16.02.11 - 12:50
(21) - да! сработало!
   DmitrO
 
25 - 16.02.11 - 12:51
Смысл метода Заблокировать() в следующем.
1.У каждого объекта в базе есть поле Версия (просто число).
2.При каждой записи объекта это число увеличивается в транзакции записи.
3.При чтении объекта из базы его версия тоже читается.
4.А при записи объекта, в транзакции записи всегда проверяется  соответствует ли версия в базе, версии объекта в памяти (ранее прочитанного). Если не соответствует, то происходит исключение. Т.о. платформа проверяет не записал ли какой нить другой пользователь объект в период времени между того момента когда его читали (ПолучитьОбъект) и сейчас, когда его записывают. Если объект уже успел кто-то записать, то вероятно он мог изменить какие-то его реквизиты, и т.о. в памяти сейчас лежит неактуальная его версия, и писать эту версию в базу нельзя.
5.Метод Заблокировать() просто увеличивает версию на 1, и записывает это значение в базу (и память своего объекта конечно). Конечно же проверяя перед этим не изменился ли объект в базе уже сейчас, в момент выполнения Заблокировать().
   DmitrO
 
26 - 16.02.11 - 12:53
6.При изменении реквизита связанного с данными объекта в форме (интерактивном редактировании например), метод Заблокировать() вызывается неявно.
   pavlushov
 
27 - 16.02.11 - 13:03
(26) то есть в открытой форме документа версия объекта меняется только после изменения любого реквизита документа?
   DmitrO
 
28 - 16.02.11 - 13:04
Ну, наверно, с 6-м пунктом я погорячился, при интерактивном редактировании, просто версия проверяется и если она изменилась пользователю выдается предупреждение, что записать объект он уже не сможет.
   DmitrO
 
29 - 16.02.11 - 13:08
Т.е. после вызова метода Заблокировать вы просто устроите облом тем, кто уже открыл форму документа и редактирует ее, но если тот пользователь закроет форму и откроет ее снова, у него все получится.
   DmitrO
 
30 - 16.02.11 - 13:24
Мне кажется, 4 человека в этой ветке мне должны сказать спасибо.
 
 Рекламное место пустует
   pavlushov
 
31 - 16.02.11 - 13:37
(30) СПАСИБО! )))
   pavlushov
 
32 - 16.02.11 - 14:01
Вобщем то в итоге все решается малой кровью. Регистр создавать не надо, просто в обработке, в которой обрабатывается документ (который надо заблокировать) нужно созадть реквизит ДокОбъект (тип: объект документа), при открытии документа в нашей обработке следующий код:
    Попытка
        ЗаказПокупателя.Заблокировать();
   Исключение
...


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Ветка сдана в архив. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.