Получение объекта справочника и блокировки
Коллеги, может кто-то что-то дельное подскажет.
Имеем внешние серверные подключения к 1с, база на SQL.
Подключаются одновременно несколько пользователей, в примере рассматриваем например 2 пользователя и выполняют действие одновременно.
Код в модуле следующий их ожидает:
Далее выполняются некоторые действия и следующий код
При одновременном выполнении обычно один пользователь выполняет действия, а второй не может, хотя времени хватает, второй пользователь падает в ошибку ("Не нашли документ") а по сути отрабатывает исключения по блокировке ("Операция не может быть выполнена из-за несоответсвия версии или отсутствия записи базы данных...")
Вопрос почему это происходит если каждый раз в коде в цикле мы получаем новый объект Об=СсылкаНаДок.ПолучитьОбъект(); т.е. объект должен актуальный возвращаться....
Имеем внешние серверные подключения к 1с, база на SQL.
Подключаются одновременно несколько пользователей, в примере рассматриваем например 2 пользователя и выполняют действие одновременно.
Код в модуле следующий их ожидает:
Получили = Ложь;
ТекущееВремя = ТекущаяДата();
Пока Не Получили и (ТекущееВремя+10)>ТекущаяДата() Цикл
Попытка
Об=СсылкаНаДок.ПолучитьОбъект();
Если НЕ Об.Заблокирован() тогда
Об.Заблокировать();
КонецЕсли;
Получили = Истина;
Исключение
КонецПопытки;
КонецЦикла;
Если об = неопределено тогда
ВызватьИсключениеВС("Не нашли документ");
Возврат Ложь;
КонецЕсли;
ПоказатьДалее выполняются некоторые действия и следующий код
Записали = Ложь;
ТекущееВремя = ТекущаяДата();
Пока Не Записали и (ТекущееВремя+10)>ТекущаяДата() Цикл
Попытка
Об.Записать();
Если Об.Заблокирован() тогда
Об.Разблокировать();
КонецЕсли;
Записали = Истина;
Исключение
КонецПопытки;
КонецЦикла;
ПоказатьПри одновременном выполнении обычно один пользователь выполняет действия, а второй не может, хотя времени хватает, второй пользователь падает в ошибку ("Не нашли документ") а по сути отрабатывает исключения по блокировке ("Операция не может быть выполнена из-за несоответсвия версии или отсутствия записи базы данных...")
Вопрос почему это происходит если каждый раз в коде в цикле мы получаем новый объект Об=СсылкаНаДок.ПолучитьОбъект(); т.е. объект должен актуальный возвращаться....
По теме из базы знаний
- "Справочник плюс". Прямая запись в справочники 1С 7.7
- Объектные блокировки
- Многопоточность. Универсальный «Менеджер потоков» (фреймворк) с отслеживанием зависимости объектов
- Панель #Расширение объекта: Редактор, Права, Поиск, Сторно, Обмен
- Блокировка изменения объектов через обмен данными в базе приемнике - для обменов в формате EnterpriseData
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Странный код.
Очень плохой способ реализации задержки, сожрет все ресурсы при работе.
Далее не смотря на цикл объект в любом случае будет получен т.к. устанавливается всегда.
Параллелельно с этим второй пользователь так же получит объект.
Далее.
Такой код подразумевает, что объект не захвачен, зачем несколько попыток записи?
Первый запишет объект, а второй пойдет лесом т.к. объект то он уже захватил, ему никто не мешал. А записать не сможет т.к. версия изменена.
Как минимум получили должно устанавливать после блокировки.
Пока Не Получили и (ТекущееВремя+10)>ТекущаяДата() Цикл
Очень плохой способ реализации задержки, сожрет все ресурсы при работе.
Далее не смотря на цикл объект в любом случае будет получен т.к.
Получили = Истина;
Параллелельно с этим второй пользователь так же получит объект.
Далее.
Попытка
Об.Записать();
Если Об.Заблокирован() тогда
Об.Разблокировать();
КонецЕсли;
Такой код подразумевает, что объект не захвачен, зачем несколько попыток записи?
Первый запишет объект, а второй пойдет лесом т.к. объект то он уже захватил, ему никто не мешал. А записать не сможет т.к. версия изменена.
Как минимум получили должно устанавливать после блокировки.
Пока Не Получили и (ТекущееВремя+10)>ТекущаяДата() Цикл
Об=СсылкаНаДок.ПолучитьОбъект();
Если НЕ Об.Заблокирован() тогда
Об.Заблокировать();
Получили = Истина;
КонецЕсли;
КонецЦикла;
Если подскажите лучшую задержку буду признателен.
Далее по коду, у меня и так
Получили = Истина;
идет после
Об.Заблокировать();
и т.к. все это в цикле, то объект будет получен только тот который может быть заблокирован, иначе падаем в исключение а
Получили = Ложь;
Относительно записи самого объекта уже не так критично если с получением и блокировкой разобраться.
Далее по коду, у меня и так
Получили = Истина;
идет после
Об.Заблокировать();
и т.к. все это в цикле, то объект будет получен только тот который может быть заблокирован, иначе падаем в исключение а
Получили = Ложь;
Относительно записи самого объекта уже не так критично если с получением и блокировкой разобраться.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот