"При изменении" подсистемы. Отлавливаем событие

28 декабря 2012

Файлы для загрузки:

Демонстрационная конфигурация

Преамбула

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

Подсистемы

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

Постановка задачи

Допустим, нам необходимо выводить пользователю сообщение о том, что он перешел на ту или иную подсистему. Первое, что может придти на ум - посмотреть стандартное событие для подсистем(ы) - "ПриИзменении". Но увы, такого события нет и стандартным способом отлавливать переход пользователя между подсистемами не удастся.

Чтобы отлавливать это событие воспользуемся механизмом навигационных ссылок. Если кратко, то навигационная ссылка представляет собой ссылку на объект информационной базы или отдельную форму (!). Воспользуемся последним. При изменении подсистемы мы будем отслеживать навигационную ссылку на текущее окно приложения. При изменении активного окна изменяется и навигационная ссылка. Если установлен факт изменения подсистемы, то пользователю выводится соответствующее оповещение.

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

Алгоритмы

В модуле управляемого приложения инициализируем глобальную переменную "ТекущаяПодсистема". Она имеет строковой тип и хранит название подсистемы. 

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

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

e1cib/navigationpoint/Подсистема2/Документ.Документ2.Команда.ОткрытьСписок

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

Как мы видим, название подсистемы находится сразу после текста "e1cib/navigationpoint/"и до следующего знака  "/"

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

В итоге мы получим следующий код в модуле приложения:

Пример кода

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

Как это выглядит?

Демонстрация примера представлена на следующем видео.

В конфигурации, используемой в примере, есть специальный новогодний бонус! Чтобы его посмотреть, скачайте демонстрационную конфигурацию по ссылке ниже и перейдите последовательно по подсистемам с первой по пятую. =)

ВЫВОДЫ

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

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


comments powered by Disqus