В процессе разработки на платформе 1С:Предприятие часто возникает задача управления доступом к объектам. Иногда требуется не просто ограничить возможность записи, а именно сымитировать поведение платформы, при котором пользователю выдается стандартное системное сообщение о том, что объект заблокирован другим пользователем. Давайте разберем, как реализовать этот сценарий для управляемых форм.
Перед нами стоят две основные задачи:
Платформа 1С предоставляет встроенные механизмы для управления состоянием формы. Основным инструментом здесь выступает метод ЗаблокироватьДанныеФормыДляРедактирования(). Важно понимать, что этот метод работает именно в контексте управляемой формы и предназначен для того, чтобы «подхватить» блокировку и дать знать платформе, что текущий пользователь намерен изменять данные.
Для первого пользователя, который открывает объект для редактирования, необходимо вызвать метод, который установит признак начала редактирования. Простой установки свойства Модифицированность в событии ПриСозданииНаСервере будет недостаточно, так как это не активирует механизм блокировок платформы.
Мы должны использовать метод ЗаблокироватьДанныеФормыДляРедактирования(). Однако, опыт показывает, что вызов этого метода непосредственно в обработчике ПриСозданииНаСервере может быть преждевременным, так как форма еще не завершила процесс своей инициализации.
Когда второй пользователь открывает ту же форму, платформа должна проверить наличие блокировки. Чтобы добиться максимально «типового» поведения, мы можем программно вызвать этот же метод при открытии формы. Таким образом, платформа сама «почувствует» конфликт и инициирует стандартное диалоговое окно с предупреждением.
В процессе совместной работы над задачей мы пришли к выводу, что наиболее стабильный способ — это использование ПодключитьОбработчикОжидания. Это позволяет форме завершить все этапы отрисовки и инициализации элементов управления перед тем, как система попытается наложить блокировку.
Давайте посмотрим на пример кода, который можно применить в модуле формы:
&НаКлиенте
Процедура ПриОткрытии()
// Используем обработчик ожидания для корректной инициализации формы
ПодключитьОбработчикОжидания("БлокировкаДанныхПриОткрытии", 0.1, Истина);
КонецПроцедуры
&НаКлиенте
Процедура БлокировкаДанныхПриОткрытии()
Попытка
ЗаблокироватьДанныеФормыДляРедактирования();
Исключение
// Здесь можно обработать ситуацию, если блокировка не удалась
// или объект уже занят
КонецПопытки;
КонецПроцедуры
ЗаблокироватьДанныеФормыДляРедактирования() — это не транзакционная блокировка СУБД. Это механизм управления состоянием пользовательского интерфейса. Он не защищает от записи из кода напрямую, а именно управляет поведением формы.Попытка...Исключение, чтобы не допустить «падения» клиента.БлокировкаДанных в модуле объекта или при выполнении серверных операций. Однако это не выведет стандартное окно с сообщением, которое ожидает пользователь.Таким образом, мы выяснили, что для решения поставленной задачи оптимально подходит комбинация ЗаблокироватьДанныеФормыДляРедактирования() и ПодключитьОбработчикОжидания. Этот подход позволяет добиться ожидаемого поведения платформы, минимизируя при этом риск возникновения ошибок в процессе открытия формы.