6. Объектная модель прикладного решения
#75

Готовишься к экзамену?

Полнофункциональный тренажер @bot_1cnik_bot с полноценным обучением, режимом экзамена и подробной статистикой.

Перейти в бота

В управляемой форме 1С, если на сервере вызвать у объекта метод «Заблокировать()» (пессимистическая блокировка), до какого момента будет удерживаться эта блокировка при обычном клиент-серверном взаимодействии?

До тех пор, пока пользователь не запишет объект из этой формы.
Неправильно: Блокировка, установленная методом «Заблокировать()» в серверном коде, не «ждет» нажатия кнопки записи пользователем. В управляемом приложении серверный вызов завершается раньше пользовательских действий, и вместе с завершением вызова блокировка снимается (если специально не удерживать ее иначе).
До закрытия формы, в которой открыт объект.
Неправильно: Метод «Заблокировать()» у объекта обычно ставит блокировку на стороне сервера в рамках текущего серверного выполнения, а не на весь срок жизни формы. Чтобы удерживать блокировки на время жизни формы, применяют другие механизмы (например, блокировку данных с привязкой к идентификатору формы), а не обычный вызов «Заблокировать()» у объекта.
До первого из событий: либо запись объекта, либо закрытие формы (что наступит раньше).
Неправильно: Эта формулировка предполагает, что блокировка живет «долго» и привязана к пользовательским событиям формы, но в управляемом приложении серверный контекст краткоживущий. Если блокировка ставится в серверной процедуре, то она снимается при завершении серверного вызова, даже если форма еще открыта и запись не выполнялась.
До окончания текущего серверного вызова (после возврата управления на клиент).
Правильно: Метод «Заблокировать()» устанавливает пессимистическую блокировку на сервере, и она снимается либо явным вызовом «Разблокировать()», либо автоматически при завершении серверного вызова. В управляемой форме экземпляр объекта на сервере обычно существует только в рамках этого вызова, поэтому блокировка не сохраняется до действий пользователя в форме.

Пояснение

В управляемом приложении важно помнить, что «форма» живет на клиенте, а объект для работы с данными часто создается/получается на сервере только на время выполнения конкретной серверной процедуры или функции. Когда вы в серверном обработчике вызываете «Объект.Заблокировать()», платформа ставит пессимистическую блокировку, чтобы другие сеансы не могли изменить этот же объект параллельно. Но как только серверная процедура завершилась и управление вернулось на клиент, серверный контекст заканчивается - и блокировка снимается автоматически (если вы заранее не сняли ее вручную). Практический пример: вы нажали кнопку «Проверить и занять», в обработчике на сервере получили объект, вызвали «Заблокировать()», сделали проверки и показали сообщение пользователю. Несмотря на то, что форма остается открытой, блокировка после завершения обработчика уже снята - другой пользователь может успеть открыть/изменить объект. Если нужна длительная защита данных, обычно используют другие подходы: оптимистическую блокировку (версия данных при записи), корректные транзакции на время изменения данных, либо специализированный механизм блокировки данных с привязкой к идентификатору формы (когда блокировки держатся, пока форма не будет закрыта). А метод «Заблокировать()» у объекта - это инструмент для краткосрочной защиты в рамках серверного выполнения.