0

Как заблокировать объект на изменение?

При программном изменении существующих объектов есть правило: сразу после получения объекта из ссылки, необходимо его заблокировать для редактирования. Это позволяет:

  • во-первых, проверить, что данный объект не заблокирован в настоящий момент другим пользователем;
  • во-вторых, гарантирует, что другой пользователь не сможет изменить объект, пока не будут записаны изменения в текущем сеансе;

Внимание! Данное правило неприменимо при пакетной загрузке данных, когда требуется принятие изменений пакетом, а также при разрешении коллизий, возникающих при загрузке данных из другого источника, обладающего большим приоритетом

Заблокировать произвольный объект можно двумя способами:

  • Используя метод Заблокировать() объекта метаданных ссылочного типа (Справочники, Документы и т.п.);
  • Используя метод ЗаблокироватьДанныеДляРедактирования() глобального контекста;

Давайте рассмотрим примеры работы с каждым из этих методов

Метод Заблокировать()

Если Ваш алгоритм не взаимодействует с пользователем, перед тем как заблокировать объект, следует проверить, не заблокирован ли этот объект другим пользователем или процессом. Если, все же, взаимодействует, следует исключить код для варианта 1. Тогда в случае заблокированного объекта будет вызвано исключение и пользователь увидит полное описание ошибки.

КонтрагентОбъект = Контрагент.ПолучитьОбъект();
//вариант 1. если пользователю не нужно выводить сообщений
Если КонтрагентОбъект.Заблокирован() = Истина Тогда
	Продолжить;
КонецЕсли;
//вариант 2. пользователю нужно сообщить об ошибке
КонтрагентОбъект.Заблокировать();
//если объект заблокирован, произойдет исключение
//пользователю увидит кто и откуда заблокировал объект
КонтрагентОбъект.Наименование = "удалить " + КонтрагентОбъект.Наименование;
КонтрагентОбъект.Записать();

Недостатки: Метод доступен только в контексте сервера, толстого клиента или внешнего соединения

Метод ЗаблокироватьДанныеДляРедактирования()

Данный метод обладает большим спектром возможностей, чем предыдущий:

  • он умеет блокировать записи регистра сведений;
  • он умеет блокировать данные в контексте управляемых форм;
  • он умеет блокировать данные, если совпадает версия данных;

С учетом этого, перепишем предыдущий пример следующим образом:

//установим блокировку перед началом работы с объектом
ЗаблокироватьДанныеДляРедактирования(Контрагент);
//если объект заблокирован, произойдет исключение
//пользователю увидит кто и откуда заблокировал объект
КонтрагентОбъект = Контрагент.ПолучитьОбъект();
КонтрагентОбъект.Наименование = "удалить " + КонтрагентОбъект.Наименование;
КонтрагентОбъект.Записать();
//явное снятие блокировки
РазблокироватьДанныеДляРедактирования(Контрагент);

В том случае, когда нам необходимо заблокировать некоторые данные на время открытия управляемой формы, можно поступить следующим образом:

ИзмеренияРегистра = Новый Структура("Контрагент", Контрагент);
КлючЗаписи = РегистрыСведений.ТелефоныКонтрагентов.СоздатьКлючЗаписи(ИзмеренияРегистра);
//установим блокировку перед началом работы с объектом
ЗаблокироватьДанныеДляРедактирования(КлючЗаписи,, ЭтаФорма.УникальныйИдентификатор);

Блокировка будет снята неявно при закрытии привязанной формы, либо при завершении сеанса пользователя, либо явно при вызове метода РазблокироватьДанныеДляРедактирования()

Внимание! Методы РазблокироватьДанныеДляРедактирования() и РазблокироватьДанныеДляРедактирования() доступны только начиная с версии платформы 1С 8.2.9

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *