Довідковий матеріал

Блокування даних об’єкта для редагування з коду

У платформі 1С:Підприємство 8.1 і пізніших версіях блокування даних, установлене за допомогою методу об’єктів Заблокувати («блокування даних для редагування» або «об’єктне блокування»), не забороняє запис заблокованих даних іншими об’єктами, а лише не дозволяє кільком об’єктам (наприклад, із різних користувацьких сеансів) одночасно встановити блокування тих самих даних.

1. У платформі 1С:Підприємство 8.1 і пізніших версіях блокування даних, установлене за допомогою методу об’єктів Заблокувати («блокування даних для редагування» або «об’єктне блокування»), не забороняє запис заблокованих даних іншими об’єктами, а лише не дозволяє кільком об’єктам (наприклад, із різних користувацьких сеансів) одночасно встановити блокування тих самих даних.

Тому перш ніж змінювати наявний об’єкт інформаційної бази з коду вбудованою мовою, слід попередньо його заблокувати, тим самим, по-перше, переконатися, чи не заблокований він іншими об’єктами, по-друге, спробувати запобігти його зміні іншими об’єктами.

Під час редагування даних у формах платформа автоматично встановлює блокування об’єкта, зазначеного як основний реквізит форми.

Якщо під час зміни та запису з вбудованої мови не встановлювати блокування об’єкта на час редагування, то може виникнути, наприклад, ситуація, коли користувач не зможе зберегти свої зміни, якщо ці самі дані було конкурентно змінено в іншому сеансі.

На відміну від транзакційних блокувань даних, песимістичне блокування даних для редагування призначене для забезпечення конкурентної роботи користувачів з об’єктами інформаційної бази 1С:Підприємства (елементами довідників, документами тощо). Докладніше про блокування даних для редагування див. документацію з платформи 1С:Підприємство 8.

Приклад № 1. Потрібно заблокувати об’єкт і, якщо це вдалося, модифікувати дані. В іншому випадку — проінформувати користувача про відмову у виконанні операції за допомогою повідомлення виду «Не вдалося заблокувати запис. Дію (зміну, видалення або блокування запису) не виконано. Помилка блокування об’єкта. Об’єкт уже заблоковано: комп’ютер: <ім’я комп’ютера>, користувач: <ім’я користувача>, сеанс: <номер сеансу>, розпочато: <дата й час>, застосунок: <тип клієнтського застосунку>».

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

Аналогічно можна скористатися методом глобального контексту ЗаблокироватьДанныеДляРедактирования:

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

Приклад № 2. Потрібно пропустити обробку об’єкта, якщо він заблокований для редагування. Під час чергового виклику процедури (наприклад, із фонового або регламентного завдання) буде здійснено повторну спробу зміни об’єкта.

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

2. Не слід перевіряти блокування об’єктів для редагування в таких випадках:

  • під час виконання окремих операцій, що за логікою роботи мають вищий пріоритет порівняно з інтерактивними діями користувача. Наприклад, завантаження даних під час обміну;
  • під час дій, які гарантовано виконуються в монопольному режимі. Наприклад, у процедурах оновлення та початкового заповнення даних інформаційної бази.
Записатися телефоном