Разработка и Конфигурация · 12 мин
Как программно свернуть форму в 1С
Как программно свернуть форму в 1С: методы СвернутьОкно, НачатьСвертываниеОкна, работа с клиентом приложения и ограничения платформы на разных версиях.
Задача свернуть окно приложения или форму из кода возникает в 1С чаще, чем кажется: например, при автоматизации демонстрационных сценариев, при интеграции с внешними программами, при работе фоновых обработок или когда пользователь должен увидеть другой экран, не закрывая текущую форму. При этом платформа 1С:Предприятие не даёт универсальной кроссплатформенной команды «свернуть любую форму» — поведение зависит от типа клиента, режима работы (обычное или управляемое приложение) и того, чьё окно нужно свернуть: окно всего клиентского приложения или конкретную форму.
В управляемом приложении формы внутри основного окна клиента не являются отдельными окнами операционной системы, поэтому классическое «сворачивание в панель задач» применимо только к главному окну клиентского приложения. Отдельную управляемую форму можно закрыть, деактивировать или переключить, но не свернуть как окно Windows. Это ключевое ограничение, которое определяет выбор подхода.
Ниже рассмотрены рабочие способы: сворачивание главного окна клиентского приложения, альтернативы для управляемых форм, вариант через внешние средства Windows и типичные ошибки, с которыми сталкиваются разработчики.
Что именно можно свернуть в 1С
Прежде чем писать код, важно разделить два разных объекта. Первый — главное окно клиентского приложения (тонкий или толстый клиент): это настоящее окно операционной системы, у него есть кнопки «Свернуть», «Развернуть», «Закрыть», и оно отображается в панели задач. Второй объект — форма внутри управляемого интерфейса: она живёт в рабочей области главного окна и не имеет собственной кнопки сворачивания.
В обычном приложении (толстый клиент, режим обычных форм) формы могли быть отдельными MDI-окнами, но и там программное сворачивание конкретной формы средствами встроенного языка не поддерживалось напрямую. В управляемом приложении такой возможности нет по определению архитектуры интерфейса «Такси».
Практический вывод: если требование звучит как «свернуть форму», почти всегда имеется в виду одно из трёх — свернуть всё окно 1С, закрыть форму с возможностью вернуться, либо переключить пользователя на другую форму или другое приложение. Каждый сценарий решается своим способом.
Сворачивание главного окна через КлиентскоеПриложение
В актуальных версиях платформы 1С:Предприятие 8.3 у объекта КлиентскоеПриложение есть методы и свойства для управления состоянием главного окна. Доступность конкретных методов зависит от версии платформы и режима совместимости конфигурации, поэтому перед использованием проверьте синтакс-помощник на вашей версии.
Типовой фрагмент кода для сворачивания главного окна выглядит так:
&НаКлиенте
Процедура СвернутьПриложение(Команда)
КлиентскоеПриложение.Свернуть();
КонецПроцедуры
Если метод Свернуть() в вашей версии платформы отсутствует, используйте свойство состояния окна, если оно доступно, или переходите к варианту с внешними средствами, описанному ниже. Проверить наличие метода можно в конфигураторе: откройте синтакс-помощник, найдите объект «КлиентскоеПриложение» и посмотрите список его методов.
Сворачивание через WScript.Shell и Windows API
Когда штатных методов платформы недостаточно или нужна совместимость со старыми версиями, используют объект WScript.Shell операционной системы. Способ работает только в Windows и только там, где разрешено создание COM-объектов.
&НаКлиенте
Процедура СвернутьОкноЧерезShell(Команда)
Попытка
Оболочка = Новый COMОбъект("WScript.Shell");
// Передаём фокус на окно 1С и отправляем команду сворачивания
Оболочка.AppActivate("1С:Предприятие");
Оболочка.SendKeys("% n"); // Alt+Пробел, затем "n" — свернуть
Исключение
Сообщить("Не удалось свернуть окно: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Метод AppActivate ищет окно по подстроке заголовка, поэтому заголовок должен совпадать с реальным заголовком окна клиента. Если конфигурация меняет заголовок (например, через КлиентскоеПриложение.УстановитьЗаголовок), учитывайте это при поиске. Метод SendKeys эмулирует нажатия клавиш и потому нестабилен: если фокус уйдёт в другое окно между AppActivate и SendKeys, команда уйдёт не туда.
Более надёжный, но сложный путь — вызов функции ShowWindow из user32.dll через внешнюю компоненту или через механизм ДлительнаяОперация с внешними утилитами. Для разовых задач обычно достаточно WScript.Shell.
Альтернативы для управляемых форм
Если бизнес-задача — «убрать форму с глаз пользователя, но не терять введённые данные», сворачивание не нужно вовсе. Есть несколько штатных приёмов, которые решают ту же проблему корректнее.
Первый вариант — открыть форму независимо или в отдельном окне и переключаться между формами через Активизировать(). Второй — использовать ОткрытьФорму с параметром РежимОткрытияОкна, чтобы форма открылась поверх, а после её закрытия пользователь автоматически вернулся к исходной. Третий — оповещения: форма-источник остаётся открытой, а взаимодействие идёт через Оповестить() и обработчики оповещений.
&НаКлиенте
Процедура ОткрытьПоверхИВернуться(Команда)
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеЗакрытияФормы", ЭтотОбъект);
ОткрытьФорму("Обработка.МояОбработка.Форма.ФормаВыбора", , ЭтотОбъект, , , ,
ОписаниеОповещения, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
Сравнение вариантов
Штатный способ свернуть всё окно клиента. Подходит, если нужно показать рабочий стол или другое приложение. Зависит от версии платформы.
Работает на старых версиях, только Windows, только толстый/тонкий клиент. Нестабилен при смене фокуса, требует прав на COM.
Правильная замена сворачиванию для управляемых форм: данные хранятся в реквизитах формы-владельца или во временном хранилище.
Подходит, когда нужно временно переключить пользователя на другую задачу и вернуться назад без потери контекста.
Пошаговый сценарий: свернуть 1С перед запуском внешней программы
Частая практическая задача — свернуть окно 1С, открыть внешнее приложение (например, программу банка или браузер с отчётом), а после завершения вернуть окно 1С на передний план.
- 1Определите, какое окно нужно свернуть: главное окно клиента или специфическое окно внешнего приложения.
- 2Проверьте в синтакс-помощнике наличие метода КлиентскоеПриложение.Свернуть() на вашей версии платформы.
- 3Если метод есть — вызовите его в клиентской процедуре формы.
- 4Если метода нет — используйте WScript.Shell с AppActivate по заголовку окна и SendKeys для команды сворачивания.
- 5Запустите внешнее приложение через ЗапуститьПриложение() или НачатьЗапускПриложения() с описанием оповещения о завершении.
- 6После закрытия внешней программы активируйте окно 1С через AppActivate, чтобы вернуть пользователю контекст.
- 7Протестируйте сценарий на реальном рабочем месте: проверьте заголовок окна, права на COM и поведение при двух мониторах.
Пример запуска внешней программы с возвратом:
&НаКлиенте
Процедура ОткрытьВнешнююПрограмму(Команда)
КлиентскоеПриложение.Свернуть();
Оповещение = Новый ОписаниеОповещения("ПослеЗавершенияВнешней", ЭтотОбъект);
НачатьЗапускПриложения(Оповещение, "notepad.exe");
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗавершенияВнешней(КодВозврата, ДополнительныеПараметры) Экспорт
// Возвращаем фокус окну 1С
Попытка
Оболочка = Новый COMОбъект("WScript.Shell");
Оболочка.AppActivate("1С:Предприятие");
Исключение
// Пользователь сам активирует окно
КонецПопытки;
КонецПроцедуры
Проверка результата и ограничения
После внедрения кода проверьте поведение на целевой конфигурации рабочего места. Основные точки контроля:
Как проверить результат
Главное окно клиента уходит в панель задач, в журнале регистрации нет ошибок
Ошибка 'Метод объекта не обнаружен' — метод недоступен в этой версии платформы
Процедура помечена &НаКлиенте, серверный вызов не требуется
Ошибка о недоступности объекта на сервере — код размещён в серверном контексте
Функциональность либо не требуется, либо заменена альтернативным сценарием
COM-объекты и управление окнами в веб-клиенте недоступны — код молча не работает или падает
Окно находится по подстроке заголовка стабильно
Заголовок изменён конфигурацией, окно не находится, команда уходит в другое приложение
Ключевые ограничения, о которых стоит помнить: в веб-клиенте программное сворачивание окна браузера невозможно в принципе; в мобильном клиенте концепция сворачивания окон неприменима; при работе через RDP поведение SendKeys может отличаться. Если решение должно работать на разных клиентах, предусмотрите проверку типа клиента через вычисление выражения вроде определения текущего режима запуска и ветвление логики.
Типичные ошибки разработчиков
Что важно запомнить
Свернуть программно можно только главное окно клиентского приложения — штатным методом КлиентскоеПриложение (в поддерживающих версиях) или через WScript.Shell в Windows. Отдельную управляемую форму свернуть нельзя: используйте закрытие с сохранением данных или переключение между формами. Любой код управления окнами размещайте только на клиенте и тестируйте на целевом рабочем месте.
Частые вопросы
Можно ли свернуть конкретную управляемую форму, не трогая главное окно 1С?
Нет. Управляемые формы отображаются внутри рабочей области главного окна клиентского приложения и не являются окнами операционной системы. Вместо сворачивания используйте закрытие формы с сохранением данных в реквизитах владельца или открытие второй формы поверх с блокировкой окна-владельца.
Работает ли сворачивание окна в веб-клиенте?
Нет. Веб-клиент работает внутри браузера, и платформа не предоставляет средств управления окном браузера. COM-объекты в веб-клиенте также недоступны. Если сценарий требует веб-клиента, пересмотрите логику: например, открывайте внешний ресурс в новой вкладке через ПерейтиПоНавигационнойСсылке.
Почему код с WScript.Shell работает у одних пользователей и не работает у других?
Создание COM-объектов может блокироваться антивирусом, групповыми политиками или настройками безопасного режима. Также AppActivate чувствителен к заголовку окна: если конфигурация устанавливает собственный заголовок, поиск по стандартной строке не сработает. Оборачивайте вызовы в Попытка/Исключение и тестируйте на конкретных рабочих местах.
Как свернуть окно 1С из внешней программы или скрипта?
Извне окно 1С сворачивается стандартными средствами Windows: через PowerShell или скрипт AutoIt найдите окно по заголовку (класс окна или подстрока заголовка) и вызовите для него команду сворачивания (ShowWindow с параметром SW_MINIMIZE). Это надёжнее, чем эмуляция клавиш изнутри 1С.
Можно ли развернуть свёрнутое окно 1С обратно из кода?
Да, если окно сворачивали через WScript.Shell, вернуть его можно тем же методом AppActivate — он активирует окно и восстанавливает его из свёрнутого состояния. Если использовался штатный метод платформы, проверьте в синтакс-помощнике наличие парного метода для восстановления или изменения состояния окна.
Влияет ли сворачивание окна на выполнение фоновых заданий и обработчиков ожидания?
Фоновые задания выполняются на сервере и от состояния окна не зависят. Клиентские обработчики ожидания (ПодключитьОбработчикОжидания) продолжают работать, но фактическое поведение при свёрнутом окне зависит от клиента и системы — если от этого зависит бизнес-логика, перенесите критичные операции на сервер.