|
Заблокировать данные от изменения, чтобы д-том мог заниматься только один сотрудник | ☑ | ||
---|---|---|---|---|
0
synapce
20.01.22
✎
13:38
|
Всем привет!
1с 8.3 бп 3.0 Синтакс-помощник говорит о том, чтобы использовать след. методы: ДокументОбъект.Заблокировать(); ДокументОбъект.Разблокировать(); ДокументОбъект.Заблокирован() - это на проверку. Идея такова, чтобы при открытии - проверять - если не заблокировать - то блокировать документ пользователем, чтобы никто другой в него не заглянул. А в "При закрытии" - разблокировать. При открытии дока мне выдаются лишь ошибки - Метод объекта не обнаружен (Заблокировать) и тд Что помогло в какой-т степени - это использование ЗаблокироватьДанныеФормыДляРедактирования(). Но работает он следующим образом - второй пользователь в этом же сеансе заходит в док, открытый другим пользователем и конфа вылетает) Подскажите, как правильно было бы использовать данные методы, что вначале? Нахожусь в модуле формы документа. Всем заранее огромное спасибо за ответы! |
|||
1
fisher
20.01.22
✎
13:41
|
Какая проблема решается?
Когда один из сотрудников начинает редактировать документ, для остальных он заблокируется автоматически. То есть когда любой другой сотрудник тоже начнет редактирование этого же документа - платформа выдаст вменяемое сообщение что документ уже редактируется сотрудником таким-то. Ну а если тот уже отредактировал и вышел - будет менее вменяемое сообщение о расхождении версии документа с версией в БД. |
|||
2
synapce
20.01.22
✎
13:46
|
(1) В данном ключе - два человека заходят в один документ, первый начал его редактировать. Второй начинает - тому выскакивает уведомление - "начать редактировать д-т?" И теперь второй редачит, а то, что первый не внес - не сохранится. Мне же нужно, чтобы первый человек зашел в д-т и второму он бы стал доступен, к примеру, только для чтения, не более, либо же совсем недоступен (Предупреждение, что д-т редактируется таким-то лицом). Как только первый выходит - пожалуйста, может заходить второй и вносить свои изменения.
|
|||
3
acht
20.01.22
✎
13:48
|
(0) "второй пользователь в этом же сеансе заходит в док, открытый другим пользователем"
Это как? |
|||
4
synapce
20.01.22
✎
13:50
|
(3) Представим один сеанс - рабочая база. В нем работают два пользователя.Первый открывает док - начинает редактировать его. Второй тоже заходит в этот же док, чтобы внести свои данные. По факту - сохранятся данные только последние внесенные. Чтобы такого не было - хочу поставить блокировку - чтобы вот зашел первый пользователь - всё, д-т теперь недоступен ни для кого. Он его записал - вышел из дока - пожалуйста, может теперь второй заходить.
|
|||
5
DrShad
20.01.22
✎
13:52
|
это два разных сеанса
|
|||
6
DrShad
20.01.22
✎
13:52
|
не последние а первые
|
|||
7
DrShad
20.01.22
✎
13:53
|
да и что ж это за документ такой, что его нужно всей фирмой заполнять?
|
|||
8
synapce
20.01.22
✎
13:57
|
(7) Вот, есть такой. Как с помощью тех методов, можно подобное реализовать?
|
|||
9
fisher
20.01.22
✎
13:59
|
(2) Описываемое вами желаемое поведение - и есть дефолтное поведение платформы, не требующее доп-усилий. Достичь одновременного редактирования двумя пользователями можно только внося изменения в поля формы, не связанные с данными БД и не отмечая при этом изменения как влияющие на данные документа.
|
|||
10
DrShad
20.01.22
✎
13:59
|
а может ты неправильное направление выбрал?
|
|||
11
synapce
20.01.22
✎
14:05
|
(9) мне бы наоборот, не достичь одновременного редактирования) В данном ключе - дефолтное поведение платформы - это "Пользователь Name1 начал редактировать данные. Хотите начать редактирование?" И человек начинает редактирование, при условии, что у первого теперь изменения не сохранятся.
Желательно, что когда первый человек начал редачить, у второго - при открытии просто выскакивала бы надпись, типа "Документ заблокирован пользователем" и всё. А когда первый выйдет из дока - второй мог бы начать редактировать. |
|||
12
synapce
20.01.22
✎
14:06
|
(10) Не, направление как раз верное - отрубить возможность доступа к документу второму пользователю, если док уже открыт первым пользователем.
Как бы этого добиться, подскажи плз? |
|||
13
fisher
20.01.22
✎
14:08
|
(11) Еще раз. Дефолтное поведение: первый человек начинает редактировать. Второму даст открыть форму. Но не даст начать редактировать, когда он попытается это сделать.
Если у вас не так - значит это либо ошибка разработчика при разработке формы, либо специально реализованное поведение. |
|||
14
PLUT
20.01.22
✎
14:12
|
(13) по дефолту второй тоже сможет редактировать, а вот кто первый запишет - тот и папа, а кому не повезло - вылезет "ашипка" : «Данные были изменены или удалены другим пользователем»
|
|||
15
synapce
20.01.22
✎
14:14
|
(14) Да, об этом и говорю. Вылезет лишь предупреждение второму - тот нажмет на кнопку "начать редактирование" и первый попросту не сможет записать изменения. Второй и станет - папой, т.к. обрубил первому возможность редачить.
Подскажи плз, как этими обработчиками можно обрубить доступ второму? |
|||
16
DrShad
20.01.22
✎
14:15
|
ты только никому не говори что за документ такой )))
|
|||
17
fisher
20.01.22
✎
14:16
|
(14) Что ж ты творишь, вредитель. Все, я умываю руки.
|
|||
18
CaptanG
20.01.22
✎
14:17
|
Модифицированность() не поможет в данном случае?
я так понял что пока первый юзер менял док второй уже поменял? |
|||
19
DrShad
20.01.22
✎
14:20
|
(18) у них разные объекты
|
|||
20
synapce
20.01.22
✎
14:21
|
(18) Да-да, всё так. Первый начал менять док, подрубился в этот же док второй пользователь и не дает ему это сделать(записать) Возмущается первый, естественно, просит, чтобы на время его присутствия в доке, чтобы никого не было)
|
|||
21
DrShad
20.01.22
✎
14:23
|
(20) да мы уже поняли, хватит подтверждать все время
а вот решений у задачи может быть множество, но для выбора оптимального данных 0 |
|||
22
synapce
20.01.22
✎
14:26
|
(21) человек спросил, я уточнил)
____ Просто как и написал вначале Идея такова, чтобы при открытии - проверять - если не заблокировать - то блокировать документ пользователем, чтобы никто другой в него не заглянул. А в "При закрытии" - разблокировать. При открытии дока мне выдаются лишь ошибки - Метод объекта не обнаружен (Заблокировать) и тд Мб как-то иначе стоит обращаться к объекту в этом случае? |
|||
23
DrShad
20.01.22
✎
14:29
|
еу вообще-то он доступен только на сервере
|
|||
24
CaptanG
20.01.22
✎
14:30
|
(22) Заблокировать() на клиенте не доступен вроде
|
|||
25
synapce
20.01.22
✎
14:32
|
(23) да, точно, увидел, что при открытии-то у нас на клиенте выполняется) тут сорри, но пробовал и "При создании на Сервере" - одно и то же
|
|||
26
fisher
20.01.22
✎
14:32
|
ОХРЕНЕТЬ!!!
В 15 релизе действительно поменяли дефолтное поведение пессимистических объектных блокировок и теперь пользователь может перехерить чужие изменения! НАХРЕНА??? |
|||
27
synapce
20.01.22
✎
14:34
|
(26) т.е. до 15го релиза все было так, как я хочу сейчас сделать? :D
|
|||
28
fisher
20.01.22
✎
14:36
|
(27) Да.
Попробуй ЗаблокироватьДанныеДляРедактирования() с указанием идентификатора формы. |
|||
29
vicof
20.01.22
✎
14:36
|
(27) Срочно откатывай платформу
|
|||
30
fisher
20.01.22
✎
14:36
|
До 15 релиза у пользователя не было возможности начать параллельное редактирование. А с 15 релиза он может его форсировать.
|
|||
31
Смотрящий
20.01.22
✎
14:37
|
Нормаль но ж кактус жрали 6 оелизов
Чо вы начинаете то |
|||
32
fisher
20.01.22
✎
14:37
|
При этом если подключена система взаимодействия, то он при этом может послать "Извини, чувак" :)
|
|||
33
synapce
20.01.22
✎
14:38
|
(28) Грубо говоря - ЗаблокироватьДанныеДляРедактирования(ЭтаФорма), как-то так?
|
|||
34
fisher
20.01.22
✎
14:42
|
(33) Мягко говоря - СП нужно не лениться открывать.
ЗаблокироватьДанныеДляРедактирования(Ссылка, , УникальныйИдентификатор) |
|||
35
fisher
20.01.22
✎
14:44
|
Честно говоря, у меня просто нет слов. Я в шоке и хочется писать капсом. И при этом какое говорите сообщение пользователю выдается - "Начать редактировать документ"? Да конечно же начать, какие вопросы!!!
УБЛЮДКИ!!! |
|||
36
vicof
20.01.22
✎
14:45
|
(35) Валерьяночки?)
|
|||
37
Ryzeman
20.01.22
✎
14:46
|
(0) >Метод объекта не обнаружен (Заблокировать)
Наверняка пытаешься заблокировать форму на клиенте на УФ... &НаСервере ДокументОбъект = РеквизитФормыВЗначение("Объект"); ДокументОбъект.Заблокировать(); |
|||
38
fisher
20.01.22
✎
14:47
|
"Не, шампанским этот вкус не перебьешь" (с)
|
|||
39
DrShad
20.01.22
✎
14:48
|
(38) ))))
|
|||
40
fisher
20.01.22
✎
14:48
|
С Заблокировать() точно не взлетит. Оно для блокирования объекта, а его время жизни не совпадает с временем жизни УФ.
|
|||
41
ИС-2
naïve
20.01.22
✎
14:48
|
(0) только у этих методов есть проблема - если сеанс зависнет, то чтобы снять блокировку надо сервер перезапускать. По крайней мере раньше так было
|
|||
42
synapce
20.01.22
✎
14:50
|
(41) о как. А есть какие-то идеи на этот случай?)
|
|||
43
DrShad
20.01.22
✎
14:50
|
(42) множество, но ты упорно скрываешь подробности
|
|||
44
fisher
20.01.22
✎
14:52
|
(41)
ЗаблокироватьДанныеДляРедактирования() с указанием идентификатора формы ‑ в этом случае блокировка устанавливается на время жизни форм. При закрытии формы блокировка будет снята сразу, если используется обычное соединение или по прошествии некоторого времени, если используется медленное соединение. Во всех следующих случаях блокировка будет снята сразу: ● Завершен сеанс, в котором открыта форма. ● Прошла 1 минута после сброса признака модифицированности формы. ● За время отображения формы были установлены другие блокировки от имени этой формы (при интерактивном редактировании или методом ЗаблокироватьДанныеФормыДляРедактирования()). ● Закрывается форма, от имени которой были запущены и не завершены фоновые задания (поиск в динамическом списке или формирование отчета). ● Использован метод глобального контекста РазблокироватьДанныеДляРедактирования() с указанием того же идентификатора формы, который указывался для установки блокировки. |
|||
45
DrShad
20.01.22
✎
14:54
|
(44) там еще есть при возврате управления с сервера )))
|
|||
46
Мимохожий Однако
20.01.22
✎
14:55
|
(0) Конфигурация типовая? Если типовая, то какой документ? Какая платформа?
|
|||
47
fisher
20.01.22
✎
14:58
|
(45) Это если без привязки к форме.
|
|||
48
Мимохожий Однако
20.01.22
✎
14:59
|
Можно добавить расширение, которое в случае обнаружения первого пользователя закрывает форму второго. Это самое простое.
|
|||
49
fisher
20.01.22
✎
15:00
|
Только надо через Попытку делать. Потому что если уже заблокировано, то вылетит исключение.
И мне теперь интересно - может пользователь и эту блокировку может форсировать? :) |
|||
50
fisher
20.01.22
✎
15:02
|
Хотя это без разницы.
Если ПриСозданииНаСервере сразу проверяться и либо блокироваться либо посылать в сад - то будет как в семерке. И то если отдельный режим открытия для просмотра прикрутить. Дожились... Пилить конфу, чтобы хотя бы не хуже чем в 7.7 сделать. |
|||
51
synapce
20.01.22
✎
15:02
|
(40) (37) (39) Ребят, спасибо огромное. Реально, проблема чет нависла, хотя раньше, скорее неактуально было.
Щас попробовал, заработало) Оно попросту не пускает в форму второго, если первый редачит) (44) Единственное, я сделал "При закрытии" на сервере- "Разблокировать" и метода не обнаружено - скорее, потому что вызывается на клиенте, мб? Как только закрываю форму - второй пользователь может зайти и как только второй зашел - первый также не может зайти, т.к. доступ заблочен. Через попытку - чтобы пользователю выдать сообщение допом о блокировке объекта и тд? |
|||
52
fisher
20.01.22
✎
15:05
|
(51) > Через попытку - чтобы пользователю выдать сообщение допом о блокировке объекта и тд?
Ну да. Хотя если родное описание ошибки выглядит читабельно, то можно и не "пытаться". |
|||
53
synapce
20.01.22
✎
15:06
|
(52) В принципе, вполне читаемо)
Еще раз огромное спасибо! Всем огромное спасибо) |
|||
54
Ryzeman
20.01.22
✎
15:06
|
(52) ох я не так давно делал этот изврат. Если найду могу даже поделиться...
|
|||
55
fisher
20.01.22
✎
15:07
|
Вангую что в новых типовых появятся новые режимы блокировки а со временем и в платформе дефолты назад откатят (как уже с ЖР было).
|
|||
56
synapce
20.01.22
✎
15:08
|
(54) было бы здорово
|
|||
57
fisher
20.01.22
✎
15:08
|
Добавят переключатель режимов блокировки на уровне базы и сделают умное лицо.
|
|||
58
Ryzeman
20.01.22
✎
15:18
|
(56) Хотя не, писал давно и довольно коряво)
Исключение ОписаниеОшибкиТекст = ОписаниеОшибки(); Сообщение = "Не удалось распечатать документ "+Строка(ТекДок); Сообщение = Сообщение + Символы.ПС + "Документ открыт и редактируется другим пользователем"; Если СтрНайти(ОписаниеОшибкиТекст, "Объект уже заблокирован") > 0 Тогда СтрокаЗамены = Прав(ОписаниеОшибкиТекст, (СтрДлина(ОписаниеОшибкиТекст) - СтрНайти(ОписаниеОшибкиТекст,"компьютер:") + 1)); Сообщение = СтрЗаменить(Сообщение, "другим пользователем", СтрокаЗамены); КонецЕсли; ОбщегоНазначения.СообщитьПользователю(Сообщение); Возврат Неопределено; КонецПопытки; |
|||
59
fisher
20.01.22
✎
15:26
|
Вот спасибо! Как же давно все дружно об этом просили! Простите, никак успокоиться не могу:
Версия 8.3.15 В клиентском приложении (тонкий, толстый и веб-клиент) реализована возможность снимать объектную блокировку, установленную другим пользователем или этим же пользователем, но в другом сеансе. Если бы на права это завязали и с детальным информированием - была бы крутая опция. А так можно друг у друга переоткрывать документ и херить изменения друг-друга, не давая друг-другу работать. Смешная третья опция. |
|||
60
Ryzeman
20.01.22
✎
15:28
|
(59) я давно это не проверял, но разве не только под полными правами это можно делать? Или наоборот только админы сейчас блокируют для не-админов... Не помню.
|
|||
61
fisher
20.01.22
✎
15:34
|
(60) В документации это описано как изменение в базовом механизме платформы без завязки на права.
Но при этом в файловой версии такое поведение только при доступной системе взаимодействий. Если СВ недоступна - то форсировать изменения не даст (если верить доке). А в клиент-сервере в любом случае даст форсировать. Только если доступна СВ - можно передать привет при этом. Очень консистентно. |
|||
62
PLUT
20.01.22
✎
15:38
|
(26) длина тормозного пути составила 3 года?
|
|||
63
Serg_1960
20.01.22
✎
15:45
|
(61) Позднее зажигание? Если запасы валерьянки закончатся - установите режим совместимости ниже 8.3.15 :)
|
|||
64
ДенисЧ
20.01.22
✎
15:48
|
(63) В базе в совместимости .14 работают асинхи...
|
|||
65
Serg_1960
20.01.22
✎
15:54
|
ЗУП 3.1, платформа 8.3.18: "Документ не редактируется по причине: Неизвестная причина блокировки"; Сообщение: "Ошибка блокировки объекта. Объект уже заблокирован:..."
Вы спросите "Как вам это удалось?" Сам не знаю. Поведение платформы и типовой конфигурации не изменилось в плане блокировки объекта. |
|||
66
pechkin
20.01.22
✎
16:05
|
Блокировка в попытке.
В исключении только просмотр и текст кто заблокировал |
|||
67
fisher
20.01.22
✎
16:41
|
(62) Ага. Потерял нюх и бодрость, так сказать.
|
|||
68
fisher
20.01.22
✎
16:42
|
(65) Файловая?
|
|||
69
Фрэнки
20.01.22
✎
16:44
|
я так смотрю, что реально всем пофиг на задачу ТС
проблема ведь не в постановке блокировки, а привязки возможности интерактивно изменять документ всем пользователям, кроме автора или ответственного, кто первым записал документ. |
|||
70
fisher
20.01.22
✎
16:46
|
(62) Забыл извиниться за (17). Ты был прав, а я нет.
(69) Это уже твоя задача, а не ТС. ТС свою решил. |
|||
71
Мимохожий Однако
20.01.22
✎
17:07
|
(69) Делал как-то простую привязку к автору документа. Если текущий пользователь не сохранял документ, то для него всегда в режиме просмотра. )
|
|||
72
pechkin
20.01.22
✎
17:09
|
(69) совместное редактирование делается совсем не так. Это нужно вместо строк делать регистр или подчиненный справочник
|
|||
73
Serg_1960
20.01.22
✎
17:13
|
(68) Sorry, отвлекли работой :) В типовой конфигурации, управляемым формам программно добавляется фиксированный массив ПараметрыБлокировкиИзмененияОбъекта. Туда пишутся все блокировки объекта (по правам, по дате запрета и т.д.) с параметрами:
Функция ОписаниеБлокировкиИзмененияОбъекта(Идентификатор, Описание, ДопустимоОтключать, ПояснениеОтказаОтключения = "") Экспорт БлокировкаИзмененияОбъекта = Новый Структура; БлокировкаИзмененияОбъекта.Вставить("Идентификатор", Идентификатор); БлокировкаИзмененияОбъекта.Вставить("Описание", Описание); БлокировкаИзмененияОбъекта.Вставить("ДопустимоОтключать", ДопустимоОтключать); БлокировкаИзмененияОбъекта.Вставить("ПояснениеОтказаОтключения", ПояснениеОтказаОтключения); БлокировкаИзмененияОбъекта.Вставить("УстановитьБлокировку", Истина); Возврат БлокировкаИзмененияОбъекта; КонецФункции |
|||
74
fisher
20.01.22
✎
17:20
|
(73) То есть я был прав и в типовые уже завезли нужные костыли. Ждем сбычи второй части предсказаний.
|
|||
75
fisher
20.01.22
✎
17:22
|
Хотя нет. Вторая часть не сбудется. Раз ужесточение запретов они спустили на уровень типовых а на уровне платформы оставили более "лояльное" поведение, то никуда это уже не сдвинется.
|
|||
76
Serg_1960
20.01.22
✎
17:25
|
(74) Нет, это не "костыли" - это из-за расширение функционала. Например, в ЗУПе ведение электронных трудовых книжек: документ блокируется, если его данные уже передали в ФСС. Сам понимаешь, что это чисто программная блокировка в конфигурации.
|
|||
77
fisher
20.01.22
✎
17:28
|
(76) Тогда я так и не понял. Пересекается это с сабжем или нет. Если нет - то зачем ты это притащил? А если да - то в чем я неправ?
|
|||
78
Serg_1960
20.01.22
✎
17:42
|
(77) Да, пересекается. Там "платформенные" блокировка проходит под грифом "Неизвестная причина блокировки", в отличие от программных блокировок, объявленных конфигурацией.
|
|||
79
fisher
20.01.22
✎
18:34
|
(78) И при этом правами/настройками можно запретить параллельное редактирование? Ну вот этот момент я и называю костылем. В том смысле что новое поведение платформы хуже подходит для типовых ситуаций, зато на уровне конфы позволяет реализовать более гибкое поведение. Как минимум - это очень неоднозначное решение. Потому что дефолтное поведение платформы ПРИДЕТСЯ переопределять в каждой продакшн-конфе. И малоинвазивным это переопределение тоже не назовешь.
|
|||
80
Serg_1960
20.01.22
✎
21:08
|
(79) Sorry, я не считаю это проблемой, пока "дефолтным поведением платформы" можно управлять через свойство конфигурации "Режим управления блокировкой данных" и аналогичными свойствами в её объектах.
|
|||
81
fisher
21.01.22
✎
12:13
|
(80) Вероятно, мы друг друга не понимаем. Блокировки БД, как управляемые так и автоматические, не имеют никакого отношения к механизмам объектных блокировок, которые обсуждаются в этой ветке.
|
|||
82
NuclearWinter
21.01.22
✎
14:06
|
Вопрос весьма актуален, т.к. пользователи не читают сообщения.
Почему это поведение не настраивается на уровне ролей - загадка. |
|||
83
Фрэнки
21.01.22
✎
14:19
|
некий вопрос актуален
ну и что дальше? Мне, к примеру, даже не совсем ясно, нужно ли эту проблему решать через блокировки, т.к. часто речь идет просто о том, что юзеры просто лезут в чужие доки, в которые они лезть просто не должны. Т.е. не интерактивная блоркировка, когда форма открыта в разных сеансах, а просто нельзя редактировать "чужой" документ. |
|||
84
Фрэнки
21.01.22
✎
14:21
|
т.е. при постановке задачи топикстартеру просто не сумели объяснить или он не понял источника проблемы.
|
|||
85
fisher
21.01.22
✎
14:39
|
(83)(84) Да какая разница. Нормальные ситуации когда два пользователя имеют право редактировать один и тот же документ - существуют. И никак их не исключить. Иначе вообще нафиг не нужны были бы эти объектные блокировки.
|
|||
86
Гений 1С
гуру
21.01.22
✎
14:42
|
(4) регистр сведений сделай ЗанятыеДокументы, ггг
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |