Разработка и Конфигурация · 10 мин
Как программно свернуть окно 1С
Разбираем, как программно свернуть окно 1С: через внешние компоненты, WScript.Shell, WinAPI и планировщик задач. Готовые примеры кода, ограничения и типичные ошибки.
Штатного метода «свернуть главное окно» во встроенном языке 1С нет: платформа не предоставляет программный доступ к состоянию окна толстого или тонкого клиента. Поэтому задача решается обходными путями — через средства операционной системы, внешние компоненты или перенастройку самого сценария работы, чтобы сворачивание вообще не требовалось.
Чаще всего потребность возникает в трёх ситуациях: при запуске регламентных обменов, когда окно 1С мешает пользователю; при автоматическом старте сеанса по расписанию; при пакетной обработке, где 1С используется как «движок» и интерфейс не нужен. Для каждого сценария подходит свой вариант, и выбор зависит от режима работы (файловый или клиент-серверный), типа клиента и прав учётной записи.
Важно понимать ограничение: свернуть можно только окно клиентского приложения, запущенного на конкретном компьютере. Сеанс на сервере 1С или фоновое задание окна не имеют, поэтому для них вопрос сворачивания не стоит в принципе — это и есть самый надёжный путь автоматизации.
Почему встроенный язык 1С не умеет сворачивать окно
Управляемое приложение 1С абстрагировано от операционной системы: один и тот же код должен работать в тонком клиенте Windows, веб-клиенте и мобильной платформе. Понятия «свернуть окно» в веб-браузере не существует, поэтому такой метод не входит в объектную модель. Объект ГлавноеОкно или аналогичный интерфейс управления состоянием окна в синтакс-помощнике отсутствует.
Частично ситуацию компенсируют методы Активизировать() у элементов интерфейса и команды навигации, но они управляют фокусом внутри приложения, а не состоянием окна операционной системы. Поэтому любое решение так или иначе выходит за пределы встроенного языка.
Сворачивание окна через WScript.Shell
Самый доступный способ без установки дополнительных компонентов — COM-объект WScript.Shell. Метод AppActivate активирует окно по заголовку, после чего через SendKeys можно отправить системное сочетание клавиш. Прямой команды «свернуть» у SendKeys нет, но можно эмулировать Win+Down либо отправить окну команду системного меню.
Shell = Новый COMОбъект("WScript.Shell");
Shell.AppActivate("1С:Предприятие");
WScript = Новый COMОбъект("WScript.Shell");
// Эмуляция Win+Down не поддерживается напрямую,
// поэтому используем сочетание системного меню:
Shell.SendKeys("% {DOWN}");
Надёжность этого метода невысокая: заголовок окна должен совпадать точно, фокус ввода может уйти, а SendKeys зависит от раскладки и активного окна в момент отправки. Использовать его стоит только как временное решение на конкретном рабочем месте с фиксированным заголовком сеанса. На серверных сеансах без интерактивного рабочего стола метод не сработает вовсе.
Сворачивание через внешнюю компоненту и WinAPI
Более надёжный путь — внешняя компонента, реализующая вызовы WinAPI: FindWindow для поиска дескриптора окна и ShowWindow с параметром SW_MINIMIZE (значение 6) для сворачивания. Такие компоненты пишутся по технологии Native API на C++, либо используются готовые универсальные библиотеки вызова WinAPI из 1С.
Логика вызова из кода 1С выглядит так: подключается компонента, по заголовку или классу окна находится дескриптор главного окна клиента, затем вызывается функция сворачивания. Преимущество перед SendKeys — отсутствие зависимости от фокуса и раскладки: команда адресуется конкретному окну по его дескриптору.
Ограничения те же, что и у любой внешней компоненты: её нужно зарегистрировать на каждом клиентском компьютере, учесть разрядность (32/64 бита) и получить согласие пользователя на установку, если включён режим защиты от опасных действий. В веб-клиенте компонента потребует отдельной поставки расширения для браузера.
# PowerShell: свернуть все окна 1С
Add-Type -AssemblyName Microsoft.VisualBasic
$wshell = New-Object -ComObject WScript.Shell
$wshell.AppActivate("1С:Предприятие") | Out-Null
Start-Sleep -Milliseconds 300
$wshell.SendKeys("% n") # Alt+Пробел, затем 'n' — свернутьЗапуск 1С без окна: пакетный режим и COM-соединение
Если цель — выполнить обработку без отображения интерфейса, сворачивать окно не нужно: правильнее запустить сеанс, у которого окна нет изначально. Для этого существуют два штатных механизма.
Первый — пакетный режим конфигуратора или запуск толстого клиента с параметром Execute для выполнения обработки, после чего сеанс завершается сам. Второй — COM-соединение через объект V83.COMConnector: внешний скрипт подключается к базе, выполняет любые операции через объектную модель, и никакого окна при этом не создаётся.
- 1Создайте COMОбъект("V83.COMConnector") в скрипте или другой базе 1С
- 2Установите соединение методом Connect с указанием строки подключения к базе
- 3Выполните нужные операции через объектную модель соединения
- 4Освободите соединение присвоением переменной Неопределено
- 5Проверьте в консоли кластера или списке активных пользователей, что сеанс закрыт
У COM-соединения есть ограничения: работает только на Windows, требует совпадения версии платформы коннектора и сервера, а код внутри соединения выполняется без интерфейса — нельзя открывать формы и использовать модальные вызовы. Для регламентных обменов и выгрузок это, как правило, не помеха.
Сворачивание окна внешним скриптом Windows
Когда 1С запускается по расписанию через планировщик задач, удобно сворачивать окно тем же внешним скриптом, который выполняет запуск. PowerShell позволяет найти процесс 1cv8, получить дескриптор главного окна через MainWindowHandle и вызвать ShowWindow из user32.dll.
$sig = '[System.Runtime.InteropServices.DllImport("user32.dll")] public static extern bool ShowWindow(System.IntPtr hWnd, int nCmdShow);'
$type = Add-Type -MemberDefinition $sig -Name Win32 -PassThru
Get-Process 1cv8 -ErrorAction SilentlyContinue |
Where-Object { $_.MainWindowHandle -ne 0 } |
ForEach-Object { $type::ShowWindow($_.MainWindowHandle, 6) }
Значение 6 соответствует SW_MINIMIZE. Скрипт выполняется от имени того же пользователя, что запустил сеанс 1С, иначе доступа к окну не будет. Если сеанс работает в отдельной RDP-сессии или под другой учётной записью, скрипт нужно запускать внутри той же сессии.
Альтернатива: фоновые задания вместо сворачивания
Архитектурно правильное решение для большинства задач «свернуть, чтобы не мешало» — перенести выполнение в фоновое задание. Метод ФоновыеЗадания.Выполнить запускает процедуру на сервере (или в отдельном сеансе файловой базы), и окно пользователя вообще не участвует в процессе.
Для периодических операций используются регламентные задания с расписанием. В клиент-серверном режиме они исполняются на сервере без какого-либо интерфейса; в файловом режиме требуется отдельный сеанс, который можно запустить с параметром /Execute и минимальным вмешательством в рабочее место пользователя.
Как выбрать действие
Проверка результата и ограничения
После внедрения любого способа проверьте три вещи: окно действительно сворачивается (а не активируется чужое приложение), сеанс продолжает выполнять поставленную задачу, и по завершении сеанс корректно закрывается, не оставляя зависших процессов 1cv8 в диспетчере задач.
Учитывайте ограничения платформы: в веб-клиенте управление окном браузера из кода 1С невозможно; на Linux-клиенте WinAPI-решения не работают; при включённой защите от опасных действий каждая компонента и COM-вызов потребуют подтверждения. Для серверных сценариев единственный корректный путь — задания без интерфейса.
Как проверить результат
Окно 1С свёрнуто в панель задач, сеанс активен
Активировано другое приложение или окно осталось развёрнутым
Число процессов соответствует реальным сеансам
Накапливаются зависшие процессы после каждого запуска
Обработка завершается, данные записаны
Код остановился на модальном окне, ожидающем ввода
Что важно запомнить
Свернуть окно 1С штатным методом нельзя — используйте WinAPI через компоненту или внешний скрипт с ShowWindow. Для автоматизации надёжнее вообще избавиться от окна: фоновые задания, пакетный режим или COM-соединение решают задачу без сворачивания.
Частые вопросы
Можно ли свернуть окно 1С средствами только встроенного языка?
Нет. Во встроенном языке нет методов управления состоянием главного окна операционной системы. Все рабочие способы выходят за пределы платформы: WinAPI через внешнюю компоненту, COM-объекты Windows или внешние скрипты, работающие с дескриптором окна.
Почему SendKeys иногда не сворачивает окно?
Метод зависит от того, какое окно активно в момент отправки клавиш. Если AppActivate не нашёл окно по заголовку или фокус успел переключиться, сочетание клавиш уходит в другое приложение. Добавьте паузу между активацией и отправкой и убедитесь, что заголовок окна указан точно.
Работает ли сворачивание окна в веб-клиенте?
Нет. Веб-клиент выполняется внутри браузера, и код 1С не может управлять окном браузера. Теоретически возможны решения через расширение браузера, но на практике для веб-клиента задачу решают переносом логики в фоновые задания на сервере.
Как запустить обработку 1С, чтобы окно вообще не появлялось?
Используйте COM-соединение через V83.COMConnector из внешнего скрипта или другой базы — интерфейс при этом не создаётся. Альтернатива в клиент-серверном режиме — регламентное задание, которое исполняется на сервере без сеанса с интерфейсом.
Опасно ли сворачивать окно во время выполнения обработки?
Само сворачивание безопасно — это лишь изменение отображения окна, на выполнение кода оно не влияет. Риск представляет не сворачивание, а отправка клавиш в чужое окно при ошибках AppActivate, а также принудительное завершение сеанса во время незавершённой транзакции.
Что делать, если сеанс запущен под другой учётной записью?
Управлять окном чужой сессии нельзя — Windows изолирует рабочие столы пользователей. Скрипт сворачивания нужно запускать внутри той же сессии, например через планировщик задач с указанием той учётной записи, под которой работает 1С.