Как программно развернуть управляемую форму на весь экран?

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

При разработке интерфейсов в 1С:Предприятие, особенно при создании "Рабочих столов" или мониторов руководителя (удобно проектировать через конструктор адаптивных рабочих столов и интерфейсов в 1С), часто возникает задача открыть форму сразу развернутой на весь экран (максимизированной). В обычном приложении (толстый клиент, обычные формы) это делалось элементарно, но при переходе на управляемые формы разработчики столкнулись с отсутствием очевидных инструментов в ранних версиях платформы.

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

В чем суть проблемы?

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

Однако, как справедливо замечено в обсуждении, в управляемых формах (особенно до версии 8.3.10) прямой доступ к управлению состоянием окна был ограничен. Попытка использовать старый код приводит к ошибке Поле объекта не обнаружено, так как управляемая форма рендерится иначе, и логика управления окнами отдана на откуп веб-ориентированной архитектуре.

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

Способ 1. Штатное решение (для платформы 8.3.10 и выше)

Начнем с самого правильного и надежного метода. Если ваша конфигурация работает в режиме совместимости с версией 8.3.10 или выше (или режим совместимости отключен вовсе), у управляемой формы появился объект Окно. Через него мы можем напрямую управлять состоянием окна операционной системы, в котором открыта форма.

Для этого в модуле формы, в процедуре ПриОткрытии, необходимо написать следующий код:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    Если ЭтаФорма.Окно <> Неопределено Тогда
        ЭтаФорма.Окно.Состояние = ВариантСостоянияОкна.Максимизированное;
    КонецЕсли;
КонецПроцедуры

Разберем этот код:

  1. Мы обращаемся к свойству ЭтаФорма.Окно. Это свойство доступно только на клиенте.
  2. Устанавливаем Состояние в значение системного перечисления ВариантСостоянияОкна.Максимизированное.

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

Способ 2. Использование свойства "Режим рабочего стола"

В обсуждении участники упомянули свойство формы "РежимРабочегоСтола". Давайте посмотрим, как оно работает и чем отличается от простого разворачивания окна.

Это свойство задается в палитре свойств самой формы (в конфигураторе). Если установить галочку РежимРабочегоСтола в значение Истина, произойдет следующее:

  1. Форма откроется на всю доступную область главного окна приложения.
  2. Важно: У формы пропадут границы, заголовок и стандартные кнопки управления окном (Свернуть, Развернуть, Закрыть).
  3. Форма окажется как бы "вклеенной" в интерфейс.

Этот вариант идеально подходит, если вы действительно создаете АРМ (Автоматизированное Рабочее Место), из которого пользователю не нужно выходить, и которое должно занимать все пространство. Однако, если вам нужно просто развернутое окно, которое можно свернуть или переместить, этот метод не подойдет.

Способ 3. Эмуляция нажатия клавиш (WScript.Shell)

Если вам приходится работать со старой версией платформы (ниже 8.3.10) или специфическими условиями запуска, где свойство Окно недоступно, разработчики часто прибегают к использованию COM-объекта WScript.Shell. Этот метод упоминается в теме как рабочее решение.

Суть метода заключается в том, чтобы программно "нажать" комбинацию клавиш, которая в Windows отвечает за разворачивание окна. Обычно это комбинация клавиш, вызывающая системное меню и выбирающая пункт "Развернуть".

Рассмотрим пример кода, который нужно поместить в процедуру ПриОткрытии:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    #Если Не ВебКлиент Тогда
        Попытка
            WSHShell = Новый COMОбъект("WScript.Shell");
            // Вариант 1: Shift + Ctrl + ~ (работает в некоторых раскладках)
            // WSHShell.SendKeys("^+({~})"); 
            
            // Вариант 2: Имитация Alt + Space (вызов меню) + стрелки + Enter
            // Последовательность может зависеть от версии ОС и языка
            WSHShell.SendKeys("%( )x"); // Alt+Space, затем x (Maximize в англ. версии)
        Исключение
            // Обработка ошибки, если COM-объект запрещен политиками безопасности
        КонецПопытки;
    #КонецЕсли
КонецПроцедуры

В обсуждении также предлагался вариант с многократным нажатием стрелок:

WSHShell.SendKeys("%{-}{DOWN}{DOWN}{DOWN}{DOWN}{ENTER}");

Здесь %{-} имитирует вызов системного меню (аналог клика по иконке в левом верхнем углу), далее идут нажатия "Вниз", чтобы добраться до пункта "Развернуть", и "Enter".

Недостатки этого метода:

  1. Ненадежность: Метод зависит от фокуса ввода. Если пользователь в момент открытия формы кликнет мышкой в другом месте, клавиши отправятся не туда.
  2. Зависимость от языка ОС: Горячие клавиши или количество нажатий стрелок в меню могут отличаться в русской и английской версиях Windows.
  3. Безопасность: Использование COM-объектов может быть заблокировано администраторами системы или настройками браузера (в веб-клиенте это работать не будет).

Способ 4. Настройка "Рабочей области начальной страницы"

Если ваша цель — сделать так, чтобы обработка открывалась сразу при запуске 1С и занимала всё место (как рабочий стол), то в современных конфигурациях лучше использовать не программный код ПриНачалеРаботыСистемы, а декларативную настройку интерфейса.

Проанализируем этот подход:

  1. Откройте корень конфигурации правой кнопкой мыши -> "Открыть рабочую область начальной страницы".
  2. В открывшемся редакторе вы можете выбрать вашу форму (форму обработки или отчета) и разместить её в одной из колонок.
  3. Если оставить только одну колонку и поместить туда вашу форму, платформа 1С автоматически развернет её на всё доступное пространство при запуске.

Это "архитектурно верный" способ создания рабочих столов в интерфейсе "Такси".

Ошибки при попытке использовать методы обычных форм

Важно разобрать ошибку, с которой столкнулся автор темы. Он попытался использовать код для обычного приложения в управляемой форме:


// Этот код НЕ РАБОТАЕТ в управляемых формах
Форма = Справочники.Справочник1.ПолучитьФорму("ФормаЭлемента"); 
Форма.СпособОтображенияОкна = ВариантСпособаОтображенияОкна.Максимизированное; 
Форма.Открыть();

Почему это вызывает ошибку?

Итог

Давайте резюмируем, какой метод выбрать:

  1. Для современных конфигураций (8.3.10+): Используйте ЭтаФорма.Окно.Состояние = ВариантСостоянияОкна.Максимизированное в событии ПриОткрытии.
  2. Для создания не закрываемого АРМ: Используйте свойство формы РежимРабочегоСтола или настройку "Рабочая область начальной страницы".
  3. Для очень старых конфигураций (если нельзя обновить платформу): Используйте WScript.Shell с осторожностью, понимая риски стабильности.

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

← На главную