Как заблокировать документ от открытия другими пользователями в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки часто возникает задача ограничить доступ к документу таким образом, чтобы при открытии его одним пользователем, остальные не могли внести изменения или открыть его для редактирования. Давайте разберемся, как реализовать это в современной архитектуре 1С:Предприятие 8.3.

Понимание механизмов блокировки

Важно различать классические серверные блокировки и механизмы управляемых форм. Использование метода Заблокировать(), который был популярен в старых конфигурациях, в управляемом приложении является нежелательным, так как он не учитывает контекст сеанса формы и может приводить к «зависанию» блокировок.

Для управляемых форм наиболее эффективным инструментом является метод ЗаблокироватьДанныеДляРедактирования. Этот метод позволяет платформе автоматически управлять процессом блокировки и уведомлять других пользователей о том, что документ уже занят.

Реализация блокировки в управляемых формах

Для того чтобы заблокировать документ при открытии, необходимо воспользоваться возможностями УправляемойФормы. Основная идея заключается в передаче ссылки на документ и уникального идентификатора формы, чтобы система понимала, какая именно форма удерживает объект.

Разберем реализацию по шагам:

  1. В модуле формы (на клиенте или сервере в зависимости от логики открытия) вызывается метод блокировки.
  2. В качестве параметров передается ссылка на объект и ЭтаФорма.УникальныйИдентификатор.

Пример корректного использования метода выглядит следующим образом:


// Пример блокировки данных
ЗаблокироватьДанныеДляРедактирования(Объект.Ссылка, , ЭтаФорма.УникальныйИдентификатор);

Почему блокировка может не сниматься?

Частой ошибкой является попытка вручную вызвать процедуру разблокировки в событии ПриЗакрытии на сервере. В управляемом приложении платформа 1С самостоятельно отслеживает жизненный цикл формы. Если вы корректно передали УникальныйИдентификатор, система сама снимет блокировку в момент закрытия окна пользователем.

Если вы столкнулись с тем, что объект остается заблокированным, проанализируйте следующие моменты:

Почему не стоит использовать Транзакции для этих целей?

Иногда возникает искушение использовать НачатьТранзакцию для предотвращения открытия документа. Мы настоятельно не рекомендуем этот путь. Транзакции предназначены для обеспечения атомарности записи данных в базу, а не для управления интерфейсом или длительного удержания объектов. Удержание транзакции в ожидании действий пользователя приведет к блокировкам таблиц базы данных, резкому снижению производительности всей системы и вероятным взаимоблокировкам (deadlocks) для других пользователей.

Рекомендации по архитектуре

Если ваша задача требует сложного бизнес-процесса (например, документ должен быть доступен только конкретному менеджеру), рассмотрите следующие подходы:

  1. Использование реквизита Статус или Ответственный. Вы можете проверять эти данные в событии ПередЗаписью модуля объекта, запрещая сохранение изменений, если текущий пользователь не является владельцем.
  2. Использование стандартного механизма ЗаблокироватьДанныеДляРедактирования, который уже реализован в типовых конфигурациях 1С.

Таким образом, для большинства задач по ограничению редактирования достаточно метода ЗаблокироватьДанныеДляРедактирования(Объект.Ссылка, , ЭтаФорма.УникальныйИдентификатор). Это современный, безопасный и рекомендуемый вендором способ работы с объектами в управляемом приложении.

← На главную