#std490

Блокировка данных объекта для редактирования из кода

1.1.

Перед изменением существующего объекта информационной базы из встроенного языка предварительно устанавливайте блокировку данных для редактирования (объектную блокировку).

Это позволяет:

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

Если не устанавливать блокировку на время изменения и записи, пользователь может не сохранить свои правки из-за конкурентной записи тех же данных в другом сеансе.

Блокировка данных для редактирования не запрещает запись этих данных в других сеансах полностью. Она только не позволяет нескольким объектам одновременно установить блокировку одних и тех же данных.

В отличие от #std648: транзакционных блокировок данных, такая блокировка предназначена для конкурентной работы пользователей с объектами ИБ (документами, элементами справочников и т.д.). Подробнее о механизме блокировки данных для редактирования см. в документации платформы 1С:Предприятие 8.

1.2.

Для блокировки из встроенного языка используйте метод Заблокировать() у объекта или метод глобального контекста ЗаблокироватьДанныеДляРедактирования().

Пример 1

Нужно заблокировать объект и, если блокировка получена, изменить данные. Если объект уже заблокирован, платформа выдаст исключение с информацией о блокирующем сеансе.

ФайлОбъект = ДанныеФайла.Ссылка.ПолучитьОбъект();
// Выполнить блокировку объекта от изменения другими режимами
// или пользователями; в случае блокировки -
// вывести пользователю сообщение об исключении.
ФайлОбъект.Заблокировать();
// Затем изменить и записать объект
ФайлОбъект.Редактирует = Справочники.Пользователи.ПустаяСсылка();
ФайлОбъект.Записать();

Аналогично через глобальный метод:

ФайлОбъект = ДанныеФайла.Ссылка.ПолучитьОбъект();
// Выполнить блокировку объекта от изменения другими режимами
// или пользователями; в случае блокировки -
// вывести пользователю сообщение об исключении.
ЗаблокироватьДанныеДляРедактирования(ДанныеФайла.Ссылка);
// Затем изменить и записать объект
ФайлОбъект.Редактирует = Справочники.Пользователи.ПустаяСсылка();
ФайлОбъект.Записать();

Пример 2

Нужно пропускать обработку объекта, если он заблокирован, и повторять попытку при следующем запуске (например, из фонового или регламентного задания).

ФайлОбъект = ТекущаяВерсия.ПолучитьОбъект();
// Выполнить блокировку объекта от изменения другими режимами или пользователями.
УстановитьПолноеНаименование = Истина;
Попытка
    ФайлОбъект.Заблокировать();
Исключение
    // в случае блокировки - не выполнять изменение объекта
    УстановитьПолноеНаименование = Ложь;
    // записать предупреждение в журнал регистрации
    ЗаписьЖурналаРегистрации(НСтр("ru = 'Фоновое обновление имен файлов'", Метаданные.ОсновнойЯзык.КодЯзыка),
        УровеньЖурналаРегистрации.Предупреждение,, ФайлОбъект, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;

// Пропустить обработку объекта, если он заблокирован.
Если УстановитьПолноеНаименование Тогда
    ФайлОбъект.ПолноеНаименование = ПолноеНаименование;
    ФайлОбъект.Записать();
КонецЕсли;
1.3.

При редактировании данных в формах платформа 1С:Предприятие автоматически устанавливает блокировку объекта, который указан как основной реквизит формы.

2.

Не проверяйте блокировку объектов для редактирования в случаях:

  • выполнения операций с более высоким приоритетом относительно интерактивных действий пользователя (например, загрузка данных при обмене);
  • действий, которые гарантированно выполняются в монопольном режиме (например, процедуры обновления и первоначального заполнения ИБ).
См. также
Проверки

#acc:1327 #acc:1328

Источник

https://its.1c.ru/db/v8std#content:490