Как автоматически закрывать навязчивые всплывающие окна в 1С:Предприятие?

Системный администратор 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе в современных конфигурациях 1С пользователи и администраторы часто сталкиваются с обилием всплывающих окон: уведомления об обновлениях, информационные блоки «Что нового», предложения подключить интернет-поддержку или новости. Эти окна могут замедлять работу и мешать при автоматизированном запуске баз. В данной статье мы проанализируем ситуацию и разберем технические способы автоматизации процесса закрытия таких окон с помощью внешних инструментов.

Принцип работы автоматического закрытия окон

Для решения задачи мы рассмотрим механизм взаимодействия с операционной системой через WinAPI. Основная логика заключается в создании фонового процесса, который с определенной периодичностью сканирует запущенные окна в системе. Если заголовок найденного окна совпадает со списком «навязчивых» окон 1С, программа отправляет этому окну команду на закрытие. Рассмотрим подробнее, как это реализовать.

Реализация на языке Pascal (FreePascal/Lazarus)

Одним из наиболее простых и компактных решений является создание консольной утилиты. Проанализируем код, который считывает список заголовков из текстового файла и закрывает соответствующие окна. Этот метод удобен тем, что не требует изменения самой конфигурации 1С и работает «поверх» всех баз.

Разберем по шагам ключевые функции в коде:

  1. Использование функции FindWindowW для поиска идентификатора (handle) окна по его точному заголовку.
  2. Применение функции SendMessage с параметром WM_SYSCOMMAND и командой SC_CLOSE для корректного закрытия окна, имитирующего нажатие пользователем кнопки «Закрыть».
  3. Цикл с использованием Sleep для снижения нагрузки на процессор.

program WindowCloser;
{$apptype gui}
{$mode objfpc}{$H+}
{$codepage UTF8}

uses
  SysUtils, Classes, Windows;

const
  FileName = 'kwnd'; // Файл со списком заголовков

var
  list: TStringList;
  titles: array of UnicodeString;
  wTitle: UnicodeString;
  hWnd: THandle;
  i: Integer;

begin
  list := TStringList.Create;
  if not FileExists(FileName) then
  begin
    // Создаем файл по умолчанию, если он отсутствует
    list.Add('Рекомендуется обновить версию конфигурации');
    list.Add('Подключение Интернет-поддержки');
    list.SaveToFile(FileName);
  end else
    list.LoadFromFile(FileName);

  // Переносим заголовки в массив для быстрого доступа
  for i := 0 to list.Count - 1 do
  begin
    setlength(titles, length(titles) + 1);
    titles[length(titles) - 1] := list[i];
  end;
  list.Free;

  while True do
  begin
    for wTitle in titles do
    begin
      // Ищем окно по заголовку
      hWnd := FindWindowW(nil, PWideChar(wTitle));
      if (IsWindow(hWnd)) then
      begin
        // Отправляем команду закрытия
        SendMessage(hWnd, WM_SYSCOMMAND, SC_CLOSE, 0);
      end;
    end;
    Sleep(1000); // Задержка в 1 секунду
  end;
end.

Список типичных заголовков окон для блокировки

Для эффективной работы утилиты важно точно знать заголовки окон, которые генерирует платформа 1С. Проанализируем наиболее часто встречающиеся фразы, которые следует добавить в список исключений:

Использование мьютексов для стабильной работы

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

Альтернативные методы через PowerShell

Если вы не хотите использовать скомпилированные EXE-файлы, рассмотрим вариант реализации на PowerShell. Это решение более прозрачно для служб безопасности. Скрипт может выглядеть следующим образом:


$titles = @(
    "Рекомендуется обновить версию конфигурации",
    "Подключение Интернет-поддержки"
)

while($true) {
    foreach($title in $titles) {
        $window = Get-Process | Where-Object {$_.MainWindowTitle -eq $title}
        if($window) {
            $window.CloseMainWindow() | Out-Null
        }
    }
    Start-Sleep -Seconds 2
}

Внутренние настройки 1С (БСП)

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

Важный момент: Мы рекомендуем использовать внешние утилиты (на C++ или Pascal) в тех случаях, когда баз много, они часто обновляются, и вносить изменения в каждую базу (например, через расширение) слишком трудозатратно. Внешняя программа, добавленная в автозапуск пользователя, решает проблему глобально для всех запускаемых сеансов 1С.

Заключение

Мы рассмотрели несколько подходов к решению проблемы навязчивых окон. Выбор конкретного метода зависит от ваших задач: скомпилированная утилита обеспечит минимальное потребление ресурсов (около 500 Кб ОЗУ), а PowerShell-скрипт будет проще в поддержке и аудите кода. Совместное использование этих инструментов с настройками БСП позволит создать максимально комфортную среду для работы пользователей.

← На главную