Top.Mail.Ru

Разрешение конфликтов между пользователями при работе в одних объектах

Иногда возникает потребность заблокировать объект, чтобы во время работы с ним другой пользователь параллельно не смог его изменить. Это бывает необходимо, чтобы при записи не получить ошибку типа «Данные были изменены или удалены другим пользователем».

Запрет редактирования, если объект занят другим пользователем

Рассмотрим на примере документа. Первый пользователь зашел в документ и долго его заполнял. Второй пользователь зашел в этот же документ и заполнил его быстрее, записал. Первый пользователь закончил заполнение, нажимает кнопку «Записать» и у него возникает ошибка. Теперь ему нужно перезаходить в документ и заново заполнить.

Решение: в процедуре ПриСозданииНаСервере формы документа пытаемся заблокировать его, если не получилось, значит устанавливаем для формы ТолькоПросмотр и выводим сообщение, что объект уже занят другим пользователем.

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

В процедуре ПриЗакрытии формы документа делаем разблокировку документа.

РазблокироватьДанныеДляРедактирования(Объект.Ссылка, УникальныйИдентификатор);

Так выглядит окно у пользователя, который начал редактировать документ:

То, что видят другие пользователи:

Программное изменение объектов

Бывают обработчики, которые программно изменяют объекты. Эти объекты также могут редактировать пользователи.

Решение:

  1. Создаем регистр сведений, например ОчередьОбработкиДокументов, с необходимыми измерениями и ресурсами.
  2. В обработчике, вместо изменения объекта, записываем этот документ в регистр сведений ОчередьОбработкиДокументов.
  3. Создаем регламентное задание, которые будет проходиться по регистру сведений ОчередьОбработкиДокументов и изменять документы. Сначала пытаться заблокировать его, если получилось, то выполнить нужную обработку, разблокировать документ, записать обработанные документы в массив, и далее удалить эти документы из регистра ОчередьОбработкиДокументов.
    РезультатЗапроса = Запрос.Выполнить();
	Выборка			 = РезультатЗапроса.Выбрать();
	
	Пока Выборка.Следующий() Цикл  
		
		Попытка
			ЗаблокироватьДанныеДляРедактирования(Выборка.Документ);
			БлокировкаДок = Истина;
		Исключение
			БлокировкаДок = Ложь;
		КонецПопытки;
		
		Если БлокировкаДок Тогда 
			
			ДокОб = Выборка.Документ.ПолучитьОбъект();
			ЗаполнитьДокумент(ДокОб, Выборка);
			ДокОб.Записать();

			РазблокироватьДанныеДляРедактирования(ДокОб.Ссылка);
			ДокументыКУдалениюИзОчереди.Добавить(ДокОб.Ссылка)
			
		КонецЕсли;
		
	КонецЦикла;	
	
	УдалитьДокументыИзОчереди(ДокументыКУдалениюИзОчереди);

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

Comments

So empty here ... leave a comment!

Добавить комментарий

Sidebar