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

Разработка и Конфигурация · 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 зависит от раскладки и активного окна в момент отправки. Использовать его стоит только как временное решение на конкретном рабочем месте с фиксированным заголовком сеанса. На серверных сеансах без интерактивного рабочего стола метод не сработает вовсе.

Типичные ошибки
01
Поиск окна по неполному заголовку — AppActivate активирует чужое окно, и клавиши уходят не туда
02
Вызов SendKeys без паузы после AppActivate — окно не успевает получить фокус, команда теряется
03
Запуск кода в фоновом задании на сервере — там нет рабочего стола, COM-объект создаётся, но окна не существует

Сворачивание через внешнюю компоненту и WinAPI

Более надёжный путь — внешняя компонента, реализующая вызовы WinAPI: FindWindow для поиска дескриптора окна и ShowWindow с параметром SW_MINIMIZE (значение 6) для сворачивания. Такие компоненты пишутся по технологии Native API на C++, либо используются готовые универсальные библиотеки вызова WinAPI из 1С.

Логика вызова из кода 1С выглядит так: подключается компонента, по заголовку или классу окна находится дескриптор главного окна клиента, затем вызывается функция сворачивания. Преимущество перед SendKeys — отсутствие зависимости от фокуса и раскладки: команда адресуется конкретному окну по его дескриптору.

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

powershell
# 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: внешний скрипт подключается к базе, выполняет любые операции через объектную модель, и никакого окна при этом не создаётся.

Порядок действий для COM-соединения
  1. 1
    Создайте COMОбъект("V83.COMConnector") в скрипте или другой базе 1С
  2. 2
    Установите соединение методом Connect с указанием строки подключения к базе
  3. 3
    Выполните нужные операции через объектную модель соединения
  4. 4
    Освободите соединение присвоением переменной Неопределено
  5. 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 и минимальным вмешательством в рабочее место пользователя.

Маршрут решения

Как выбрать действие

Нужно разово убрать окно с глаз пользователя на конкретном ПКИспользуйте внешний PowerShell-скрипт с ShowWindow по дескриптору процесса 1cv8
Обработка должна идти регулярно и без интерфейсаПеренесите логику в регламентное или фоновое задание
1С используется как движок из внешней системыПодключайтесь через COM-соединение V83.COMConnector — окна не будет вовсе
Нет возможности ставить компоненты и скрипты, но нужно скрыть окноОграничьтесь WScript.Shell с AppActivate, приняв его низкую надёжность

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

После внедрения любого способа проверьте три вещи: окно действительно сворачивается (а не активируется чужое приложение), сеанс продолжает выполнять поставленную задачу, и по завершении сеанс корректно закрывается, не оставляя зависших процессов 1cv8 в диспетчере задач.

Учитывайте ограничения платформы: в веб-клиенте управление окном браузера из кода 1С невозможно; на Linux-клиенте WinAPI-решения не работают; при включённой защите от опасных действий каждая компонента и COM-вызов потребуют подтверждения. Для серверных сценариев единственный корректный путь — задания без интерфейса.

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

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

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

Окно 1С свёрнуто в панель задач, сеанс активен

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

Активировано другое приложение или окно осталось развёрнутым

Процессы 1cv8 в диспетчере задач
Норма

Число процессов соответствует реальным сеансам

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

Накапливаются зависшие процессы после каждого запуска

Выполнение задачи в свёрнутом сеансе
Норма

Обработка завершается, данные записаны

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

Код остановился на модальном окне, ожидающем ввода

Итог

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

Свернуть окно 1С штатным методом нельзя — используйте WinAPI через компоненту или внешний скрипт с ShowWindow. Для автоматизации надёжнее вообще избавиться от окна: фоновые задания, пакетный режим или COM-соединение решают задачу без сворачивания.

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

Можно ли свернуть окно 1С средствами только встроенного языка?

Нет. Во встроенном языке нет методов управления состоянием главного окна операционной системы. Все рабочие способы выходят за пределы платформы: WinAPI через внешнюю компоненту, COM-объекты Windows или внешние скрипты, работающие с дескриптором окна.

Почему SendKeys иногда не сворачивает окно?

Метод зависит от того, какое окно активно в момент отправки клавиш. Если AppActivate не нашёл окно по заголовку или фокус успел переключиться, сочетание клавиш уходит в другое приложение. Добавьте паузу между активацией и отправкой и убедитесь, что заголовок окна указан точно.

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

Нет. Веб-клиент выполняется внутри браузера, и код 1С не может управлять окном браузера. Теоретически возможны решения через расширение браузера, но на практике для веб-клиента задачу решают переносом логики в фоновые задания на сервере.

Как запустить обработку 1С, чтобы окно вообще не появлялось?

Используйте COM-соединение через V83.COMConnector из внешнего скрипта или другой базы — интерфейс при этом не создаётся. Альтернатива в клиент-серверном режиме — регламентное задание, которое исполняется на сервере без сеанса с интерфейсом.

Опасно ли сворачивать окно во время выполнения обработки?

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

Что делать, если сеанс запущен под другой учётной записью?

Управлять окном чужой сессии нельзя — Windows изолирует рабочие столы пользователей. Скрипт сворачивания нужно запускать внутри той же сессии, например через планировщик задач с указанием той учётной записи, под которой работает 1С.