При проектировании пользовательских интерфейсов в среде «1С:Предприятие 8.3» разработчики часто сталкиваются с задачей создания вспомогательных инструментов. Это могут быть калькуляторы, панели быстрого набора номеров для телефонии, текстовые блокноты или мини-отчеты. Логичное желание пользователя в данном случае — видеть форму такой обработки всегда перед глазами (поверх других окон), но при этом иметь возможность свободно переключаться на документы, справочники и отчеты, редактируя их без закрытия вспомогательного окна.
К сожалению, стандартный подход с использованием свойства РежимОткрытияОкнаФормы.БлокироватьОкноВладельца или РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс делает работу с другими окнами невозможной. Если же установить режим РежимОткрытияОкнаФормы.Независимый, то в современном интерфейсе «Такси» форма просто откроется как очередная вкладка на панели открытых окон, теряя свойство «поверх всех остальных».
В этой статье мы подробно разберем, почему платформа ведет себя именно так, рассмотрим системные ограничения и изучим эффективные обходные пути (лайфхаки), которые помогут решить эту задачу в Тонком и Толстом клиентах.
Многие разработчики обращают внимание на то, что встроенные в платформу инструменты (например, календарь, калькулятор или сравнение файлов) ведут себя именно так, как требуется: они отображаются в виде отдельных плавающих окон и не блокируют работу с основным интерфейсом. Возникает логичный вопрос: почему нельзя настроить форму внешней обработки аналогичным образом?
Выясним причину этого поведения. Дело в том, что системные инструменты платформы реализованы на низком уровне ядра (C++). Они задействуют прямые вызовы API операционной системы для отрисовки окон поверх основного приложения. К сожалению, разработчик прикладного решения ограничен рамками встроенного языка 1С и объектной моделью управляемых форм, которая не предоставляет прямого доступа к дескрипторным механизмам операционной системы. Поэтому полностью повторить поведение встроенного калькулятора штатными методами управляемой формы невозможно.
Ранее в платформе «1С:Предприятие» существовала возможность открывать формы в независимых плавающих окнах благодаря свойству ВариантОткрытияОкна.ОтдельноеОкно. Однако, начиная с версии платформы 8.3.10, фирма «1С» взяла курс на унификацию интерфейса под веб-стандарты:
ВариантОткрытияОкна.ОтдельноеОкно было признано устаревшим и не рекомендуемым стандартами разработки.Основная причина кроется в обеспечении кроссплатформенности и стабильной работы в веб-клиенте. Современные веб-браузеры (Chrome, Firefox, Safari) блокируют неинициированные пользователем всплывающие окна (pop-up) в рамках политики безопасности. Кроме того, эмуляция многооконного интерфейса внутри одной вкладки браузера крайне непроизводительна. Поэтому поведение интерфейса «Такси» жестко ориентировано на одностраничную работу (Single Page Application).
Тем не менее, если ваши пользователи работают преимущественно через Тонкий или Толстый клиент под управлением Windows, мы можем применить несколько практических приемов для обхода этого ограничения.
Если для вашей организации критически важно иметь возможность выносить формы за пределы основного окна 1С и располагать их на рабочем столе компьютера, мы можем принудительно вернуть платформу в многооконный режим (SDI). Для этого используется специальный ключ запуска.
Проанализируем шаги по его настройке:
/isdi.После этого приложение перейдет в режим свободных окон. Теперь при открытии формы в коде программы с режимом открытия РежимОткрытияОкнаФормы.Независимый она откроется в отдельном полноценном окне Windows. Вы сможете переместить ее на второй монитор, закрепить или расположить поверх основного окна 1С, продолжая при этом параллельно редактировать документы.
Пример кода для открытия такой формы:
ПараметрыФормы = Новый Структура;
ОткрытьФорму(
"ВнешняяОбработка.МояВнешняяОбработка.Форма.ФормаНастройки",
ПараметрыФормы,
,
Истина,
РежимОткрытияОкнаФормы.Независимый
);
Рассмотрим неочевидный программный трюк, который позволяет обойти стандартное поведение интерфейса «Такси» в Тонком клиенте без изменения глобальных параметров запуска всей системы. Суть метода заключается в создании кратковременного конфликта оконного менеджера платформы.
Для реализации этого метода выполним следующие шаги:
Посмотрим на пример программной реализации этого лайфхака:
// 1. Получаем форму-пустышку, предназначенную для блокировки интерфейса
ФормаБлокировки = ПолучитьФорму("ВнешняяОбработка.МояОбработка.Форма.ФормаПустышка");
ФормаБлокировки.РежимОткрытияОкна = РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс;
ФормаБлокировки.Открыть();
// 2. Сразу открываем целевую рабочую форму в независимом режиме
РабочаяФорма = ПолучитьФорму("ВнешняяОбработка.МояОбработка.Форма.ОсновнаяФорма");
РабочаяФорма.РежимОткрытияОкна = РежимОткрытияОкнаФормы.Независимый;
РабочаяФорма.Открыть();
// 3. Закрываем блокирующую форму-пустышку
ФормаБлокировки.Закрыть();
Благодаря этой последовательности оконный менеджер 1С «выдавит» независимую форму во внешнее свободное окно операционной системы. При этом интерфейс основного приложения разблокируется в момент закрытия пустышки, а целевое окно останется плавающим поверх главного окна 1С.
Если мы не хотим прибегать к неофициальным программным трюкам, которые могут перестать работать в будущих обновлениях платформы, мы можем использовать штатные интерактивные возможности интерфейса «Такси». Начиная с версии 8.3, пользователи Тонкого клиента могут самостоятельно управлять расположением вкладок.
Рассмотрим алгоритм действий пользователя:
Форма превращается в независимое плавающее окно, которое можно расположить поверх остальных элементов. Чтобы помочь пользователю сориентироваться, мы можем добавить в верхнюю часть формы нашей внешней обработки яркую текстовую подсказку (декорацию) с кратким описанием этих шагов.
Проанализируем альтернативный сценарий. Что делать, если наша обработка предназначена для оперативного вывода важной информации (например, карточки клиента при входящем звонке в системах IP-телефонии)? В таких случаях стандартные формы часто оказываются избыточными и неудобными.
Для решения подобных задач рекомендуется использовать штатный механизм платформы — «Систему взаимодействия». Всплывающие уведомления этой системы выводятся поверх абсолютно всех окон 1С (и даже поверх других запущенных программ в Windows, в зависимости от настроек), работают асинхронно и гарантированно не блокируют ввод данных в текущих документах пользователя. Это наиболее современный и методологически верный подход, рекомендуемый фирмой «1С» для реализации асинхронных всплывающих форм.