Как открыть форму внешней обработки в 1С поверх всех окон без блокировки интерфейса?

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

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

К сожалению, стандартный подход с использованием свойства РежимОткрытияОкнаФормы.БлокироватьОкноВладельца или РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс делает работу с другими окнами невозможной. Если же установить режим РежимОткрытияОкнаФормы.Независимый, то в современном интерфейсе «Такси» форма просто откроется как очередная вкладка на панели открытых окон, теряя свойство «поверх всех остальных».

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

Почему встроенный калькулятор работает иначе?

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

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

Исторический контекст и ограничения веб-клиента

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

  1. Из настроек системы была удалена опция «Формы в отдельных окнах».
  2. Использование свойства ВариантОткрытияОкна.ОтдельноеОкно было признано устаревшим и не рекомендуемым стандартами разработки.

Основная причина кроется в обеспечении кроссплатформенности и стабильной работы в веб-клиенте. Современные веб-браузеры (Chrome, Firefox, Safari) блокируют неинициированные пользователем всплывающие окна (pop-up) в рамках политики безопасности. Кроме того, эмуляция многооконного интерфейса внутри одной вкладки браузера крайне непроизводительна. Поэтому поведение интерфейса «Такси» жестко ориентировано на одностраничную работу (Single Page Application).

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

Способ А. Использование ключа запуска /isdi (многооконный режим)

Если для вашей организации критически важно иметь возможность выносить формы за пределы основного окна 1С и располагать их на рабочем столе компьютера, мы можем принудительно вернуть платформу в многооконный режим (SDI). Для этого используется специальный ключ запуска.

Проанализируем шаги по его настройке:

  1. Запустите программу просмотра и выбора баз (стартер 1С).
  2. Выделите нужную информационную базу и нажмите кнопку «Изменить».
  3. Перейдите на страницу дополнительных параметров запуска (последний шаг настройки).
  4. В поле «Дополнительные параметры запуска» введите параметр: /isdi.
  5. Сохраните изменения и запустите базу.

После этого приложение перейдет в режим свободных окон. Теперь при открытии формы в коде программы с режимом открытия РежимОткрытияОкнаФормы.Независимый она откроется в отдельном полноценном окне Windows. Вы сможете переместить ее на второй монитор, закрепить или расположить поверх основного окна 1С, продолжая при этом параллельно редактировать документы.

Пример кода для открытия такой формы:


ПараметрыФормы = Новый Структура;
ОткрытьФорму(
    "ВнешняяОбработка.МояВнешняяОбработка.Форма.ФормаНастройки", 
    ПараметрыФормы, 
    , 
    Истина, 
    РежимОткрытияОкнаФормы.Независимый
);

Способ Б. Программный лайфхак с «формой-пустышкой»

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

Для реализации этого метода выполним следующие шаги:

  1. Создадим в конфигурации или непосредственно внутри нашей внешней обработки простую форму-пустышку (без реквизитов и элементов).
  2. Напишем код, который сначала открывает форму-пустышку в режиме блокировки всего интерфейса.
  3. Сразу же вслед за ней откроем нашу целевую форму в независимом режиме.
  4. Мгновенно закроем форму-пустышку.

Посмотрим на пример программной реализации этого лайфхака:


// 1. Получаем форму-пустышку, предназначенную для блокировки интерфейса
ФормаБлокировки = ПолучитьФорму("ВнешняяОбработка.МояОбработка.Форма.ФормаПустышка");
ФормаБлокировки.РежимОткрытияОкна = РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс;
ФормаБлокировки.Открыть();

// 2. Сразу открываем целевую рабочую форму в независимом режиме
РабочаяФорма = ПолучитьФорму("ВнешняяОбработка.МояОбработка.Форма.ОсновнаяФорма");
РабочаяФорма.РежимОткрытияОкна = РежимОткрытияОкнаФормы.Независимый;
РабочаяФорма.Открыть();

// 3. Закрываем блокирующую форму-пустышку
ФормаБлокировки.Закрыть();

Благодаря этой последовательности оконный менеджер 1С «выдавит» независимую форму во внешнее свободное окно операционной системы. При этом интерфейс основного приложения разблокируется в момент закрытия пустышки, а целевое окно останется плавающим поверх главного окна 1С.

Способ В. Обучение пользователей интерактивному переносу окон

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

Рассмотрим алгоритм действий пользователя:

  1. Программа открывает внешнюю обработку в виде обычной вкладки в панели открытых.
  2. Пользователь кликает правой кнопкой мыши по заголовку этой вкладки.
  3. В контекстном меню выбирает пункт «Открыть в отдельном окне» (или просто перетаскивает заголовок вкладки мышью за пределы главного окна программы).

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

Способ Г. Использование Системы взаимодействия

Проанализируем альтернативный сценарий. Что делать, если наша обработка предназначена для оперативного вывода важной информации (например, карточки клиента при входящем звонке в системах IP-телефонии)? В таких случаях стандартные формы часто оказываются избыточными и неудобными.

Для решения подобных задач рекомендуется использовать штатный механизм платформы — «Систему взаимодействия». Всплывающие уведомления этой системы выводятся поверх абсолютно всех окон 1С (и даже поверх других запущенных программ в Windows, в зависимости от настроек), работают асинхронно и гарантированно не блокируют ввод данных в текущих документах пользователя. Это наиболее современный и методологически верный подход, рекомендуемый фирмой «1С» для реализации асинхронных всплывающих форм.

← На главную