Как активизировать открытую общую форму со списком и позиционировать курсор на документе?

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

Разберем распространенную задачу разработки в управляемом интерфейсе 1С: требуется из формы документа перейти к уже открытой общей форме со списком, активизировать ее окно и выделить текущий документ. Часто разработчики пробуют решить это через серверный обработчик ОбработкаПолученияФормы в модуле менеджера, однако сталкиваются с тем, что платформа каждый раз открывает новый дубликат формы вместо переключения на уже существующее окно.

Проанализируем причины такого поведения платформы и подробно рассмотрим надежные способы реализации требуемого поведения.

Почему не подходит событие ОбработкаПолученияФормы

Выясним причину, по которой стандартная попытка перехвата не приносит желаемого результата:

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

Единственным правильным решением является замена стандартной кнопки на форму документа собственной командой с последующим управлением окнами на клиенте. Рассмотрим подробнее основные варианты реализации.

Вариант 1. Использование единого ключа уникальности и метода ОткрытьФорму

Этот способ основан на механизме платформы по поиску уже открытых экземпляров управляемых форм. Если форма открывается с одинаковым параметром КлючУникальности, платформа не дублирует окно, а активизирует существующее и вызывает в нем обработчик ПриПовторномОткрытии.

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

  1. При первом открытии общей формы в интерфейсе (например, из панели разделов) задаем уникальный строковый ключ.
  2. В форме документа создаем собственную команду вместо стандартной «Показать в списке». В обработчике команды вызываем метод ОткрытьФорму с тем же самым ключом уникальности, передавая в параметрах ссылку на текущий документ:

&НаКлиенте
Процедура ПоказатьВОбщемСписке(Команда)
    ПараметрыПерехода = Новый Структура("ТекущаяСтрока", Объект.Ссылка);
    ОткрытьФорму("ОбщаяФорма.ИмяОбщейФормы", ПараметрыПерехода, ЭтотОбъект, "КлючМоейОбщейФормы");
КонецПроцедуры

Теперь перейдем к модулю общей формы. В нем необходимо перехватить переданный параметр и спозиционировать динамический список:


&НаКлиенте
Процедура ПриПовторномОткрытии(Параметры)
    Если Параметры <> Неопределено И Параметры.Свойство("ТекущаяСтрока") Тогда
        Элементы.Список.ТекущаяСтрока = Параметры.ТекущаяСтрока;
    КонецЕсли;
КонецПроцедуры

В данном сценарии платформа самостоятельно переведет фокус на окно общей формы, а код в обработчике выделит нужный документ в таблице.

Вариант 2. Механизм глобальных клиентских оповещений

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

В модуле формы документа в обработчике команды отправляем оповещение всей клиентской сессии при помощи метода Оповестить:


&НаКлиенте
Процедура ПоказатьВОбщемСписке(Команда)
    Оповестить("АктивизироватьДокументВОбщемСписке", Объект.Ссылка, ЭтотОбъект);
КонецПроцедуры

В модуле общей формы определяем стандартный обработчик ОбработкаОповещения, где принудительно переводим фокус на окно формы и меняем текущую строку:


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

Метод ЭтаФорма.Активизировать() выводит общую форму на передний план среди открытых вкладок рабочей области, а свойство таблицы ТекущаяСтрока позиционирует динамический список на переданной ссылке.

Важные нюансы при позиционировании

Обратим внимание на несколько практических моментов при работе с динамическим списком:

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