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

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

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

Как программно свернуть окно 1С: методы через WshShell, COM-объекты, внешние компоненты и активизацию других окон. Примеры кода, ограничения и типичные ошибки.

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

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

Почему в 1С нет штатного метода сворачивания окна

Встроенный язык 1С работает с прикладными объектами — документами, справочниками, формами, — а не с окнами операционной системы. Управление состоянием главного окна приложения (свернуть, развернуть, изменить размер) относится к уровню ОС, и платформа сознательно не даёт прямого доступа к этим функциям из соображений кроссплатформенности: один и тот же код должен выполняться на Windows, Linux и в веб-клиенте.

Из-за этого все способы сворачивания окна делятся на две группы. Первая — обращение к средствам Windows (COM-объекты, WinAPI, внешние компоненты), что работает только под Windows и только на клиенте. Вторая — приёмы, имитирующие результат: активизация другого окна или приложения, после которой окно 1С визуально уходит на второй план.

Способ 1. Отправка клавиш через WScript.Shell

Самый простой вариант без установки дополнительных компонентов — использовать COM-объект WScript.Shell, который доступен в Windows по умолчанию. Через метод SendKeys можно отправить системное сочетание клавиш, сворачивающее окна.

Сочетание Win+M сворачивает все окна, Win+Down — сворачивает активное окно (при повторном нажатии сначала восстанавливает из развёрнутого состояния, поэтому поведение зависит от текущего состояния окна). Пример кода:

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

Shell.SendKeys("^({ESC})"); // пример отправки сочетания

// Для эмуляции клавиши Win стандартный SendKeys не подходит —

// используется AppActivate на другое окно или внешние средства

Важное ограничение: стандартный SendKeys не умеет нажимать клавишу Windows (Win). Поэтому на практике этот объект чаще используют для обратной задачи — активировать другое приложение методом AppActivate, после чего окно 1С уходит на задний план:

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

Shell.AppActivate("Калькулятор"); // заголовок окна другого приложения

Способ 2. WinAPI через внешние компоненты

Полноценное сворачивание конкретного окна выполняется функцией WinAPI ShowWindow, которой передаётся дескриптор окна (hWnd) и команда SW_MINIMIZE (значение 6). Из 1С напрямую вызвать WinAPI нельзя, поэтому применяют внешние компоненты по технологии Native API или COM, например известные в сообществе разработки для работы с окнами.

Общая схема такая: компонента получает заголовок или дескриптор окна, находит его через FindWindow, затем вызывает ShowWindow с нужным параметром. Дескриптор главного окна 1С можно найти по заголовку, который обычно содержит название информационной базы.

cpp
// Логика WinAPI внутри внешней компоненты
HWND hWnd = FindWindow(NULL, L"Заголовок окна 1С");
if (hWnd != NULL) {
    ShowWindow(hWnd, SW_MINIMIZE); // SW_MINIMIZE = 6
}

Этот способ самый надёжный: он сворачивает именно нужное окно, не затрагивая остальные, и не зависит от фокуса ввода. Обратная сторона — необходимость разворачивать компоненту на каждом рабочем месте, следить за разрядностью (32/64 бита) и доверием к стороннему коду.

Способ 3. Активизация другого окна как альтернатива

Часто реальная цель — не свернуть окно 1С как таковое, а дать пользователю продолжить работу в другой программе, пока 1С выполняет длительную операцию. В этом случае сворачивание можно заменить активизацией целевого окна.

Кроме AppActivate из WScript.Shell, можно программно запустить нужное приложение через КомандаСистемы() или ЗапуститьПриложение() — вновь открытое окно обычно получает фокус и перекрывает окно 1С. Если приложение уже запущено, AppActivate переключит на него фокус по заголовку окна или идентификатору процесса.

Сравнение подходов

WScript.Shell + AppActivate

Без установки компонентов, но не сворачивает окно, а лишь переключает фокус. Работает только под Windows.

Внешняя компонента + WinAPI ShowWindow

Настоящее сворачивание конкретного окна. Требует развёртывания компоненты и контроля разрядности.

Запуск другого приложения

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

Закрытие формы методом Закрыть()

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

Закрытие форм внутри сеанса вместо сворачивания

Если под «свернуть окно» понимается убрать с экрана открытую форму документа или обработки, задача решается штатными средствами платформы. У управляемой формы есть метод Закрыть(), который можно вызвать из кода этой же формы или извне через описание оповещения.

&НаКлиенте

Процедура ЗавершитьОбработку(Команда)

// действия по обработке данных

Закрыть(); // закрывает текущую форму

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

Для закрытия произвольной открытой формы из другого места кода используют механизм оповещений: Оповестить() с именем события, а в целевой форме — обработчик ОбработкаОповещения, который вызывает Закрыть(). Это безопаснее, чем попытки управлять окнами ОС, и работает на всех клиентах, включая веб.

Как закрыть форму из другого кода
  1. 1
    В форме, которую нужно закрывать, добавьте обработчик ОбработкаОповещения с проверкой имени события
  2. 2
    В обработчике при получении нужного события вызовите Закрыть()
  3. 3
    В месте, откуда нужно закрыть форму, вызовите Оповестить("ЗакрытьФормуОбработки")
  4. 4
    Проверьте, что форма закрывается и не остаётся в списке открытых окон

Ограничения по режимам работы и типичные ошибки

Главное ограничение всех «системных» способов — привязка к Windows и к толстому или тонкому клиенту. В веб-клиенте код выполняется в песочнице браузера и не имеет доступа ни к COM-объектам, ни к окнам ОС. На сервере (в контексте &НаСервере) управлять окнами клиентского компьютера невозможно в принципе — сервер не знает о них ничего.

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

Типичные ошибки
01
Попытка вызвать COMОбъект на сервере — код падает или работает не на том компьютере; управлять окнами нужно только на клиенте
02
Ожидание, что SendKeys нажмёт клавишу Win — стандартный WScript.Shell этого не умеет, нужен другой инструмент
03
Сворачивание окна во время модального диалога — после разворачивания пользователь снова упирается в блокирующее окно
04
Поиск окна по неточному заголовку — заголовок 1С меняется в зависимости от базы и активной формы, FindWindow может не найти окно
05
Игнорирование разрядности внешней компоненты — 32-битная компонента не загрузится в 64-битном клиенте

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

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

При выборе решения исходите из среды: для разовых скриптов и регламентных запусков под Windows достаточно WScript.Shell с активизацией другого окна; для промышленной эксплуатации, где нужно именно сворачивание конкретного окна, — внешней компоненты с WinAPI; для задач внутри сеанса — штатных методов формы.

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

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

Окно 1С после выполнения кода
Норма

Окно исчезло с экрана, значок остался на панели задач

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

Окно осталось видимым или приложение закрылось полностью

Продолжение работы фоновой операции
Норма

Обработка данных завершается, результат доступен после разворачивания окна

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

Операция прервалась или зависла на модальном диалоге

Поведение на других клиентах
Норма

Код корректно пропускается или работает на всех целевых платформах

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

Ошибки вызова COMОбъект в веб-клиенте или на Linux

Итог

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

Штатного метода сворачивания окна в 1С нет. Под Windows используют WScript.Shell для переключения фокуса или внешние компоненты с WinAPI ShowWindow для настоящей минимизации. Для форм внутри сеанса применяйте метод Закрыть() и оповещения. Любой системный способ работает только на клиенте под Windows и требует проверки на модальные окна.

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

Можно ли свернуть окно 1С в веб-клиенте?

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

Чем сворачивание отличается от закрытия приложения?

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

Как свернуть окно 1С из внешнего скрипта, а не из кода конфигурации?

Используйте PowerShell или AutoIt: найдите окно по заголовку и вызовите для него команду минимизации. В PowerShell это делается через обращение к user32.dll и функции ShowWindow, в AutoIt — функцией WinSetState с флагом @SW_MINIMIZE.

Почему AppActivate не находит нужное окно?

Метод ищет окно по точному или частичному совпадению заголовка, а заголовок может меняться. Проверьте актуальный заголовок через диспетчер задач или используйте идентификатор процесса вместо строки заголовка — эта форма вызова надёжнее.

Безопасно ли использовать сторонние внешние компоненты для работы с окнами?

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