Сворачиваем клиент 1С:Предприятия из кода, скрипта и командной строки

· 10 мин

Содержание

Во встроенном языке 1С 8.3 нет метода, который сворачивает главное окно программы. Свернуть окно 1С программно можно только через операционную систему: из кода 1С запустить PowerShell-скрипт с вызовом WinAPI ShowWindow, либо стартовать клиент сразу свернутым через start /min или свойства ярлыка. Работает это в тонком и толстом клиенте под Windows, в веб-клиенте — нет.

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

Почему встроенный язык не умеет свернуть окно

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

Поэтому любое программное сворачивание сводится к одному из трёх путей:

  • 🚀 Запуск свернутым — окно появляется сразу в панели задач, без кода в конфигурации.
  • 🧩 Внешний процесс из 1С — код 1С вызывает PowerShell или утилиту, а та сворачивает окно через WinAPI.
  • 🤖 Внешний планировщик — AutoHotkey или скрипт на стороне ОС следит за окном 1С и сворачивает его сам.
СпособКогда подходитЧто нужноСлабое место
start /min или ярлыкРобот стартует по расписаниюНичего, кроме bat-файлаКлиент может проигнорировать подсказку ОС
PowerShell + ShowWindowСвернуть по событию из кода 1СПраво запускать приложения, PowerShellНе работает в безопасном режиме и веб-клиенте
AutoHotkey, NirCmdОкно должно быть свернуто всегдаУстановленная утилитаСторонняя программа на рабочем месте
xdotoolКлиент 1С на Linux с X11Пакет xdotoolНе работает под Wayland без XWayland

Запуск 1С в свернутом окне из командной строки

У исполняемых файлов 1cv8.exe и 1cv8c.exe нет параметра командной строки, который открывает клиент свернутым. Зато Windows умеет передать программе подсказку о начальном состоянии окна. Самый короткий вариант — команда start с ключом /min.

@echo off
rem Тонкий клиент, файловая база, пользователь-робот
start "" /min "C:\Program Files\1cv8\8.3.xx.xxxx\bin\1cv8c.exe" ENTERPRISE ^
  /F"D:\Bases\Buh" /N"Робот" /P"пароль" ^
  /DisableStartupMessages /DisableStartupDialogs ^
  /C"ЗапускОбмена"

Пустые кавычки после start обязательны: первый аргумент в кавычках команда считает заголовком окна консоли. Без них путь к 1С превратится в заголовок, и ничего не запустится.

Что делают ключи 1С в этом примере:

  1. ENTERPRISE — запуск в режиме «1С:Предприятие», а не Конфигуратора.
  2. /F — путь к файловой базе; для серверной используют /S"сервер\база".
  3. /N и /P — имя и пароль пользователя.
  4. /DisableStartupMessages и /DisableStartupDialogs — подавляют стартовые сообщения и диалоги, которые иначе ждут нажатия кнопки.
  5. /C — строка параметра, которая в коде доступна через ПараметрЗапуска. По ней модуль приложения понимает, что стартовал робот.

Запускайте сразу 1cv8c.exe или 1cv8.exe из папки bin нужной версии, а не стартер 1cestart.exe. Стартер сам порождает дочерний процесс клиента, и подсказка «свернуто» до него может не дойти.

Тот же эффект без bat-файла дают свойства ярлыка: щёлкните ярлык правой кнопкой, откройте вкладку «Ярлык» и в поле «Окно» выберите «Свернутое в значок». В Планировщике заданий Windows отдельной галочки «свернуто» нет, поэтому туда ставят bat-файл со start /min.

Если клиент всё же разворачивается после заставки — это особенность конкретной версии платформы. Тогда подсказку ОС дополняют программным сворачиванием из следующего раздела.

Как свернуть окно 1С программно через PowerShell и WinAPI

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

  1. Код 1С ставит главному окну уникальный заголовок.
  2. Код 1С запускает PowerShell-скрипт и передаёт ему этот заголовок.
  3. Скрипт находит процесс клиента с таким заголовком окна и вызывает ShowWindow из user32.dll.

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

Скрипт PowerShell

Сохраните файл, например, в C:\1C\scripts\min1c.ps1. Папку лучше закрыть от записи для обычных пользователей: скрипт выполняется с их правами, и подменить его не должен никто, кроме администратора.

param([string]$Title, [int]$Mode = 6)

Add-Type @"
using System;
using System.Runtime.InteropServices;
public static class Win {
    [DllImport("user32.dll")]
    public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
}
"@

# Окно могло ещё не обновить заголовок: пробуем 10 раз с паузой
for ($i = 0; $i -lt 10; $i++) {
    $p = Get-Process -Name 1cv8c, 1cv8 -ErrorAction SilentlyContinue |
         Where-Object { $_.MainWindowTitle -like "*$Title*" } |
         Select-Object -First 1
    if ($p) {
        [Win]::ShowWindow($p.MainWindowHandle, $Mode) | Out-Null
        exit 0
    }
    Start-Sleep -Milliseconds 300
}
exit 1

Второй параметр — режим ShowWindow. Пригодятся три значения:

ЗначениеКонстанта WinAPIЧто происходит
6SW_MINIMIZEСвернуть окно, фокус уходит следующему окну
7SW_SHOWMINNOACTIVEСвернуть, не трогая активное окно пользователя
9SW_RESTOREРазвернуть обратно в прежний размер

Для робота на компьютере, где кто-то работает, удобнее 7: окно уйдёт вниз и не перехватит фокус у текущей программы.

Код в модуле формы

Пример для управляемой формы, клиентский контекст. Запуск идёт через WScript.Shell.Run с флагом окна 0: так консоль PowerShell не мелькает на экране. При обычном ЗапуститьПриложение чёрное окно на долю секунды всё равно появляется, даже с ключом -WindowStyle Hidden.

&НаКлиенте
Процедура СвернутьОкноПрограммы(Команда)

    Метка = "Робот обмена " + Формат(ТекущаяУниверсальнаяДатаВМиллисекундах(), "ЧГ=0");
    УстановитьЗаголовокКлиентскогоПриложения(Метка);

    СтрокаЗапуска = СтрШаблон(
        "powershell.exe -NoProfile -ExecutionPolicy Bypass -File ""%1"" -Title ""%2"" -Mode 7",
        "C:\1C\scripts\min1c.ps1", Метка);

    Попытка
        Shell = Новый COMОбъект("WScript.Shell");
        Shell.Run(СтрокаЗапуска, 0, Ложь);
    Исключение
        ОбщегоНазначенияКлиент.СообщитьПользователю(
            "Не удалось свернуть окно: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
    КонецПопытки;

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

Третий параметр Run — ждать ли завершения скрипта. Здесь Ложь: 1С не ждёт и сразу продолжает работу, а скрипт сам дождётся смены заголовка. Число в метке переведено в строку через Формат(..., "ЧГ=0"), иначе платформа вставит пробелы-разделители групп разрядов.

ОбщегоНазначенияКлиент.СообщитьПользователю есть в конфигурациях на БСП. В самописной конфигурации замените вызов на Сообщить() или запись в журнал регистрации.

Метка остаётся заголовком окна до конца сеанса. Для робота это даже удобно: администратор сразу видит в панели задач, какой сеанс служебный.

Развернуть окно обратно можно тем же скриптом с -Mode 9. Он ищет окно по заголовку, а у свернутого окна заголовок сохраняется.

Вариант через SendKeys — и почему не стоит

В старых обработках встречается приём Shell.AppActivate(Заголовок) и затем Shell.SendKeys("% ") с буквой пункта системного меню. Он открывает меню окна по Alt+Пробел и «нажимает» пункт «Свернуть». Работает ненадёжно:

  • 🔤 буква пункта зависит от языка Windows: в русской системе одна, в английской другая;
  • 🖱️ если пользователь в этот момент печатает, нажатия уйдут не туда;
  • 🛡️ эмуляцию клавиатуры антивирусы любят отмечать как подозрительную.

ShowWindow делает то же самое одним системным вызовом и от раскладки не зависит.

Внешние утилиты: AutoHotkey, NirCmd, xdotool

Если окно робота должно быть свернуто всегда, проще поручить это утилите на стороне ОС. В конфигурации тогда не меняется ни строчки.

AutoHotkey — бесплатный язык автоматизации для Windows. Скрипт для версии 1.x ждёт появления окна тонкого клиента и сворачивает его:

#Persistent
SetTitleMatchMode, 2
Loop {
    WinWait, Робот обмена ahk_exe 1cv8c.exe
    WinMinimize
    WinWaitClose
}

SetTitleMatchMode, 2 включает поиск по части заголовка. В AutoHotkey 2.x синтаксис другой: команды пишутся как функции, например WinMinimize "ahk_exe 1cv8c.exe".

NirCmd — консольная утилита, которую удобно дописать в конец bat-файла после старта 1С:

timeout /t 20 /nobreak >nul
nircmd.exe win min process 1cv8c.exe

Пауза нужна, чтобы клиент успел открыть главное окно. Учтите: команда свернёт все окна этого процесса, то есть все открытые на компьютере базы.

Linux. Клиент 1С под Linux работает в обычной графической среде, и WinAPI там нет. В сеансе X11 окно сворачивает xdotool:

xdotool search --name "Робот обмена" windowminimize

Под Wayland xdotool чужими окнами управлять не может — нужна сессия X11 или средства конкретного окружения рабочего стола.

Тонкий, толстый и веб-клиент: что где работает

Клиентstart /min, ярлыкPowerShell из кода 1СВнешние утилиты
Тонкий (1cv8c.exe), Windows✅✅✅
Толстый (1cv8.exe), Windows✅✅✅
Тонкий клиент, Linux—Через xdotool из кода✅ xdotool
Веб-клиент в браузере—❌Только окно браузера целиком

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

В толстом клиенте процесс называется 1cv8.exe. Этот же файл открывает и Конфигуратор. Если на компьютере разработчика открыт Конфигуратор, поиск только по имени процесса может свернуть его вместо базы — ещё один довод в пользу уникального заголовка.

Для Linux из кода 1С вызов выглядит так же, как для Windows, только вместо PowerShell запускается xdotool через ЗапуститьПриложение(). COMОбъект на Linux недоступен.

Безопасный режим, права и обработка ошибок

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

Безопасный режим. Дополнительные обработки, подключённые через подсистему «Дополнительные отчеты и обработки» БСП, по умолчанию выполняются в безопасном режиме. В нём создание COM-объектов и запуск приложений запрещены. Варианты:

  • 🔧 встроить команду в саму конфигурацию или в расширение;
  • 📝 зарегистрировать обработку как небезопасную с запросом разрешений — решение принимает администратор базы.

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

Политики Windows. PowerShell может быть ограничен политикой выполнения или средствами вроде AppLocker. Ключ -ExecutionPolicy Bypass действует только на локальную политику, групповую он не обходит. В доменной сети договоритесь с администратором о подписи скрипта или белом списке.

Диагностика: выберите симптом

Не храните пароль робота открытым текстом в bat-файле с ключом /P. Строку запуска видно в списке процессов и в планировщике. Надёжнее аутентификация Windows для пользователя-робота: тогда /N и /P не нужны вовсе.

Если окно не нужно вовсе: другие варианты автоматизации

Часто просьба «свернуть окно 1С» на деле означает «пусть задача выполнится и не мешает». Для этого есть способы, где окна просто нет.

ЗадачаЧем заменить свернутое окно
Обмен, загрузка курсов, выписок по расписаниюРегламентные задания в клиент-серверной базе — работают на сервере без клиента
Долгая операция по кнопке пользователяФоновое задание: пользователь продолжает работу, окно не блокируется
Внешняя программа читает или пишет данные 1СCOM-соединение V83.COMConnector или HTTP-сервис — без интерфейса
Разовый запуск обработки по расписаниюКлюч /Execute"путь\к\обработке.epf" и завершение сеанса в конце обработки

Ключ /Execute запускает внешнюю обработку сразу после входа в базу. Если в конце её кода вызвать ЗавершитьРаботуСистемы(Ложь), сеанс закроется сам, без вопроса о выходе. В сочетании со start /min окно пробудет в панели задач ровно столько, сколько работает обработка.

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

COM-соединение занимает клиентскую лицензию так же, как обычный сеанс. При подсчёте лицензий на сервере учитывайте и роботов.

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

Можно ли спрятать 1С в трей рядом с часами?
Штатно нет: у клиента 1С нет значка в области уведомлений. Окно можно только свернуть в панель задач или скрыть сторонней утилитой, но потом его придётся так же возвращать.
Продолжает ли 1С работать, когда окно свернуто?
Да. Обработчики ожидания, обмены и длительные операции выполняются как обычно. Свернутое окно лишь не перерисовывается на экране.
Как свернуть 1С с клавиатуры без кода?
Сочетание Win+↓ сворачивает активное окно, Win+D или Win+M — все окна сразу. Это работает для любого окна Windows, включая 1С.
Почему скрипт не находит окно сразу после старта клиента?
Главное окно появляется после авторизации и заставки, а заголовок с меткой ставит уже код конфигурации. Поэтому в скрипте есть повторные попытки с паузой; при медленном старте увеличьте их число.
Можно ли свернуть окно 1С на удалённом рабочем столе?
Да, если скрипт выполняется внутри того же сеанса RDP, что и клиент 1С. Из другого сеанса Windows чужое окно не видно, и Get-Process вернёт процесс без заголовка.