Получение объекта справочника и блокировки

1. just666 14.02.18 14:31 Сейчас в теме
Коллеги, может кто-то что-то дельное подскажет.

Имеем внешние серверные подключения к 1с, база на SQL.
Подключаются одновременно несколько пользователей, в примере рассматриваем например 2 пользователя и выполняют действие одновременно.

Код в модуле следующий их ожидает:

Получили = Ложь;
	ТекущееВремя = ТекущаяДата();
         Пока Не Получили и (ТекущееВремя+10)>ТекущаяДата() Цикл
		Попытка
			Об=СсылкаНаДок.ПолучитьОбъект();
                        Если НЕ Об.Заблокирован() тогда
			       Об.Заблокировать();
                        КонецЕсли;
			Получили = Истина;
		Исключение
		КонецПопытки;
	КонецЦикла;
	
	Если об = неопределено тогда
		ВызватьИсключениеВС("Не нашли документ");
		Возврат Ложь;
	КонецЕсли;
Показать



Далее выполняются некоторые действия и следующий код

Записали = Ложь;
	ТекущееВремя = ТекущаяДата();
	Пока Не Записали и (ТекущееВремя+10)>ТекущаяДата() Цикл
		Попытка
			Об.Записать();
			Если Об.Заблокирован() тогда
				Об.Разблокировать();
			КонецЕсли;	
			Записали = Истина;
		Исключение
		КонецПопытки;
	КонецЦикла;

Показать


При одновременном выполнении обычно один пользователь выполняет действия, а второй не может, хотя времени хватает, второй пользователь падает в ошибку ("Не нашли документ") а по сути отрабатывает исключения по блокировке ("Операция не может быть выполнена из-за несоответсвия версии или отсутствия записи базы данных...")


Вопрос почему это происходит если каждый раз в коде в цикле мы получаем новый объект Об=СсылкаНаДок.ПолучитьОбъект(); т.е. объект должен актуальный возвращаться....
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Plotks2017 268 14.02.18 15:14 Сейчас в теме
Странный код.
Пока Не Получили и (ТекущееВремя+10)>ТекущаяДата() Цикл 

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

Такой код подразумевает, что объект не захвачен, зачем несколько попыток записи?
Первый запишет объект, а второй пойдет лесом т.к. объект то он уже захватил, ему никто не мешал. А записать не сможет т.к. версия изменена.

Как минимум получили должно устанавливать после блокировки.
Пока Не Получили и (ТекущееВремя+10)>ТекущаяДата() Цикл 
Об=СсылкаНаДок.ПолучитьОбъект(); 
Если НЕ Об.Заблокирован() тогда 
Об.Заблокировать(); 
Получили = Истина; 
КонецЕсли;  
КонецЦикла;
3. just666 14.02.18 17:35 Сейчас в теме
Если подскажите лучшую задержку буду признателен.

Далее по коду, у меня и так
Получили = Истина;
идет после
Об.Заблокировать();

и т.к. все это в цикле, то объект будет получен только тот который может быть заблокирован, иначе падаем в исключение а
Получили = Ложь;


Относительно записи самого объекта уже не так критично если с получением и блокировкой разобраться.
4. just666 16.02.18 13:52 Сейчас в теме
Насколько понимаю ни у кого мыслей нету больше?
Придется переделывать механизм видимо на работу с регистрами чтобы избежать блокировок...
Оставьте свое сообщение

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