Открытие несколькими пользователями одного документа

1. olgita_n 11.04.14 10:33 Сейчас в теме
Здравствуйте! Столкнулась с такой проблемой: Если несколько пользователей открывают один документ, то выходят след. ошибки:
1) Данные были изменены или удалены другим пользователем (при записи)
2) Ошибка блокировки объекта

как избежать этих ошибок? я хочу сделать так, что кто первый зашел в данный документ, тот мог его изменять, а все остальные, пока он работает, могли только просматривать. Подскажите, как это можно сделать и правильно ли я решила избежать данных ошибок?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. AllexSoft 11.04.14 10:37 Сейчас в теме
(1) nesterovaolgita@rambler.ru, проблема такая есть, платформой она не решается... нужно что то думать как программно реализовать подобное.
3. olgita_n 11.04.14 10:40 Сейчас в теме
(2) AllexSoft, а можно ли программно прописать, чтобы при открытии документа, проверялось открыт он уже или нет, и если уже открыт, то нельзя было другим пользователям его открыть?
4. AllexSoft 11.04.14 10:44 Сейчас в теме
(3) nesterovaolgita@rambler.ru, был точно такой же вопрос тут как то уже, там даже какие то решения народ подсказывал. Насколько я понимаю открыла или нет документ проверить нельзя, можно попробовать проверить заблокирован ли он кем то, если заблокирован - значит открыт
5. olgita_n 11.04.14 10:48 Сейчас в теме
(4) AllexSoft, спасибо, буду пробовать)
6. mymyka 11.04.14 12:29 Сейчас в теме
(5)При открытии делаете
Попытка
   ЭтотОбъект.Заблокировать();
Исключение
   Сообщить("Документ редактируется другим пользователем");
   ЭтаФорма.ТолькоПросмотр = Истина;
КонецПопытки;


и не забудьте разблокировать при закрытии.
Socradt; olgita_n; AllexSoft; +3 Ответить
7. olgita_n 11.04.14 13:28 Сейчас в теме
(6) mymyka, делаю при открытии:
Попытка
ЭтаФорма.ЗаблокироватьДанныеДляРедактирования(Объект.Ссылка);
Исключение
Сообщить("Документ редактируется другим пользователем");
ЭтаФорма.ТолькоПросмотр = Истина;
КонецПопытки;

&НаКлиенте
Процедура ПриЗакрытии()
ЭтаФорма.РазблокироватьДанныеФормыДляРедактирования();
КонецПроцедуры

почему при первом же вхождении в документ, он выдает исключение?
8. mymyka 11.04.14 13:52 Сейчас в теме
(7)Потому что блокируются данные объекта, а не форма. К тому же
ЗаблокироватьДанныеДляРедактирования имеет несколько иной синтаксис.
9. olgita_n 11.04.14 14:06 Сейчас в теме
(8) mymyka, у меня управляемая форма и в процедуре при открытии если написать ЭтотОбъект.Заблокировать(); выдает ошибку.
а если если на сервере обращаюсь к методу заблокировать он блокирует и первое вхождение в документ и последующие
10. mymyka 11.04.14 14:30 Сейчас в теме
(9)Надо было сразу уточнять, что управляемые формы.
Тогда в процедуре ПриСозданииНаСервере() делаете
Попытка
		ЗаблокироватьДанныеДляРедактирования(Объект.Ссылка,,ЭтаФорма.УникальныйИдентификатор);
	Исключение
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Документ редактируется другим пользователем");
		ЭтаФорма.ТолькоПросмотр = Истина;
	КонецПопытки;

При закрытии формы блокировка автоматически снимется.
VAAngelov; Ekovichev; LexmanR; mazin2000; scape; Socradt; solary; infostart user; olgita_n; +9 Ответить
11. olgita_n 11.04.14 14:51 Сейчас в теме
(10) mymyka, спасибо) все получилось)
12. mymyka 11.04.14 14:57 Сейчас в теме
(11)На будущее, пишите в профильной ветке 1С8.*. Не замусоривается форум, да и Sm капают, тоже приятно )
AllexSoft; +1 Ответить
13. olgita_n 11.04.14 15:22 Сейчас в теме
(12) mymyka, спасибо, за совет. буду знать)
14. olgita_n 30.04.14 13:45 Сейчас в теме
(10) mymyka, а как узнать кто из пользователей заблокировал документ?
15. solary 186 18.08.16 11:16 Сейчас в теме
(14) nesterovaolgita@rambler.ru,
Попытка
		ЗаблокироватьДанныеДляРедактирования(Объект.Ссылка,, ЭтаФорма.УникальныйИдентификатор);
	Исключение
		Ошибка = ОписаниеОшибки();
		ОбрезанаОшибка = Сред(Ошибка, Найти(Ошибка, "сеанс:")+6);
		НомерСеанса = Число(Сред(ОбрезанаОшибка, 0 , Найти(ОбрезанаОшибка,", начат:")-1));
		АктивныеСеансы = ПолучитьСеансыИнформационнойБазы();
		ИмяПользователяЗаблокировавшегоДок = "";
		Для Каждого Элемент Из АктивныеСеансы Цикл
			Если Элемент.НомерСеанса = НомерСеанса Тогда
				ИмяПользователяЗаблокировавшегоДок = Элемент.Пользователь.ПолноеИмя;
				Прервать;
			КонецЕсли;
		КонецЦикла;
		Сообщить("Объект заблокирован пользователем: " + ИмяПользователяЗаблокировавшегоДок + "" + Сред(ОбрезанаОшибка, Найти(ОбрезанаОшибка,", начат:")));

		ЭтаФорма.ТолькоПросмотр = Истина;
	КонецПопытки;
Показать
OlgaOnuchina; Egovigor; OslikIA; sizeoff; ЧерныйКот; scape; x_proof; +7 Ответить
16. scape 282 14.02.17 09:07 Сейчас в теме
(10) Цитата:
ЗаблокироватьДанныеФормыДляРедактирования), то при закрытии формы блокировка может быть отменена не сразу, а через некоторое время. Блокировка может быть снята:
автоматически при закрытии формы или завершении сеанса;
с помощью метода глобального контекста РазблокироватьДанныеДляРедактирования с указанием того же идентификатора формы, который указывался для установки блокировки. В этом случае блокировка снимается сразу.

С эти я и столкнулся - блокировка снимается не сразу.
Лучше при закрытии использовать метод РазблокироватьДанныеДляРедактирования
OlgaOnuchina; Egovigor; VAAngelov; SG7R; join2us; +5 Ответить
17. EvgeniuXP 12.05.22 18:31 Сейчас в теме
(16) при закрытии серверный вызов нельзя вызывать.
18. VAAngelov 366 29.05.23 16:03 Сейчас в теме
(17)Ничего не мешает с клиента вызвать сервер, на сервер Разблокировать и вернуться обратно на клиента.
19. odn 29.05.23 17:02 Сейчас в теме
(1) Решал на обычных формах такую проблему следующим образом:
Создал отдельный регистр

1. В регистр при входе в документ писал кто в него зашел и когда
2. Для второго пользователь при входе в док, проверялся регистр и документ открывался уже в режиме просмотра с предупреждением кто конкретно редактирует док и когда в него зашел.
3. Ночью регистр очищал (или по таймеру если в доке сидит больше 1 часа / 2 часов) то из регистра запись удалялась.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот