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

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

В процессе разработки на платформе 1С:Предприятие часто возникает задача монопольного использования конкретной формы обработки. Например, чтобы два мастера не могли одновременно открыть список работ и взять одно и то же задание. Разберемся, почему стандартные методы не работают в управляемом приложении и как реализовать надежную защиту.

Почему стандартные методы не подходят?

Многие разработчики на старте пытаются использовать методы Форма.Открыта() или ЭтотОбъект.Заблокировать(). Однако важно понимать: в клиент-серверной архитектуре состояние формы существует только на стороне клиента. Сервер не имеет информации о том, открыта ли у пользователя форма, пока мы явно не зафиксируем этот факт в базе данных.

Метод Заблокировать() предназначен для блокировки объектов данных, а не визуальных форм. Для управляемых форм необходимо использовать специализированные механизмы, которые будут доступны всем сеансам пользователей в системе.

Решение через Регистр Сведений (Рекомендуемый подход)

Наиболее надежным способом является создание непериодического независимого РегистрСведений. В нем мы будем фиксировать факт открытия обработки, привязывая его к конкретному сеансу пользователя.

  1. Создайте регистр сведений, например, с измерениями ИмяОбработки и ИдентификаторСеанса (или Пользователь).
  2. При открытии формы (событие ПриСозданииНаСервере) проверяйте, есть ли в регистре активная запись для данной обработки.
  3. Если записи нет — создавайте её, если есть — выдавайте пользователю сообщение об ошибке и запрещайте открытие формы.
  4. При закрытии формы (событие ПриЗакрытии) обязательно удаляйте соответствующую запись из регистра.

Рассмотрим пример логики записи при открытии:


// Пример на сервере
Процедура ЗарегистрироватьОткрытие()
    НаборЗаписей = РегистрыСведений.АктивныеОбработки.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Пользователь.Установить(ПараметрыСеанса.ТекущийПользователь);
    Запись = НаборЗаписей.Добавить();
    Запись.Пользователь = ПараметрыСеанса.ТекущийПользователь;
    Запись.ИмяОбработки = "ОбработкаМастера";
    НаборЗаписей.Записать();
КонецПроцедуры

Проблема некорректного закрытия и пути её решения

Как справедливо заметили участники обсуждения, если 1С закрывается принудительно (например, через диспетчер задач или из-за отключения электроэнергии), событие ПриЗакрытии не отработает, и запись в регистре останется «висеть» бесконечно. Это приведет к тому, что никто другой не сможет открыть обработку.

Чтобы избежать такой ситуации, используйте механизм проверки активности сеансов:

  1. При попытке открытия обработки проверяйте не только наличие записи в регистре, но и существование соответствующего сеанса в системе.
  2. Используйте метод ПолучитьСеансыИнформационнойБазы().
  3. Если сеанс, указанный в регистре, отсутствует в списке активных, значит, предыдущий пользователь завершил работу некорректно — смело очищайте эту запись из регистра.

Использование блокировок данных

Если вы хотите использовать более строгие методы, можно задействовать объект БлокировкаДанных. Суть метода заключается в создании записи в специальном справочнике-флаге, на которую накладывается управляемая блокировка.

Это выглядит следующим образом:


Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("Справочник.БлокировкиОбработок");
ЭлементБлокировки.УстановитьЗначение("Код", "Мастер");
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
Блокировка.Заблокировать();

Важно помнить: этот механизм не блокирует само открытие формы, а запрещает параллельное выполнение определенных серверных действий. Поэтому использование регистра сведений в связке с РегламентныеЗадания (для очистки зависших сеансов) является наиболее профессиональным и отказоустойчивым решением.

Резюме

Для реализации контроля доступа к обработке:

Такой подход обеспечит стабильную работу мастеров и исключит конфликты редактирования данных, при этом не создавая неудобств администраторам системы.

← На главную