Как в 1С программно проверить, открыта ли форма конкретного объекта

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

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

Архитектурные ограничения платформы

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

Метод ПолучитьОкна() возвращает коллекцию ОкнаКлиентскогоПриложения и доступен только на клиенте (в тонком, толстом и веб-клиенте). Вызвать его на сервере от имени другого сеанса невозможно.

Способ 1. Обход открытых окон в текущем сеансе через ПолучитьОкна()

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

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

Посмотрим на пример клиентской функции, выполняющей поиск открытой формы элемента справочника:


&НаКлиенте
Функция ФормаОбъектаОткрыта(СсылкаНаОбъект)
    
    Окна = ПолучитьОкна();
    Для Каждого Окно Из Окна Цикл
        Для Каждого Форма Из Окно.Содержимое Цикл
            // Проверяем тип и соответствие открытого объекта
            Если Форма.ИмяФормы = "Справочник.Контрагенты.Форма.ФормаЭлемента" Тогда
                Если Форма.Параметры.Свойство("Ключ") И Форма.Параметры.Ключ = СсылкаНаОбъект Тогда
                    Возврат Истина;
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
    
    Возврат Ложь;

КонецФункции

Способ 2. Использование параметра уникальности формы

Если задача заключается в том, чтобы не допустить открытия дубликата формы, эффективнее использовать штатный механизм уникальности платформы. При вызове процедур ОткрытьФорму() или ПолучитьФорму() в качестве параметра Уникальность передается ссылка на объект.

Разберем пример:


&НаКлиенте
Процедура ОткрытьКарточкуКонтрагента(СсылкаНаКонтрагента)
    
    ПараметрыФормы = Новый Структура("Ключ", СсылкаНаКонтрагента);
    // Передавая ссылку в параметр Уникальность, мы указываем платформе активизировать
    // уже существующую форму, если она была открыта ранее в данном сеансе
    ОткрытьФорму("Справочник.Контрагенты.Форма.ФормаЭлемента", ПараметрыФормы, , СсылкаНаКонтрагента);

КонецПроцедуры

Способ 3. Отслеживание открытых форм у других пользователей

Когда требуется контролировать открытие карточек объектов разными пользователями информационной базы, применяются обходные механизмы фиксации состояния:

  1. Регистрация в регистре сведений: в событиях формы ПриОткрытии и ПередЗакрытием (или ПриЗакрытии) выполняется запись и удаление данных о том, какой пользователь и в каком сеансе открыл объект. Для исключения «зависших» записей при аварийном завершении клиентов список сеансов сопоставляется через ПолучитьСеансыИнформационнойБазы().
  2. Проверка блокировки на редактирование: если цель — узнать, не редактирует ли карточку другой пользователь, используется попытка установки пессимистической блокировки через метод ЗаблокироватьДанныеДляРедактирования(). При наличии блокировки в блоке Исключение можно получить имя заблокировавшего пользователя.
  3. Система взаимодействия: при активной Системе взаимодействия можно организовать фоновый обмен служебными сообщениями между сеансами для опроса состояния интерфейса клиента.
← На главную