При работе в современных конфигурациях 1С пользователи и администраторы часто сталкиваются с обилием всплывающих окон: уведомления об обновлениях, информационные блоки «Что нового», предложения подключить интернет-поддержку или новости. Эти окна могут замедлять работу и мешать при автоматизированном запуске баз. В данной статье мы проанализируем ситуацию и разберем технические способы автоматизации процесса закрытия таких окон с помощью внешних инструментов.
Для решения задачи мы рассмотрим механизм взаимодействия с операционной системой через WinAPI. Основная логика заключается в создании фонового процесса, который с определенной периодичностью сканирует запущенные окна в системе. Если заголовок найденного окна совпадает со списком «навязчивых» окон 1С, программа отправляет этому окну команду на закрытие. Рассмотрим подробнее, как это реализовать.
Одним из наиболее простых и компактных решений является создание консольной утилиты. Проанализируем код, который считывает список заголовков из текстового файла и закрывает соответствующие окна. Этот метод удобен тем, что не требует изменения самой конфигурации 1С и работает «поверх» всех баз.
Разберем по шагам ключевые функции в коде:
FindWindowW для поиска идентификатора (handle) окна по его точному заголовку.SendMessage с параметром WM_SYSCOMMAND и командой SC_CLOSE для корректного закрытия окна, имитирующего нажатие пользователем кнопки «Закрыть».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С. Проанализируем наиболее часто встречающиеся фразы, которые следует добавить в список исключений:
Подключение Интернет-поддержкиНовые сообщения для расшифровки по 1С-ОтчетностиРекомендуется обновить версию конфигурацииОбновление модуля документооборота с контролирующими органами1C-Отчетность - отчетность прямо из 1С!Проверка правомерности использования конфигурацииИнформация - Бухгалтерия предприятия, редакция 3.0При разработке подобных утилит системные администраторы рекомендуют использовать мьютексы (Mutex). Выясним причину: это предотвращает запуск нескольких копий программы одновременно. Если программа уже запущена в памяти, вторая копия просто завершит свою работу, не создавая лишней нагрузки на систему и не конфликтуя за доступ к файлу настроек.
Если вы не хотите использовать скомпилированные 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
}
Посмотрим на ситуацию со стороны самой платформы. В конфигурациях на базе Библиотеки стандартных подсистем (БСП) часть окон можно отключить программно. Рассмотрим основные возможности:
Ложь через консоль запросов или групповую обработку объектов./DisableStartupMessages в некоторых случаях позволяет подавить стартовые диалоги, однако это не всегда затрагивает окна обновлений и рекламы сервисов.НастройкиПользователей.Важный момент: Мы рекомендуем использовать внешние утилиты (на C++ или Pascal) в тех случаях, когда баз много, они часто обновляются, и вносить изменения в каждую базу (например, через расширение) слишком трудозатратно. Внешняя программа, добавленная в автозапуск пользователя, решает проблему глобально для всех запускаемых сеансов 1С.
Мы рассмотрели несколько подходов к решению проблемы навязчивых окон. Выбор конкретного метода зависит от ваших задач: скомпилированная утилита обеспечит минимальное потребление ресурсов (около 500 Кб ОЗУ), а PowerShell-скрипт будет проще в поддержке и аудите кода. Совместное использование этих инструментов с настройками БСП позволит создать максимально комфортную среду для работы пользователей.