При разработке интерфейсов в 1С:Предприятие, особенно при создании "Рабочих столов" или мониторов руководителя (удобно проектировать через конструктор адаптивных рабочих столов и интерфейсов в 1С), часто возникает задача открыть форму сразу развернутой на весь экран (максимизированной). В обычном приложении (толстый клиент, обычные формы) это делалось элементарно, но при переходе на управляемые формы разработчики столкнулись с отсутствием очевидных инструментов в ранних версиях платформы.
В этой статье мы подробно разберем, как решить эту задачу. Мы рассмотрим как современные штатные методы, доступные в актуальных релизах платформы, так и "исторические" обходные пути, которые могут пригодиться при поддержке легаси-систем, а также нюансы настройки свойств формы.
В старых версиях платформы (обычное приложение) существовало свойство формы СпособОтображенияОкна, которое можно было установить в значение ВариантСпособаОтображенияОкна.Максимизированное. Это позволяло одной строчкой кода развернуть окно при открытии.
Однако, как справедливо замечено в обсуждении, в управляемых формах (особенно до версии 8.3.10) прямой доступ к управлению состоянием окна был ограничен. Попытка использовать старый код приводит к ошибке Поле объекта не обнаружено, так как управляемая форма рендерится иначе, и логика управления окнами отдана на откуп веб-ориентированной архитектуре.
Давайте проанализируем все доступные способы решения этой задачи, от самых правильных к "хитрым" приемам.
Начнем с самого правильного и надежного метода. Если ваша конфигурация работает в режиме совместимости с версией 8.3.10 или выше (или режим совместимости отключен вовсе), у управляемой формы появился объект Окно. Через него мы можем напрямую управлять состоянием окна операционной системы, в котором открыта форма.
Для этого в модуле формы, в процедуре ПриОткрытии, необходимо написать следующий код:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Если ЭтаФорма.Окно <> Неопределено Тогда
ЭтаФорма.Окно.Состояние = ВариантСостоянияОкна.Максимизированное;
КонецЕсли;
КонецПроцедуры
Разберем этот код:
ЭтаФорма.Окно. Это свойство доступно только на клиенте.Состояние в значение системного перечисления ВариантСостоянияОкна.Максимизированное.Преимущества: Это документированный, надежный метод, работающий быстро и без использования внешних компонент.
В обсуждении участники упомянули свойство формы "РежимРабочегоСтола". Давайте посмотрим, как оно работает и чем отличается от простого разворачивания окна.
Это свойство задается в палитре свойств самой формы (в конфигураторе). Если установить галочку РежимРабочегоСтола в значение Истина, произойдет следующее:
Этот вариант идеально подходит, если вы действительно создаете АРМ (Автоматизированное Рабочее Место), из которого пользователю не нужно выходить, и которое должно занимать все пространство. Однако, если вам нужно просто развернутое окно, которое можно свернуть или переместить, этот метод не подойдет.
Если вам приходится работать со старой версией платформы (ниже 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С и занимала всё место (как рабочий стол), то в современных конфигурациях лучше использовать не программный код ПриНачалеРаботыСистемы, а декларативную настройку интерфейса.
Проанализируем этот подход:
Это "архитектурно верный" способ создания рабочих столов в интерфейсе "Такси".
Важно разобрать ошибку, с которой столкнулся автор темы. Он попытался использовать код для обычного приложения в управляемой форме:
// Этот код НЕ РАБОТАЕТ в управляемых формах
Форма = Справочники.Справочник1.ПолучитьФорму("ФормаЭлемента");
Форма.СпособОтображенияОкна = ВариантСпособаОтображенияОкна.Максимизированное;
Форма.Открыть();
Почему это вызывает ошибку?
ПолучитьФорму возвращает объект управляемой формы, у которого просто нет свойства СпособОтображенияОкна. Это свойство осталось рудиментом "толстого клиента" обычного приложения.Давайте резюмируем, какой метод выбрать:
ЭтаФорма.Окно.Состояние = ВариантСостоянияОкна.Максимизированное в событии ПриОткрытии.РежимРабочегоСтола или настройку "Рабочая область начальной страницы".WScript.Shell с осторожностью, понимая риски стабильности.Применяя эти знания, вы сможете настроить поведение окон вашего приложения так, как это требуется для удобства пользователей.