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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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