К статье
Практический материал

Разработка и Конфигурация · 12 мин

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

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

Задача свернуть окно приложения или форму из кода возникает в 1С чаще, чем кажется: например, при автоматизации демонстрационных сценариев, при интеграции с внешними программами, при работе фоновых обработок или когда пользователь должен увидеть другой экран, не закрывая текущую форму. При этом платформа 1С:Предприятие не даёт универсальной кроссплатформенной команды «свернуть любую форму» — поведение зависит от типа клиента, режима работы (обычное или управляемое приложение) и того, чьё окно нужно свернуть: окно всего клиентского приложения или конкретную форму.

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

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

Что именно можно свернуть в 1С

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

В обычном приложении (толстый клиент, режим обычных форм) формы могли быть отдельными MDI-окнами, но и там программное сворачивание конкретной формы средствами встроенного языка не поддерживалось напрямую. В управляемом приложении такой возможности нет по определению архитектуры интерфейса «Такси».

Практический вывод: если требование звучит как «свернуть форму», почти всегда имеется в виду одно из трёх — свернуть всё окно 1С, закрыть форму с возможностью вернуться, либо переключить пользователя на другую форму или другое приложение. Каждый сценарий решается своим способом.

Сворачивание главного окна через КлиентскоеПриложение

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

Типовой фрагмент кода для сворачивания главного окна выглядит так:

&НаКлиенте

Процедура СвернутьПриложение(Команда)

КлиентскоеПриложение.Свернуть();

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

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

Сворачивание через WScript.Shell и Windows API

Когда штатных методов платформы недостаточно или нужна совместимость со старыми версиями, используют объект WScript.Shell операционной системы. Способ работает только в Windows и только там, где разрешено создание COM-объектов.

&НаКлиенте

Процедура СвернутьОкноЧерезShell(Команда)

Попытка

Оболочка = Новый COMОбъект("WScript.Shell");

// Передаём фокус на окно 1С и отправляем команду сворачивания

Оболочка.AppActivate("1С:Предприятие");

Оболочка.SendKeys("% n"); // Alt+Пробел, затем "n" — свернуть

Исключение

Сообщить("Не удалось свернуть окно: " + ОписаниеОшибки());

КонецПопытки;

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

Метод AppActivate ищет окно по подстроке заголовка, поэтому заголовок должен совпадать с реальным заголовком окна клиента. Если конфигурация меняет заголовок (например, через КлиентскоеПриложение.УстановитьЗаголовок), учитывайте это при поиске. Метод SendKeys эмулирует нажатия клавиш и потому нестабилен: если фокус уйдёт в другое окно между AppActivate и SendKeys, команда уйдёт не туда.

Более надёжный, но сложный путь — вызов функции ShowWindow из user32.dll через внешнюю компоненту или через механизм ДлительнаяОперация с внешними утилитами. Для разовых задач обычно достаточно WScript.Shell.

Альтернативы для управляемых форм

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

Первый вариант — открыть форму независимо или в отдельном окне и переключаться между формами через Активизировать(). Второй — использовать ОткрытьФорму с параметром РежимОткрытияОкна, чтобы форма открылась поверх, а после её закрытия пользователь автоматически вернулся к исходной. Третий — оповещения: форма-источник остаётся открытой, а взаимодействие идёт через Оповестить() и обработчики оповещений.

&НаКлиенте

Процедура ОткрытьПоверхИВернуться(Команда)

ОписаниеОповещения = Новый ОписаниеОповещения("ПослеЗакрытияФормы", ЭтотОбъект);

ОткрытьФорму("Обработка.МояОбработка.Форма.ФормаВыбора", , ЭтотОбъект, , , ,

ОписаниеОповещения, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

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

Сравнение вариантов

КлиентскоеПриложение.Свернуть()

Штатный способ свернуть всё окно клиента. Подходит, если нужно показать рабочий стол или другое приложение. Зависит от версии платформы.

WScript.Shell + SendKeys

Работает на старых версиях, только Windows, только толстый/тонкий клиент. Нестабилен при смене фокуса, требует прав на COM.

Закрыть форму с сохранением данных

Правильная замена сворачиванию для управляемых форм: данные хранятся в реквизитах формы-владельца или во временном хранилище.

ОткрытьФорму с блокировкой владельца

Подходит, когда нужно временно переключить пользователя на другую задачу и вернуться назад без потери контекста.

Пошаговый сценарий: свернуть 1С перед запуском внешней программы

Частая практическая задача — свернуть окно 1С, открыть внешнее приложение (например, программу банка или браузер с отчётом), а после завершения вернуть окно 1С на передний план.

Порядок действий
  1. 1
    Определите, какое окно нужно свернуть: главное окно клиента или специфическое окно внешнего приложения.
  2. 2
    Проверьте в синтакс-помощнике наличие метода КлиентскоеПриложение.Свернуть() на вашей версии платформы.
  3. 3
    Если метод есть — вызовите его в клиентской процедуре формы.
  4. 4
    Если метода нет — используйте WScript.Shell с AppActivate по заголовку окна и SendKeys для команды сворачивания.
  5. 5
    Запустите внешнее приложение через ЗапуститьПриложение() или НачатьЗапускПриложения() с описанием оповещения о завершении.
  6. 6
    После закрытия внешней программы активируйте окно 1С через AppActivate, чтобы вернуть пользователю контекст.
  7. 7
    Протестируйте сценарий на реальном рабочем месте: проверьте заголовок окна, права на COM и поведение при двух мониторах.

Пример запуска внешней программы с возвратом:

&НаКлиенте

Процедура ОткрытьВнешнююПрограмму(Команда)

КлиентскоеПриложение.Свернуть();

Оповещение = Новый ОписаниеОповещения("ПослеЗавершенияВнешней", ЭтотОбъект);

НачатьЗапускПриложения(Оповещение, "notepad.exe");

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

&НаКлиенте

Процедура ПослеЗавершенияВнешней(КодВозврата, ДополнительныеПараметры) Экспорт

// Возвращаем фокус окну 1С

Попытка

Оболочка = Новый COMОбъект("WScript.Shell");

Оболочка.AppActivate("1С:Предприятие");

Исключение

// Пользователь сам активирует окно

КонецПопытки;

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

Проверка результата и ограничения

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

Контрольные точки

Как проверить результат

Окно сворачивается по команде из кода
Норма

Главное окно клиента уходит в панель задач, в журнале регистрации нет ошибок

Тревожный признак

Ошибка 'Метод объекта не обнаружен' — метод недоступен в этой версии платформы

Код выполняется на клиенте
Норма

Процедура помечена &НаКлиенте, серверный вызов не требуется

Тревожный признак

Ошибка о недоступности объекта на сервере — код размещён в серверном контексте

Работа в веб-клиенте
Норма

Функциональность либо не требуется, либо заменена альтернативным сценарием

Тревожный признак

COM-объекты и управление окнами в веб-клиенте недоступны — код молча не работает или падает

Заголовок окна для AppActivate
Норма

Окно находится по подстроке заголовка стабильно

Тревожный признак

Заголовок изменён конфигурацией, окно не находится, команда уходит в другое приложение

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

Типичные ошибки разработчиков

Типичные ошибки
01
Попытка свернуть отдельную управляемую форму — такой возможности нет в архитектуре платформы, нужно сворачивать главное окно или закрывать форму.
02
Вызов кода управления окном в серверной процедуре — приводит к ошибке времени выполнения, так как объекты интерфейса доступны только на клиенте.
03
Использование SendKeys без задержки и без проверки фокуса — команда уходит в другое окно, если пользователь кликнул мышью между AppActivate и отправкой клавиш.
04
Поиск окна по полному заголовку — заголовок меняется в зависимости от открытого документа, поэтому надёжнее искать по устойчивой подстроке.
05
Отсутствие обработки исключений при создании COM-объекта — на машинах с запретом COM код падает с необработанной ошибкой вместо понятного сообщения.
06
Ожидание, что свёрнутая форма продолжит выполнять клиентский код по таймеру — при сворачивании окна обработчики ожидания могут вести себя иначе, проверяйте сценарий отдельно.
Итог

Что важно запомнить

Свернуть программно можно только главное окно клиентского приложения — штатным методом КлиентскоеПриложение (в поддерживающих версиях) или через WScript.Shell в Windows. Отдельную управляемую форму свернуть нельзя: используйте закрытие с сохранением данных или переключение между формами. Любой код управления окнами размещайте только на клиенте и тестируйте на целевом рабочем месте.

Частые вопросы

Можно ли свернуть конкретную управляемую форму, не трогая главное окно 1С?

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

Работает ли сворачивание окна в веб-клиенте?

Нет. Веб-клиент работает внутри браузера, и платформа не предоставляет средств управления окном браузера. COM-объекты в веб-клиенте также недоступны. Если сценарий требует веб-клиента, пересмотрите логику: например, открывайте внешний ресурс в новой вкладке через ПерейтиПоНавигационнойСсылке.

Почему код с WScript.Shell работает у одних пользователей и не работает у других?

Создание COM-объектов может блокироваться антивирусом, групповыми политиками или настройками безопасного режима. Также AppActivate чувствителен к заголовку окна: если конфигурация устанавливает собственный заголовок, поиск по стандартной строке не сработает. Оборачивайте вызовы в Попытка/Исключение и тестируйте на конкретных рабочих местах.

Как свернуть окно 1С из внешней программы или скрипта?

Извне окно 1С сворачивается стандартными средствами Windows: через PowerShell или скрипт AutoIt найдите окно по заголовку (класс окна или подстрока заголовка) и вызовите для него команду сворачивания (ShowWindow с параметром SW_MINIMIZE). Это надёжнее, чем эмуляция клавиш изнутри 1С.

Можно ли развернуть свёрнутое окно 1С обратно из кода?

Да, если окно сворачивали через WScript.Shell, вернуть его можно тем же методом AppActivate — он активирует окно и восстанавливает его из свёрнутого состояния. Если использовался штатный метод платформы, проверьте в синтакс-помощнике наличие парного метода для восстановления или изменения состояния окна.

Влияет ли сворачивание окна на выполнение фоновых заданий и обработчиков ожидания?

Фоновые задания выполняются на сервере и от состояния окна не зависят. Клиентские обработчики ожидания (ПодключитьОбработчикОжидания) продолжают работать, но фактическое поведение при свёрнутом окне зависит от клиента и системы — если от этого зависит бизнес-логика, перенесите критичные операции на сервер.