В практике разработки на платформе 1С:Предприятие 8.3 часто возникают задачи по созданию специализированных интерфейсов. Это могут быть рабочие места кассиров, терминалы сбора данных или мониторы для производственных цехов, где критически важно, чтобы форма открывалась в полноэкранном режиме, скрывая элементы управления операционной системы и заголовки самой программы. Однако разработчики часто сталкиваются с тем, что стандартные методы или имитация нажатия клавиш срабатывают только при повторном открытии формы, игнорируя первый запуск после загрузки системы. В этой статье мы подробно разберем, почему это происходит и как реализовать надежное решение.
Разберем ситуацию, когда разработчик пытается использовать объект WScript.Shell для имитации системного сочетания клавиш CTRL+SHIFT+~ (Ё), которое в платформе 1С отвечает за переход в полноэкранный режим. Проблема заключается в жизненном цикле управляемой формы. При первом запуске сеанса или первом открытии тяжелой обработки платформа выполняет множество фоновых процессов: инициализацию графического интерфейса, загрузку настроек пользователя, отрисовку элементов и установку фокуса.
Когда код выполняется непосредственно в событии ПриОткрытии, фокус ввода (активное окно для системы) может еще не принадлежать форме 1С. Он может удерживаться заставкой (Splash screen) или внутренними процессами прорисовки. В результате команда SendKeys уходит «в никуда» или обрабатывается системой некорректно. При повторном открытии, когда все кэши заполнены и компоненты инициализированы, задержки отсутствуют, и команда срабатывает мгновенно.
Наиболее эффективным и простым способом решения проблемы «первого запуска» является использование механизма отложенного выполнения кода. Мы не пытаемся «прожать» клавиши в момент открытия, а даем платформе завершить все визуальные операции и передаем команду через доли секунды после того, как форма станет полностью активной.
Рассмотрим пошагово, как это реализовать. Сначала в модуле формы создадим процедуру, которая будет отвечать за разворачивание окна. Обратите внимание, что мы должны предусмотреть обработку разных раскладок клавиатуры, так как символ «Ё» и тильда имеют разные коды в зависимости от языка ввода.
&НаКлиенте
Процедура РазвернутьОкноНаВесьЭкран()
Попытка
WSHShell = Новый COMОбъект("WScript.Shell");
// Имитируем нажатие системной клавиши для активации меню, если необходимо
WSHShell.SendKeys("%");
// Посылаем комбинацию Ctrl + Shift + ~ (для английской раскладки)
WSHShell.SendKeys("^+{`}");
// Посылаем комбинацию Ctrl + Shift + Ё (для русской раскладки)
WSHShell.SendKeys("^+{Ё}");
Исключение
// Обработка ошибки, если создание COM-объекта запрещено настройками безопасности
ЗаписьЖурналаРегистрации("Ошибка развертывания формы", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Теперь нам нужно вызвать эту процедуру правильно. В обработчике события ПриОткрытии мы подключаем обработчик ожидания. Важно установить параметр Однократно в значение Истина, чтобы форма не пыталась разворачиваться циклично.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Подключаем обработчик с минимальной задержкой.
// На практике достаточно от 0.1 до 0.5 секунды.
// Если форма очень тяжелая, можно увеличить до 1 секунды.
ПодключитьОбработчикОжидания("РазвернутьОкноНаВесьЭкран", 0.5, Истина);
КонецПроцедуры
Важный нюанс: использование WScript.Shell требует отключенной настройки «Защита от опасных действий» для данного пользователя в конфигураторе, иначе система будет каждый раз запрашивать разрешение на запуск скрипта.
Проанализируем альтернативный вариант. Если ваша задача — не скрыть заголовки и панели (режим Full Screen), а просто максимально растянуть окно в пределах рабочего пространства 1С (режим Maximize), то начиная с версии платформы 8.3.15, можно обойтись без использования сторонних скриптов. Это гораздо надежнее, так как работает на уровне программного интерфейса самой 1С.
В модуле формы можно прописать следующую строку:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ЭтаФорма.СостояниеОкна = ВариантСостоянияОкна.Максимизировано;
КонецПроцедуры
Это свойство напрямую управляет поведением окна. Однако помните, что это именно «максимизация», а не «полноэкранный режим». Если вам нужно именно скрыть верхнюю панель 1С (с кнопками «Файл», «Правка» и т.д.), этот метод не заменит SendKeys.
Если вы решили использовать первый метод (обработчик ожидания), выясним, как сделать его работу бесшовной для пользователя. Ожидание в 3 секунды, упомянутое в некоторых обсуждениях, слишком велико — пользователь успеет заметить «скачок» интерфейса.
0.1 секунды. В большинстве случаев этого времени хватает, чтобы фокус перешел на форму после завершения процедуры ПриОткрытии./Nologo. Это отключит заставку при запуске. Выяснено, что отсутствие заставки ускоряет процесс передачи фокуса основному окну приложения.Стоит отметить, что в обычных формах (толстый клиент) существовало свойство РежимРабочегоСтола. Если вы работаете в режиме совместимости или на старых конфигурациях, проверьте наличие этого свойства. В управляемых формах идеология изменилась: управление окнами стало более абстрактным, и прямой доступ к свойствам «Рабочего стола» из кода формы был ограничен в целях кроссплатформенности (например, для работы в веб-клиенте).
Подведем итог нашему исследованию. Для того чтобы форма гарантированно развернулась на весь экран при первом запуске, придерживайтесь следующего алгоритма:
WScript.Shell для имитации горячих клавиш, если необходим режим Full Screen.ПодключитьОбработчикОжидания с небольшой задержкой (0.2–0.5 сек), чтобы избежать конфликтов фокуса при инициализации.ЭтаФорма.СостояниеОкна.Такой комплексный подход обеспечит стабильную работу интерфейса и профессиональный вид вашего программного продукта в любых условиях эксплуатации.