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

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

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

Почему возникает ошибка при попытке изменить размер окна кодом

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


Процедура ПриОткрытии()
    ПодключитьОбработчикОжидания("ДействияПослеОткрытияФормы", 0.5, Истина);
КонецПроцедуры

Процедура ДействияПослеОткрытияФормы()
    ЭтаФорма.СпособОтображенияОкна = ВариантСпособаОтображенияОкна.Максимизированное;
КонецПроцедуры

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

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

Способ 1. Установка свойства в палитре свойств формы в конфигураторе

Это самый простой, надежный и рекомендуемый способ, если форма всегда должна распахиваться на весь экран. Нам не требуется писать дополнительный код на встроенном языке 1С.

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

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

Способ 2. Программная установка свойства до вызова метода Открыть()

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


// Получаем форму без немедленного открытия
ФормаДокумента = ПолучитьФорму("Документ.ПриходнаяНакладная.Форма.ФормаДокумента");

// Задаем способ отображения до вызова метода Открыть()
ФормаДокумента.СпособОтображенияОкна = ВариантСпособаОтображенияОкна.Максимизированное;

// Открываем уже сконфигурированное окно
ФормаДокумента.Открыть();

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

Способ 3. Инициализация в разделе основной программы модуля формы

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

Код, расположенный в самом низу модуля формы вне каких-либо процедур и функций (в разделе основной программы), выполняется в момент создания экземпляра формы — еще до наступления события ПередОткрытием. Посмотрим на пример реализации:


// Раздел основной программы формы (в самом конце модуля)
ЭтаФорма.СпособОтображенияОкна = ВариантСпособаОтображенияОкна.Максимизированное;

Такой вызов отрабатывает корректно, окно успевает получить признак максимизации до момента фактического вывода на экран монитора.

Важные нюансы при работе с развернутыми окнами

При переводе обычных форм в полноэкранный режим необходимо учитывать несколько ключевых особенностей платформы:

  1. Привязки элементов управления. В отличие от управляемых форм, обычные формы не умеют автоматически перераспределять элементы по экрану. Чтобы табличные части и командные панели корректно растягивались, а не оставались в левом верхнем углу маленьким блоком, обязательно настройте горизонтальные и вертикальные привязки элементов управления к границам формы.
  2. Механизм сохранения положения окна. Платформа 1С штатно сохраняет последнее состояние формы для каждого пользователя с помощью свойств СохранениеПоложенияОкна и ИмяСохраненияПоложенияОкна. Если пользователь один раз вручную развернул окно и закрыл его, при следующем запуске оно откроется развернутым автоматически.
  3. Свойство ИзменятьСпособОтображенияОкна. Если необходимо запретить пользователю возвращать окно в оконный режим или сворачивать его, используйте свойство формы ИзменятьСпособОтображенияОкна = ИзменениеСпособаОтображенияОкна.Запретить.

Альтернативные способы динамического управления окном

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

  1. Эмуляция системных сочетаний клавиш. С помощью объекта COMОбъект("WScript.Shell") и метода SendKeys() в активное окно отправляется системная комбинация клавиш вызова оконного меню (Alt + Пробел) с последующей командой разворачивания.
  2. Вызовы Windows API. С помощью внешних компонент или интеграционных библиотек можно отправить окну системное сообщение функции ShowWindow из библиотеки user32.dll с параметром SW_MAXIMIZE (код 3), передав дескриптор текущего окна (HWND).

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

← На главную