Блокування даних об’єкта для редагування з коду
У платформі 1С:Підприємство 8.1 і пізніших версіях блокування даних, установлене за допомогою методу об’єктів Заблокувати («блокування даних для редагування» або «об’єктне блокування»), не забороняє запис заблокованих даних іншими об’єктами, а лише не дозволяє кільком об’єктам (наприклад, із різних користувацьких сеансів) одночасно встановити блокування тих самих даних.
1. У платформі 1С:Підприємство 8.1 і пізніших версіях блокування даних, установлене за допомогою методу об’єктів Заблокувати («блокування даних для редагування» або «об’єктне блокування»), не забороняє запис заблокованих даних іншими об’єктами, а лише не дозволяє кільком об’єктам (наприклад, із різних користувацьких сеансів) одночасно встановити блокування тих самих даних.
Тому перш ніж змінювати наявний об’єкт інформаційної бази з коду вбудованою мовою, слід попередньо його заблокувати, тим самим, по-перше, переконатися, чи не заблокований він іншими об’єктами, по-друге, спробувати запобігти його зміні іншими об’єктами.
Під час редагування даних у формах платформа автоматично встановлює блокування об’єкта, зазначеного як основний реквізит форми.
Якщо під час зміни та запису з вбудованої мови не встановлювати блокування об’єкта на час редагування, то може виникнути, наприклад, ситуація, коли користувач не зможе зберегти свої зміни, якщо ці самі дані було конкурентно змінено в іншому сеансі.
На відміну від транзакційних блокувань даних, песимістичне блокування даних для редагування призначене для забезпечення конкурентної роботи користувачів з об’єктами інформаційної бази 1С:Підприємства (елементами довідників, документами тощо). Докладніше про блокування даних для редагування див. документацію з платформи 1С:Підприємство 8.
Приклад № 1. Потрібно заблокувати об’єкт і, якщо це вдалося, модифікувати дані. В іншому випадку — проінформувати користувача про відмову у виконанні операції за допомогою повідомлення виду «Не вдалося заблокувати запис. Дію (зміну, видалення або блокування запису) не виконано. Помилка блокування об’єкта. Об’єкт уже заблоковано: комп’ютер: <ім’я комп’ютера>, користувач: <ім’я користувача>, сеанс: <номер сеансу>, розпочато: <дата й час>, застосунок: <тип клієнтського застосунку>».
ФайлОбъект = ДанныеФайла.Ссылка.ПолучитьОбъект(); // Виконати блокування об’єкта від зміни іншими режимами // або користувачами; у разі блокування — // вивести користувачеві повідомлення про виняток. ФайлОбъект.Заблокировать(); // Потім змінити та записати об’єкт ФайлОбъект.Редактирует = Справочники.Пользователи.ПустаяСсылка(); ФайлОбъект.Записать();
Аналогічно можна скористатися методом глобального контексту ЗаблокироватьДанныеДляРедактирования:
ФайлОбъект = ДанныеФайла.Ссылка.ПолучитьОбъект(); // Виконати блокування об’єкта від зміни іншими режимами // або користувачами; у разі блокування — // вивести користувачеві повідомлення про виняток. ЗаблокироватьДанныеДляРедактирования(ФайлОбъект); // Потім змінити та записати об’єкт ФайлОбъект.Редактирует = Справочники.Пользователи.ПустаяСсылка(); ФайлОбъект.Записать();
Приклад № 2. Потрібно пропустити обробку об’єкта, якщо він заблокований для редагування. Під час чергового виклику процедури (наприклад, із фонового або регламентного завдання) буде здійснено повторну спробу зміни об’єкта.
Объект = ТекущаяВерсия.ПолучитьОбъект(); // Виконати блокування об’єкта від зміни іншими режимами // або користувачами УстановитьПолноеНаименование = Истина; Попытка ФайлОбъект.Заблокировать(); Исключение // у разі блокування — не виконувати зміну об’єкта УстановитьПолноеНаименование = Ложь; // записати попередження до журналу реєстрації ЗаписьЖурналаРегистрации("Фонове оновлення імен файлів", УровеньЖурналаРегистрации.Предупреждение,, ФайлОбъект, ОписаниеОшибки()); КонецПопытки;
// Пропустити обробку об’єкта, якщо він заблокований. Если УстановитьПолноеНаименование Тогда Объект.ПолноеНаименование = ПолноеНаименование; Объект.Записать(); КонецЕсли;
2. Не слід перевіряти блокування об’єктів для редагування в таких випадках:
- під час виконання окремих операцій, що за логікою роботи мають вищий пріоритет порівняно з інтерактивними діями користувача. Наприклад, завантаження даних під час обміну;
- під час дій, які гарантовано виконуються в монопольному режимі. Наприклад, у процедурах оновлення та початкового заповнення даних інформаційної бази.