При программном изменении существующих объектов есть правило: сразу после получения объекта из ссылки, необходимо его заблокировать для редактирования. Это позволяет:
- во-первых, проверить, что данный объект не заблокирован в настоящий момент другим пользователем;
- во-вторых, гарантирует, что другой пользователь не сможет изменить объект, пока не будут записаны изменения в текущем сеансе;
Заблокировать произвольный объект можно двумя способами:
- Используя метод
Заблокировать()
объекта метаданных ссылочного типа (Справочники, Документы и т.п.); - Используя метод
ЗаблокироватьДанныеДляРедактирования()
глобального контекста;
Давайте рассмотрим примеры работы с каждым из этих методов
Метод Заблокировать()
Если Ваш алгоритм не взаимодействует с пользователем, перед тем как заблокировать объект, следует проверить, не заблокирован ли этот объект другим пользователем или процессом. Если, все же, взаимодействует, следует исключить код для варианта 1. Тогда в случае заблокированного объекта будет вызвано исключение и пользователь увидит полное описание ошибки.
КонтрагентОбъект = Контрагент.ПолучитьОбъект(); //вариант 1. если пользователю не нужно выводить сообщений Если КонтрагентОбъект.Заблокирован() = Истина Тогда Продолжить; КонецЕсли; //вариант 2. пользователю нужно сообщить об ошибке КонтрагентОбъект.Заблокировать(); //если объект заблокирован, произойдет исключение //пользователю увидит кто и откуда заблокировал объект КонтрагентОбъект.Наименование = "удалить " + КонтрагентОбъект.Наименование; КонтрагентОбъект.Записать();
Недостатки: Метод доступен только в контексте сервера, толстого клиента или внешнего соединения
Метод ЗаблокироватьДанныеДляРедактирования()
Данный метод обладает большим спектром возможностей, чем предыдущий:
- он умеет блокировать записи регистра сведений;
- он умеет блокировать данные в контексте управляемых форм;
- он умеет блокировать данные, если совпадает версия данных;
С учетом этого, перепишем предыдущий пример следующим образом:
//установим блокировку перед началом работы с объектом ЗаблокироватьДанныеДляРедактирования(Контрагент); //если объект заблокирован, произойдет исключение //пользователю увидит кто и откуда заблокировал объект КонтрагентОбъект = Контрагент.ПолучитьОбъект(); КонтрагентОбъект.Наименование = "удалить " + КонтрагентОбъект.Наименование; КонтрагентОбъект.Записать(); //явное снятие блокировки РазблокироватьДанныеДляРедактирования(Контрагент);
В том случае, когда нам необходимо заблокировать некоторые данные на время открытия управляемой формы, можно поступить следующим образом:
ИзмеренияРегистра = Новый Структура("Контрагент", Контрагент); КлючЗаписи = РегистрыСведений.ТелефоныКонтрагентов.СоздатьКлючЗаписи(ИзмеренияРегистра); //установим блокировку перед началом работы с объектом ЗаблокироватьДанныеДляРедактирования(КлючЗаписи,, ЭтаФорма.УникальныйИдентификатор);
Блокировка будет снята неявно при закрытии привязанной формы, либо при завершении сеанса пользователя, либо явно при вызове метода РазблокироватьДанныеДляРедактирования()
РазблокироватьДанныеДляРедактирования()
доступны только начиная с версии платформы 1С 8.2.9