Блокировка данных объекта для редактирования из кода
Область применения: управляемое приложение, обычное приложение.
1.1. Прежде чем изменять существующий объект информационной базы из кода на встроенном языке, следует предварительно его заблокировать (установить «блокировку данных для редактирования» или «объектную блокировку»), тем самым, во-первых, убедиться, не заблокирован ли он другими объектами, во-вторых, попытаться предотвратить его изменение другими пользовательскими сеансами (или другими экземплярами объекта в этом же сеансе).
В противном случае, если при изменении и записи из встроенного языка не устанавливать блокировку объекта на время редактирования, то может возникнуть, например, ситуация, когда пользователь не сможет сохранить свои изменения, если эти же самые данные были конкурентно изменены в другом сеансе.
Пример № 1. Требуется заблокировать объект и, если это удалось, модифицировать данные. В противном случае – проинформировать пользователя об отказе в выполнении операции с помощью сообщения вида:
Аналогичным образом, можно воспользоваться методом глобального контекста ЗаблокироватьДанныеДляРедактирования :
Пример № 2. Требуется пропустить обработку объекта, если он заблокирован для редактирования. При очередном вызове процедуры (например, из фонового или регламентного задания) будет предпринята повторная попытка изменения объекта.
// Пропустить обработку объекта, если он заблокирован.
Если УстановитьПолноеНаименование Тогда
ФайлОбъект.ПолноеНаименование = ПолноеНаименование;
ФайлОбъект.Записать();
КонецЕсли;
1.3. При редактировании данных в формах, платформа 1С:Предприятие автоматически устанавливает блокировку объекта, указанного в качестве основного реквизита формы.
2. Не следует проверять блокировку объектов для редактирования в следующих случаях:
Объектные блокировки в 1С 8.3
Объектные блокировки
Объектные блокировки применяются для блокирования объектных данных на уровне платформы 1С. Объектные блокировки используются только для объектных данных (справочники, документы и т.п.) и не используются для необъектных данных (регистры, последовательность и т.п.). Исключение — независимый регистр сведений.
Объектные блокировки ни как не связаны ни с транзакциями, ни с СУБД. Они блокируют только один объект, для того чтобы сразу несколько пользователей не могли изменить его одновременно. При этом объектная блокировка защищает только от других объектных блокировок.
Объектные блокировки бывают двух видов:
Пессимистическая блокировка
Через расширение формы
Пессимистическая блокировка устанавливается расширением формы при начале редактирования объекта в форме. Например, откроем форму существующего товара и изменим артикул. Оставим форму открытой, в наименовании формы должна появиться звездочка, это означает, что объект был изменен:
Запустим второй сеанс, откроем форму этого же товара и попробуем что-то изменить. Изменить не получится и будет выведено сообщение «Не удалось начать редактирование»:
Это и есть пример работы пессимистической блокировки. При начале редактирования товара в первом сеанса расширение формы установило пессимистическую блокировку. Когда во втором сеансе мы начали редактировать тот же товар, расширение формы попробовало установить пессимистическую блокировку. Блокировку установить не получилось, потому что объект уже был заблокирован и было выведено такое сообщение.
Пессимистическая блокировка устанавливается именно при начале редактирования объекта в форме. Если просто открыть форму, то пессимистическая блокировка не будет установлена.
Пессимистическая блокировка автоматически снимается при закрытии формы. Если сейчас закрыть форму в первом сеансе, то во втором сеансе без переоткрытия формы можно будет начать редактирование объекта. Если в первом сеансе записать объект, но не закрыть форму, то блокировка будет автоматически снята через одну минуту.
ЗаблокироватьДанныеФормыДляРедактирования
Пессимистическую блокировку можно установить программно. Для этого используется метод ЗаблокироватьДанныеФормыДляРедактирования. Его нужно вызывать внутри модуля той формы, которую хотим заблокировать. Доступен как на клиенте, так и на сервере. Для примера добавим на форму команду со следующим кодом:
Объектные блокировки
Блокировки
При работе с объектными данными (справочники, документы, планы счетов и т.д.) система «1С:Предприятие» обеспечивает два вида объектных блокировок: пессимистическую и оптимистическую. Они позволяют выполнять целостные изменения объектов при одновременной работе нескольких пользователей.
Объектная пессимистическая блокировка
Пессимистическая объектная блокировка предназначена для запрета изменений данных объекта, пока блокировка не будет снята. Система (с помощью соответствующих расширений формы объекта) автоматически устанавливает пессимистическую блокировку, в момент, когда пользователь пытается произвести изменение данных объекта. Если после этого другой пользователь, например, попытается выполнить редактирование того же объекта, ему будет выдано сообщение о том, что не удалось заблокировать объект. Когда форма будет закрыта пользователем, данная блокировка будет снята.
Рассмотрим пример.
Войдем в учебную информационную базу под пользователем «Васильев В.В.», откроем форму документа «Поступление товаров 00000000001 от 01.06.2016» и внесем изменения в поле комментарий (рис. 1.3).
Не сохраняя документ войдем в информационную базу под пользователем «Иванов И.И.», откроем тот же документ и попробуем внести изменения в любом реквизите документа. Система не даст нам внести изменения и выдаст сообщение об ошибке (рис. 1.4).
Отсюда следует, что пессимистическая блокировка гарантирует, что пользователь, начав изменять данные объекта, сможет записать эти изменения в информационную базу.
Разработчик используя средства встроенного языка может задействовать пессимистическую блокировку. Используя метод «Заблокировать()» происходит установка пессимистической объектной блокировки, а для снятия используется метод «Разблокировать()».
Давайте рассмотрим другой пример. Под пользователем «Васильев В.В.» в разделе «Нормативно-справочная информация» откроем элемент справочника «Склады» с наименованием «Склад №1» и внесем изменения в наименование (рис. 1.5).
Не сохраняя переключимся в окно информационной базы, который был запущен под пользователем «Иванов В.В.», в разделе «Нормативно-справочная информация» откроем обработку «Удаление объекта». Выберем в качестве удаляемого объекта выберем элемент справочника «Склады» с наименованием «Склад №1» и нажмем «Удалить объект» (рис. 1.6).
В результате система позволит удалить данный элемент справочника и система не выдаст сообщение об ошибке. Дело в том, что операция блокирования не препятствует операции изменения или удаления объекта в базе данных.
Для того, чтобы обеспечить невозможность изменения или удаления заблокированного объект необходимо произвести проверку на блокировку объекта.
Есть два способа проверки:
Пессимистическая блокировка в управляемых формах
При работе с управляемыми формами методы «Заблокировать()», «Разблокировать()» и «Заблокирован()» могут не подойти из-за специфики работы управляемого приложения.
Дело в том, что данные методы используются для объектов базы данных. Объект базы данных существует только на сервере. Получается разработчику придется выполнить серверный вызов, получить объект базы данных путем преобразования основного реквизита формы с помощью метода формы «РеквизитФормыВЗначение». Далее вызывается один из методов объекта «Заблокировать()», «Разблокировать()» или «Заблокирован()». Но данный способ блокировки будет бесполезен, если задача стоит, чтобы объект был заблокирован пока открыта форма, так как полученный объект будет жить до конца серверного вызова.
Для работы с блокировками из управляемой формы необходимо использовать методы: «ЗаблокироватьДанныеФормыДляРедактирования()» и «РазблокироватьДанныеФормыДляРедактирования()». Данные методы используются для блокировки или разблокировки данных основного реквизита формы.
Рассмотрим пример. В разделе «Нормативно-справочная информация» откроем любой элемент справочника «Номенклатура» под пользователем «Васильев В.В.», внесем изменения в наименование и не сохраняя под пользователем «Иванов И.И.» отроем тот же элемент справочника. При попытки внесения изменений система выдаст сообщение об ошибке.
Далее в форме элемента справочника под пользователем «Васильев В.В.» нажмем на кнопку «Разблокировать» (рис. 1.7) и попробуем снова внести изменения в данный элемент справочника под пользователем «Иванов И.И.». В данном случае система даст внести изменения и записать элемент справочника.
Для отключения пессимистической блокировки в управляемых формах в свойстве основного реквизита надо снять флаг «Сохраняемые данные». Данный флаг определяет будет ли при интерактивном редактировании блокироваться данные основного реквизита, или нет рис(1.8).
Объектная оптимистическая блокировка
Оптимистическая блокировка представляет собой проверку, которая выполняется перед записью объекта в базу данных. У объекта есть свойство «ВерсияДанных», которая вместе с объектом считывается из базы данных. Оптимистическая блокировка производит перед записью производит сравнение значения свойства «ВерсияДанных» объекта, который находится в оперативной памяти с значением свойства «ВерсияДанных» объекта находящийся в базе данных. Если значения свойства «ВерсияДанных» у объектов отличается, то оптимистическая блокировка запрещает запись объекта в базу данных и выдает сообщение об ошибке.
В разделе «Нормативно-справочная информация» откроем любой элемент справочника «Номенклатура» под пользователем «Васильев В.В.», далее не закрывая форму элемента под пользователем «Иванов И.И.» в разделе «Нормативно-справочная информация» откроем обработку «Изменить объект».
В обработке выберем ту же номенклатуру и нажмем кнопку «Изменить объект». Данная команда добавит в конце наименования «. » (рис. 1.9).
После изменения попробуем записать открытый элемент справочника номенклатуры под пользователем «Васильев В.В.». Система выдаст предупреждение о том, что данные объекты были изменены или удалены и не даст записать данный объект (рис. 1.10).
Для отключения оптимистической блокировки необходимо перед записью объекта находящийся в оперативной памяти сравнить версию с версией объекта базы данных. Если версии данных отличаются, то получаем объект из базы данных и переносим изменения в него, далее записываем.
Блокировка данных объекта для редактирования из кода
1.1. Прежде чем изменять существующий объект информационной базы из кода на встроенном языке, следует предварительно его заблокировать (установить «блокировку данных для редактирования» или «объектную блокировку»), тем самым, во-первых, убедиться, не заблокирован ли он другими объектами, во-вторых, попытаться предотвратить его изменение другими пользовательскими сеансами (или другими экземплярами объекта в этом же сеансе).
В противном случае, если при изменении и записи из встроенного языка не устанавливать блокировку объекта на время редактирования, то может возникнуть, например, ситуация, когда пользователь не сможет сохранить свои изменения, если эти же самые данные были конкурентно изменены в другом сеансе.
При этом блокировка данных для редактирования не запрещает запись заблокированных данных в других пользовательских сеансах (или в других экземплярах объекта в этом же сеансе), а лишь не позволяет нескольким объектам одновременно установить блокировку одних и тех же данных. В отличие от транзакционных блокировок данных, пессимистическая блокировка данных для редактирования предназначена для обеспечения конкурентной работы пользователей с объектами информационной базы 1С:Предприятия (элементами справочников, документами и т.д.) Подробнее о блокировке данных для редактирования см. документацию по платформе 1С:Предприятие 8.
1.2. Для блокировки данных для редактирования из встроенного языка следует вызывать метод объектов Заблокировать или метод глобального контекста ЗаблокироватьДанныеДляРедактирования.
Пример № 1. Требуется заблокировать объект и, если это удалось, модифицировать данные. В противном случае – проинформировать пользователя об отказе в выполнении операции с помощью сообщения вида:
Аналогичным образом, можно воспользоваться методом глобального контекста ЗаблокироватьДанныеДляРедактирования:
Пример № 2. Требуется пропустить обработку объекта, если он заблокирован для редактирования. При очередном вызове процедуры (например, из фонового или регламентного задания) будет предпринята повторная попытка изменения объекта.
1.3. При редактировании данных в формах, платформа 1С:Предприятие автоматически устанавливает блокировку объекта, указанного в качестве основного реквизита формы.
2. Не следует проверять блокировку объектов для редактирования в следующих случаях:
Блокировка объекта при редактировании в форме и списке
При редактировании объекта 1С:Предприятие использует пессимистическую блокировку. То есть если начинается редактирование объекта, он автоматически блокируется. Есть некоторые различия в процессе блокировки объекта при его редактировании в форме и в списке. Эти различия связанны с моментом блокировки объекта.
Редактирование в форме
При редактировании в форме объект не блокируется при открытии формы. Блокировка ставится при попытке интерактивного изменения объекта. То есть в форме блокировка ставится на объект только в тот момент, когда пользователь пытается изменить объект, вводя данные в элементы управления формы, связанные с реквизитами объекта. Так как между моментом считывания и моментом блокировки может произойти изменение объекта другим пользователем, то в момент блокировки производится проверка, что объект не был изменен. Если объект все же был изменен или в данный момент редактируется другим пользователем, то выдается сообщение о невозможности заблокировать объект. После этого пользователь должен перечитать данные и опять попытаться начать редактирование объекта. Разблокирование объекта происходит только после закрытия формы. То есть после записи объекта остается заблокированным.
Редактирование в списке
Изменение объекта из встроенного языка
При изменении объекта из встроенного языка автоматической блокировки объекта не происходит, даже если он редактируется в форме. Например, в форме редактирования объекта может быть расположена кнопка, при нажатии на которую вызывается обработчик, изменяющий редактируемый объект. В данном случае при изменении объекта блокировка на него не будет установлена, и при записи такого объекта новые данные могут быть утеряны из-за того, что объект в этот момент был изменен другим пользователем. Для того чтобы избежать данной ситуации, нужно либо явно заблокировать объект перед его изменением, либо у кнопки установить признак, что она изменяет данные. При установке флага изменения данных, форма отслеживает все события от данного элемента управления, и, если у события есть обработчик на встроенном языке, перед вызовом этого обработчика пытается заблокировать редактируемый объект. Если попытка блокировки объекта неудачна, то пользователю выдается сообщение о невозможности блокировки и обработчик события не вызывается.
Другим примером может служить поле ввода, которое непосредственно не связано с реквизитами редактируемого объекта, но значение которого влияет на состояние объекта. То есть при считывании и записи объекта значение реквизита синхронизируется со значением поля ввода. В этом случае, если полю ввода не установлен флаг изменения данных, система не будет автоматически блокировать объект, так как поле ввода не связано с данными объекта.