Почему ВариантОткрытияОкна.ОтдельноеОкно не работает и как заставить форму открыться в отдельном окне

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

При разработке на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда стандартные механизмы управления интерфейсом ведут себя не так, как ожидается. Типичный пример — попытка открыть форму в отдельном независимом окне, используя программный код, который успешно работает в типовых конфигурациях (например, в БСП). Несмотря на явное указание параметра ВариантОткрытияОкна.ОтдельноеОкно, система настойчиво открывает форму в новой закладке основного окна. Разберем детально, почему это происходит и какие существуют пути решения данной задачи.

Анализ исходной проблемы и программного кода

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


ИмяПараметра = "Оповещения.ФормаНаступившиеОповещения";
Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда
    #Если ВебКлиент Тогда
        Окно = Неопределено;
    #Иначе
        Окно = ВариантОткрытияОкна.ОтдельноеОкно;
    #КонецЕсли
    
    ИмяФормыОповещения = "РегистрСведений.ЭС_АктивныеОповещения.Форма.ФормаНаступившиеОповещения";
    // Пытаемся получить форму с указанием варианта открытия
    ПараметрыПриложения.Вставить(ИмяПараметра, ПолучитьФорму(ИмяФормыОповещения, , , , Окно));
КонецЕсли;

ФормаОповещения = ПараметрыПриложения[ИмяПараметра];
ФормаОповещения.Открыть();

В данном коде используется метод ПолучитьФорму, где пятым параметром передается объект ВариантОткрытияОкна.ОтдельноеОкно. Логика проста: если мы не в веб-клиенте, форма должна открыться как самостоятельное окно Windows. Однако на практике в современных версиях платформы форма все равно открывается в закладке. Выясним, в чем кроется истинная причина такого поведения.

Технологические изменения в платформе 8.3.10 и выше

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

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

Вариант 1: Использование режима совместимости

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

Однако мы должны понимать риски этого пути. Рассмотрим, что мы теряем при откате совместимости:

  1. Развитие расширений: Многие современные возможности расширений (создание собственных объектов метаданных, изменение структуры таблиц) требуют актуального режима совместимости.
  2. Производительность: Теряются оптимизации запросов и работы с базой данных, добавленные в последних релизах.
  3. Современные типы: Работа с JSON, HTTP и новыми объектами встроенного языка может стать ограниченной.

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

Вариант 2: Пользовательская настройка интерфейса

Если нам нужно, чтобы окна открывались отдельно, мы можем изменить настройки самого клиентского приложения. Рассмотрим, как это сделать без изменения кода:

  1. Зайдите в главное меню программы (в верхнем левом углу).
  2. Выберите пункт Настройки — Параметры.
  3. В разделе «Внешний вид» найдите настройку Режим открытия форм.
  4. Переключите значение с «В закладках» на «В отдельных окнах».

После этого все формы, открываемые в системе, будут появляться в виде независимых окон Windows. Проблема этого метода в том, что это индивидуальная настройка пользователя. Мы не можем программно навязать её всем пользователям через код 1С, если конфигурация работает в режиме без совместимости.

Вариант 3: Использование блокирующих режимов

Если наша задача — обязательно вывести форму поверх остальных так, чтобы пользователь её не пропустил, мы можем воспользоваться свойством формы РежимОткрытияОкна. Рассмотрим программную установку этого режима:


Форма = ПолучитьФорму("ОбщаяФорма.МояФорма");
Форма.РежимОткрытияОкна = РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс;
Форма.Открыть();

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

Альтернативные подходы к оповещениям

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

Итог

Мы выяснили, что неработоспособность ВариантОткрытияОкна.ОтдельноеОкно — это не ошибка кода, а сознательное решение разработчиков платформы 1С, начиная с версии 8.3.10. Для решения задачи мы рекомендуем:

  1. Если важна современная функциональность — использовать стандартный интерфейс с закладками и пересмотреть эргономику приложения.
  2. Для критически важных уведомлений — использовать модальные окна или режимы блокировки интерфейса.
  3. В крайнем случае (для узкоспециализированных АРМ) — переключать настройки клиента в режим «В отдельных окнах» вручную у каждого пользователя.
← На главную