При разработке интерфейсов на обычных (неуправляемых) формах разработчики нередко сталкиваются с задачей открыть форму сразу в развернутом виде либо максимизировать ее сразу после запуска. Попытка изменить размер окна привычным кодом через обработчики событий часто приводит к ошибкам платформы. Проанализируем причину такого поведения и подробно рассмотрим все рабочие варианты решения данной задачи.
Рассмотрим типовую ситуацию. Разработчик пытается изменить свойство окна через обработчик ожидания или непосредственно в событиях формы:
Процедура ПриОткрытии()
ПодключитьОбработчикОжидания("ДействияПослеОткрытияФормы", 0.5, Истина);
КонецПроцедуры
Процедура ДействияПослеОткрытияФормы()
ЭтаФорма.СпособОтображенияОкна = ВариантСпособаОтображенияОкна.Максимизированное;
КонецПроцедуры
При выполнении этого кода или при попытке вызвать аналогичную строку в процедуре ПередОткрытием платформа выдает системное исключение. Выясним причину этого ограничения. В архитектуре обычных форм свойство СпособОтображенияОкна (а также связанные с ним ПоложениеОкна и СостояниеОкна) отвечает за первоначальную инициализацию параметров системного окна операционной системы. Как только платформа инициирует процесс открытия окна, изменение этих свойств полностью блокируется платформой. В синтакс-помощнике для данного свойства прямо указано: «Управление свойством должно производиться до открытия формы».
Кроме того, в объектной модели обычной формы отсутствуют методы вроде Развернуть() или Максимизировать(), поэтому изменить геометрию уже открытого окна стандартными инструкциями встроенного языка невозможно. Разберем по шагам, какими способами можно добиться нужного результата.
Это самый простой, надежный и рекомендуемый способ, если форма всегда должна распахиваться на весь экран. Нам не требуется писать дополнительный код на встроенном языке 1С.
После этого при любом интерактивном открытии форма будет автоматически инициализироваться операционной системой сразу в полноэкранном режиме.
Если решение о максимизации формы принимается динамически в зависимости от прав пользователя, настроек программы или переданных параметров, развернуть окно можно из вызывающего программного модуля. Для этого разделим процесс получения экземпляра формы и ее фактическое отображение:
// Получаем форму без немедленного открытия
ФормаДокумента = ПолучитьФорму("Документ.ПриходнаяНакладная.Форма.ФормаДокумента");
// Задаем способ отображения до вызова метода Открыть()
ФормаДокумента.СпособОтображенияОкна = ВариантСпособаОтображенияОкна.Максимизированное;
// Открываем уже сконфигурированное окно
ФормаДокумента.Открыть();
В этом случае свойство меняется строго до старта механизма инициализации графического окна, что полностью удовлетворяет требованиям платформы.
Если форму необходимо открывать максимизированной независимо от того, откуда именно она вызывается (например, стандартными командами интерфейса), но интерактивная настройка в конфигураторе по каким-то причинам не подходит, применим особенность жизненного цикла модуля формы.
Код, расположенный в самом низу модуля формы вне каких-либо процедур и функций (в разделе основной программы), выполняется в момент создания экземпляра формы — еще до наступления события ПередОткрытием. Посмотрим на пример реализации:
// Раздел основной программы формы (в самом конце модуля)
ЭтаФорма.СпособОтображенияОкна = ВариантСпособаОтображенияОкна.Максимизированное;
Такой вызов отрабатывает корректно, окно успевает получить признак максимизации до момента фактического вывода на экран монитора.
При переводе обычных форм в полноэкранный режим необходимо учитывать несколько ключевых особенностей платформы:
СохранениеПоложенияОкна и ИмяСохраненияПоложенияОкна. Если пользователь один раз вручную развернул окно и закрыл его, при следующем запуске оно откроется развернутым автоматически.ИзменятьСпособОтображенияОкна = ИзменениеСпособаОтображенияОкна.Запретить.Если по бизнес-логике требуется свернуть или максимизировать форму именно в процессе работы (например, по нажатию кнопки на форме или по внешнему событию оборудования), стандартных возможностей 1С будет недостаточно. В таких исключительных случаях разработчики обращаются к системным средствам Windows:
COMОбъект("WScript.Shell") и метода SendKeys() в активное окно отправляется системная комбинация клавиш вызова оконного меню (Alt + Пробел) с последующей командой разворачивания.ShowWindow из библиотеки user32.dll с параметром SW_MAXIMIZE (код 3), передав дескриптор текущего окна (HWND).Тем не менее, для подавляющего большинства типовых задач достаточно правильно использовать свойства конфигуратора либо производить настройку объекта формы до выполнения метода Открыть().