При разработке на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда стандартные механизмы управления интерфейсом ведут себя не так, как ожидается. Типичный пример — попытка открыть форму в отдельном независимом окне, используя программный код, который успешно работает в типовых конфигурациях (например, в БСП). Несмотря на явное указание параметра ВариантОткрытияОкна.ОтдельноеОкно, система настойчиво открывает форму в новой закладке основного окна. Разберем детально, почему это происходит и какие существуют пути решения данной задачи.
Рассмотрим ситуацию на конкретном примере. Представим, что мы реализуем механизм оповещений, где форма должна висеть отдельным окном, не мешая работе в основной вкладке. Программист использует классический подход, аналогичный библиотеке стандартных подсистем:
ИмяПараметра = "Оповещения.ФормаНаступившиеОповещения";
Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда
#Если ВебКлиент Тогда
Окно = Неопределено;
#Иначе
Окно = ВариантОткрытияОкна.ОтдельноеОкно;
#КонецЕсли
ИмяФормыОповещения = "РегистрСведений.ЭС_АктивныеОповещения.Форма.ФормаНаступившиеОповещения";
// Пытаемся получить форму с указанием варианта открытия
ПараметрыПриложения.Вставить(ИмяПараметра, ПолучитьФорму(ИмяФормыОповещения, , , , Окно));
КонецЕсли;
ФормаОповещения = ПараметрыПриложения[ИмяПараметра];
ФормаОповещения.Открыть();
В данном коде используется метод ПолучитьФорму, где пятым параметром передается объект ВариантОткрытияОкна.ОтдельноеОкно. Логика проста: если мы не в веб-клиенте, форма должна открыться как самостоятельное окно Windows. Однако на практике в современных версиях платформы форма все равно открывается в закладке. Выясним, в чем кроется истинная причина такого поведения.
Проанализируем документацию к обновлениям платформы. Начиная с версии 8.3.10, архитектура интерфейса «Такси» претерпела значительные изменения. Фирма «1С» взяла курс на унификацию работы тонкого и веб-клиента. Главное изменение заключается в следующем: в тонком клиенте параметр «Окно» игнорируется, если у конфигурации отключен режим совместимости (или установлен режим 8.3.10 и выше).
Это сделано для обеспечения кроссплатформенности и стабильности. В веб-клиенте браузеры часто блокируют всплывающие окна (pop-up), что делало работу некоторых механизмов 1С невозможной. Чтобы поведение системы было предсказуемым везде, разработчики платформы решили отказаться от программного форсирования отдельных окон в пользу вкладок внутри единого рабочего пространства.
Самый простой, но технически спорный способ вернуть прежнее поведение — изменить Режим совместимости в свойствах корня конфигурации. Если установить его в значение 8.3.9 или ниже, параметр ВариантОткрытияОкна.ОтдельноеОкно снова начнет учитываться платформой.
Однако мы должны понимать риски этого пути. Рассмотрим, что мы теряем при откате совместимости:
JSON, HTTP и новыми объектами встроенного языка может стать ограниченной.Таким образом, этот метод подходит только для старых систем, которые не планируется активно развивать с использованием новых фишек платформы.
Если нам нужно, чтобы окна открывались отдельно, мы можем изменить настройки самого клиентского приложения. Рассмотрим, как это сделать без изменения кода:
После этого все формы, открываемые в системе, будут появляться в виде независимых окон Windows. Проблема этого метода в том, что это индивидуальная настройка пользователя. Мы не можем программно навязать её всем пользователям через код 1С, если конфигурация работает в режиме без совместимости.
Если наша задача — обязательно вывести форму поверх остальных так, чтобы пользователь её не пропустил, мы можем воспользоваться свойством формы РежимОткрытияОкна. Рассмотрим программную установку этого режима:
Форма = ПолучитьФорму("ОбщаяФорма.МояФорма");
Форма.РежимОткрытияОкна = РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс;
Форма.Открыть();
При использовании РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс или РежимОткрытияОкнаФормы.БлокироватьВладельца платформа создает всплывающее модальное (или немодальное, но перекрывающее) окно, которое визуально отделено от панели закладок. Это наиболее близкий к «отдельному окну» вариант в современном интерфейсе, хотя он и ограничивает взаимодействие с основным окном (в случае блокировки интерфейса).
Проанализируем ситуацию, когда отдельное окно нужно именно для уведомлений. Современный стандарт разработки (включая БСП и Систему взаимодействия) предлагает отказаться от практики «висящих» окон в пользу более нативных механизмов:
Мы выяснили, что неработоспособность ВариантОткрытияОкна.ОтдельноеОкно — это не ошибка кода, а сознательное решение разработчиков платформы 1С, начиная с версии 8.3.10. Для решения задачи мы рекомендуем: