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

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

В практике разработки на платформе 1С:Предприятие 8.3 часто возникают задачи по созданию специализированных интерфейсов. Это могут быть рабочие места кассиров, терминалы сбора данных или мониторы для производственных цехов, где критически важно, чтобы форма открывалась в полноэкранном режиме, скрывая элементы управления операционной системы и заголовки самой программы. Однако разработчики часто сталкиваются с тем, что стандартные методы или имитация нажатия клавиш срабатывают только при повторном открытии формы, игнорируя первый запуск после загрузки системы. В этой статье мы подробно разберем, почему это происходит и как реализовать надежное решение.

Анализ проблемы: почему форма не разворачивается сразу?

Разберем ситуацию, когда разработчик пытается использовать объект WScript.Shell для имитации системного сочетания клавиш CTRL+SHIFT+~ (Ё), которое в платформе 1С отвечает за переход в полноэкранный режим. Проблема заключается в жизненном цикле управляемой формы. При первом запуске сеанса или первом открытии тяжелой обработки платформа выполняет множество фоновых процессов: инициализацию графического интерфейса, загрузку настроек пользователя, отрисовку элементов и установку фокуса.

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

Решение №1: Использование обработчика ожидания (рекомендуемый метод)

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

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


&НаКлиенте
Процедура РазвернутьОкноНаВесьЭкран()
    
    Попытка
        WSHShell = Новый COMОбъект("WScript.Shell");
        // Имитируем нажатие системной клавиши для активации меню, если необходимо
        WSHShell.SendKeys("%"); 
        
        // Посылаем комбинацию Ctrl + Shift + ~ (для английской раскладки)
        WSHShell.SendKeys("^+{`}"); 
        
        // Посылаем комбинацию Ctrl + Shift + Ё (для русской раскладки)
        WSHShell.SendKeys("^+{Ё}");
    Исключение
        // Обработка ошибки, если создание COM-объекта запрещено настройками безопасности
        ЗаписьЖурналаРегистрации("Ошибка развертывания формы", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
    КонецПопытки;

КонецПроцедуры

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


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    
    // Подключаем обработчик с минимальной задержкой. 
    // На практике достаточно от 0.1 до 0.5 секунды.
    // Если форма очень тяжелая, можно увеличить до 1 секунды.
    ПодключитьОбработчикОжидания("РазвернутьОкноНаВесьЭкран", 0.5, Истина);
    
КонецПроцедуры

Важный нюанс: использование WScript.Shell требует отключенной настройки «Защита от опасных действий» для данного пользователя в конфигураторе, иначе система будет каждый раз запрашивать разрешение на запуск скрипта.

Решение №2: Штатное свойство СостояниеОкна

Проанализируем альтернативный вариант. Если ваша задача — не скрыть заголовки и панели (режим Full Screen), а просто максимально растянуть окно в пределах рабочего пространства 1С (режим Maximize), то начиная с версии платформы 8.3.15, можно обойтись без использования сторонних скриптов. Это гораздо надежнее, так как работает на уровне программного интерфейса самой 1С.

В модуле формы можно прописать следующую строку:


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

Это свойство напрямую управляет поведением окна. Однако помните, что это именно «максимизация», а не «полноэкранный режим». Если вам нужно именно скрыть верхнюю панель 1С (с кнопками «Файл», «Правка» и т.д.), этот метод не заменит SendKeys.

Оптимизация работы и устранение задержек

Если вы решили использовать первый метод (обработчик ожидания), выясним, как сделать его работу бесшовной для пользователя. Ожидание в 3 секунды, упомянутое в некоторых обсуждениях, слишком велико — пользователь успеет заметить «скачок» интерфейса.

  1. Минимизируйте время ожидания: Начните с 0.1 секунды. В большинстве случаев этого времени хватает, чтобы фокус перешел на форму после завершения процедуры ПриОткрытии.
  2. Используйте параметр запуска /Nologo: В настройках ярлыка 1С или в параметрах запуска информационной базы добавьте флаг /Nologo. Это отключит заставку при запуске. Выяснено, что отсутствие заставки ускоряет процесс передачи фокуса основному окну приложения.
  3. Проверка активности окна: В более сложных сценариях можно использовать Windows API через внешние компоненты, чтобы точно определить момент, когда окно 1С стало активным, но для большинства бизнес-задач достаточно простого таймера.

Различия для обычных и управляемых форм

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

Итоги и рекомендации

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

  1. Используйте WScript.Shell для имитации горячих клавиш, если необходим режим Full Screen.
  2. Всегда вызывайте код разворота через ПодключитьОбработчикОжидания с небольшой задержкой (0.2–0.5 сек), чтобы избежать конфликтов фокуса при инициализации.
  3. Для простых задач (растянуть окно без скрытия панелей) используйте штатное свойство ЭтаФорма.СостояниеОкна.
  4. Не забывайте про настройки безопасности платформы, разрешая запуск COM-объектов для пользователей, работающих с данным функционалом.

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

← На главную