#std490¶
Блокировка данных объекта для редактирования из кода¶
1.1.¶
Перед изменением существующего объекта информационной базы из встроенного языка предварительно устанавливайте блокировку данных для редактирования (объектную блокировку).
Это позволяет:
- проверить, не заблокирован ли объект в другом месте;
- снизить риск конкурентного изменения данных в других сеансах или экземплярах объекта.
Если не устанавливать блокировку на время изменения и записи, пользователь может не сохранить свои правки из-за конкурентной записи тех же данных в другом сеансе.
Блокировка данных для редактирования не запрещает запись этих данных в других сеансах полностью. Она только не позволяет нескольким объектам одновременно установить блокировку одних и тех же данных.
В отличие от #std648: транзакционных блокировок данных, такая блокировка предназначена для конкурентной работы пользователей с объектами ИБ (документами, элементами справочников и т.д.).
Подробнее о механизме блокировки данных для редактирования см. в документации платформы 1С:Предприятие 8.
1.2.¶
Для блокировки из встроенного языка используйте метод Заблокировать() у объекта или метод глобального контекста ЗаблокироватьДанныеДляРедактирования().
Пример 1
Нужно заблокировать объект и, если блокировка получена, изменить данные. Если объект уже заблокирован, платформа выдаст исключение с информацией о блокирующем сеансе.
ФайлОбъект = ДанныеФайла.Ссылка.ПолучитьОбъект();
// Выполнить блокировку объекта от изменения другими режимами
// или пользователями; в случае блокировки -
// вывести пользователю сообщение об исключении.
ФайлОбъект.Заблокировать();
// Затем изменить и записать объект
ФайлОбъект.Редактирует = Справочники.Пользователи.ПустаяСсылка();
ФайлОбъект.Записать();
Аналогично через глобальный метод:
ФайлОбъект = ДанныеФайла.Ссылка.ПолучитьОбъект();
// Выполнить блокировку объекта от изменения другими режимами
// или пользователями; в случае блокировки -
// вывести пользователю сообщение об исключении.
ЗаблокироватьДанныеДляРедактирования(ДанныеФайла.Ссылка);
// Затем изменить и записать объект
ФайлОбъект.Редактирует = Справочники.Пользователи.ПустаяСсылка();
ФайлОбъект.Записать();
Пример 2
Нужно пропускать обработку объекта, если он заблокирован, и повторять попытку при следующем запуске (например, из фонового или регламентного задания).
ФайлОбъект = ТекущаяВерсия.ПолучитьОбъект();
// Выполнить блокировку объекта от изменения другими режимами или пользователями.
УстановитьПолноеНаименование = Истина;
Попытка
ФайлОбъект.Заблокировать();
Исключение
// в случае блокировки - не выполнять изменение объекта
УстановитьПолноеНаименование = Ложь;
// записать предупреждение в журнал регистрации
ЗаписьЖурналаРегистрации(НСтр("ru = 'Фоновое обновление имен файлов'", Метаданные.ОсновнойЯзык.КодЯзыка),
УровеньЖурналаРегистрации.Предупреждение,, ФайлОбъект, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
// Пропустить обработку объекта, если он заблокирован.
Если УстановитьПолноеНаименование Тогда
ФайлОбъект.ПолноеНаименование = ПолноеНаименование;
ФайлОбъект.Записать();
КонецЕсли;
1.3.¶
При редактировании данных в формах платформа 1С:Предприятие автоматически устанавливает блокировку объекта, который указан как основной реквизит формы.
2.¶
Не проверяйте блокировку объектов для редактирования в случаях:
- выполнения операций с более высоким приоритетом относительно интерактивных действий пользователя (например, загрузка данных при обмене);
- действий, которые гарантированно выполняются в монопольном режиме (например, процедуры обновления и первоначального заполнения ИБ).