Как программно скрыть или закрыть окно сообщений в 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

В процессе разработки и автоматизации задач в платформе 1С:Предприятие 7.7 разработчики часто сталкиваются с ситуацией, когда служебное окно сообщений необходимо не просто очистить, но и полностью убрать с экрана. Стандартная встроенная процедура ОчиститьОкноСообщений() удаляет выведенный текст, однако сама панель остается видимой в интерфейсе. Разберем доступные способы решения этой задачи, их преимущества и ограничения.

Ограничения штатных методов платформы

В штатном синтаксисе языка 1С 7.7 отсутствуют прямые методы управления отображением системных стыкуемых панелей интерфейса. Чтобы программно скрыть окно сообщений, нам потребуется прибегнуть либо к сценариям Windows Script Host (WSH), либо к внешним компонентам, расширяющим возможности платформы.

Способ 1. Использование Windows Script Host (эмуляция горячих клавиш)

Штатно в 1С:Предприятии 7.7 за скрытие и отображение панели сообщений отвечает комбинация клавиш Ctrl + Shift + Z. Мы можем сымитировать нажатие этой комбинации с помощью системного COM-объекта WScript.Shell.

Рассмотрим пример программного кода:


WSHShell = СоздатьОбъект("WScript.Shell");
WSHShell.SendKeys("^+z"); // Имитация нажатия комбинации Ctrl+Shift+Z
WSHShell.SendKeys("^+я"); // Для случая, когда активна русская раскладка клавиатуры

Разберем особенности и подводные камни этого метода:

  1. Символы модификаторов: символ ^ обозначает клавишу Ctrl, а символ + — клавишу Shift.
  2. Зависимость от раскладки клавиатуры: метод SendKeys чувствителен к текущей системной раскладке. Дублирование вызова для английской буквы «z» и русской «я» (находящейся на той же физической клавише) повышает надежность срабатывания.
  3. Принцип триггера (Toggle): данная комбинация клавиш работает как переключатель. Если окно сообщений уже было скрыто пользователем, отправка нажатия откроет его заново.
  4. Фокус ввода: метод отправляет команды в активное окно. Если в момент вызова фокус сместился на стороннюю программу или модальный диалог, комбинация будет передана некорректно.

Способ 2. Использование внешней компоненты FormEx

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

Посмотрим на пример вызова метода:


Сервис = СоздатьОбъект("Сервис");
Сервис.Окна.ПоказыватьПанель("Окно сообщений", 0);

Преимущества данного подхода:

  1. Прямое управление состоянием: параметр 0 явно указывает, что панель должна быть скрыта, исключая случайное открытие, как в случае с триггерными горячими клавишами.
  2. Независимость от фокуса и раскладки: вызов метода выполняется напрямую на уровне оконного интерфейса приложения.

Способ 3. Управление через Windows API

Если использование эмуляции клавиатуры нежелательно, а использование дополнительных тяжелых библиотек ограничено, можно отправлять оконные команды системными вызовами Windows API (например, через динамические обертки вроде DynamicWrapper).

Управление реализуется следующими способами:

  1. Отправка команды меню главному окну: вызов функции SendMessage(hWnd, WM_COMMAND, 32800, 0), где 32800 — внутренний идентификатор команды переключения панели сообщений.
  2. Прямое скрытие окна: поиск дескриптора (HWND) окна сообщений или стыкуемого контейнера с последующим вызовом функции ShowWindow(hWnd, SW_HIDE).

Альтернативные архитектурные решения

Если окно сообщений мешает при выполнении регламентных или пакетных обработок, проанализируем другие подходы к выводу служебных данных:

  1. Использование статусной строки: метод Состояние("Текст уведомления") выводит информацию в нижнюю панель окна программы, не вызывая появления плавающего окна сообщений.
  2. Логирование в файл: для фоновых процессов предпочтительнее вести запись событий в отдельный текстовый лог с помощью объекта Текст.
  3. Собственная немодальная форма: вывод прогресса и промежуточных данных в специально созданную форму обработки, которую можно в любой момент закрыть стандартным методом Форма.Закрыть().
← На главную