Сворачиваем клиент 1С:Предприятия из кода, скрипта и командной строки
Содержание
Во встроенном языке 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С в этом примере:
ENTERPRISE— запуск в режиме «1С:Предприятие», а не Конфигуратора./F— путь к файловой базе; для серверной используют/S"сервер\база"./Nи/P— имя и пароль пользователя./DisableStartupMessagesи/DisableStartupDialogs— подавляют стартовые сообщения и диалоги, которые иначе ждут нажатия кнопки./C— строка параметра, которая в коде доступна черезПараметрЗапуска. По ней модуль приложения понимает, что стартовал робот.
Запускайте сразу 1cv8c.exe или 1cv8.exe из папки bin нужной версии, а не стартер 1cestart.exe. Стартер сам порождает дочерний процесс клиента, и подсказка «свернуто» до него может не дойти.
Тот же эффект без bat-файла дают свойства ярлыка: щёлкните ярлык правой кнопкой, откройте вкладку «Ярлык» и в поле «Окно» выберите «Свернутое в значок». В Планировщике заданий Windows отдельной галочки «свернуто» нет, поэтому туда ставят bat-файл со start /min.
Если клиент всё же разворачивается после заставки — это особенность конкретной версии платформы. Тогда подсказку ОС дополняют программным сворачиванием из следующего раздела.
Как свернуть окно 1С программно через PowerShell и WinAPI
Это главный приём для задачи «свернуть по событию»: обмен закончился — окно ушло в панель задач. Схема такая:
- Код 1С ставит главному окну уникальный заголовок.
- Код 1С запускает PowerShell-скрипт и передаёт ему этот заголовок.
- Скрипт находит процесс клиента с таким заголовком окна и вызывает
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 | Что происходит |
|---|---|---|
| 6 | SW_MINIMIZE | Свернуть окно, фокус уходит следующему окну |
| 7 | SW_SHOWMINNOACTIVE | Свернуть, не трогая активное окно пользователя |
| 9 | SW_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С на удалённом рабочем столе?
Get-Process вернёт процесс без заголовка.