Работа с файловыми базами данных «1С:Предприятие 8» накладывает существенные ограничения на административное обслуживание. Одной из наиболее острых проблем является невозможность получения монопольного доступа для выполнения таких операций, как создание резервных копий, тестирование и исправление или обновление конфигурации. Часто это происходит из-за «забытых» сеансов пользователей.
Особенность платформы 1С заключается в том, что файл блокировки 1Cv8.lcl создается операционной системой сразу после запуска исполняемого файла 1cv8.exe и выбора информационной базы, еще до момента ввода логина и пароля. Если пользователь открыл окно авторизации и ушел, или если процесс «завис» на заставке (splash-screen), стандартные механизмы блокировки сеансов через консоль кластера (которая отсутствует в файловом варианте) или через параметры конфигурации не сработают. Разберем, как автоматизировать решение этой задачи.
Проанализируем ситуацию: когда запускается клиентское приложение, оно открывает основной файл базы данных 1Cv8.1CD. Даже если пользователь не ввел пароль, процесс уже удерживает дескрипторы файлов. В операционных системах семейства Windows это предотвращает любые действия, требующие монопольного захвата файла другим процессом. Выгнать такого пользователя «штатными» средствами 1С невозможно, так как сеанс в понимании платформы еще не создан.
Рассмотрим основные сценарии, которые мешают обслуживанию:
1cv8.exe запущен, висит заставка, но база не открывается из-за сетевых проблем или ошибок кэша.Для решения описанных проблем разработана программа «KillerOfUnwantedWindows1C». Она работает в фоновом режиме на стороне клиента (или на терминальном сервере) и отслеживает состояние окон 1С. Выясним, как именно программа определяет, какое окно следует закрыть.
Программа использует функции WinAPI для анализа оконных процессов. Основная логика заключается в идентификации окон по их классу (например, V8TopLevelFrame) и заголовкам. Рассмотрим алгоритм подробнее:
Во-первых, система должна отличить активного пользователя от «забытого» окна. Для этого используется функция GetLastInputInfo. Она позволяет получить время последнего действия пользователя в операционной системе (движение мыши или нажатие клавиш). Если время бездействия превышает заданный порог (например, 120 секунд), программа переходит к анализу окон 1С.
Во-вторых, программа разделяет действия в зависимости от типа «зависшего» элемента. Если обнаружено окно авторизации, применяется «мягкое» закрытие. Проанализируем пример логики на языке C#, который используется в подобных инструментах:
// Отправка сообщения о закрытии окна авторизации
SendMessage(hWnd, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
В-третьих, если процесс 1С обнаружен, но само окно не отвечает или находится в состоянии загрузки (splash-screen) дольше установленного лимита (например, 10 минут), программа применяет принудительное завершение процесса. Посмотрим на реализацию завершения процесса по его идентификатору:
var process = Process.GetProcessById(targetProcessId);
// Принудительное уничтожение процесса, если он мешает доступу к базе
process.Kill();
Многих администраторов беспокоит вопрос: не повредит ли такое «убийство» процесса саму базу данных? Разберем эту ситуацию по шагам. Поскольку программа нацелена именно на окна, возникающие до входа в информационную базу, риск повреждения основного файла 1Cv8.1CD практически отсутствует. В этот момент транзакции еще не начаты, и данные пользователя не записываются.
Однако стоит учитывать влияние на Журнал регистрации. При жестком завершении процесса (через TerminateProcess) записи в журнале (файлы .lgp или .lgf), которые могли инициироваться платформой при попытке входа, могут не успеть сброситься на диск. Но для задач администрирования это является допустимым компромиссом по сравнению с невозможностью сделать бэкап всей базы.
Рассмотрим, как правильно организовать работу программы в зависимости от топологии вашей сети:
MSI-пакет для развертывания через групповые политики (GPO) контроллера домена.Проанализируем настройки по умолчанию. Обычно программа настроена на 120 секунд ожидания в окне авторизации. Этого достаточно, чтобы пользователь успел вспомнить пароль, но в то же время позволяет оперативно освободить базу, если сотрудник ушел на обед, оставив окно открытым.
Посмотрим на сценарий совместного использования с популярными инструментами автоматизации, такими как «Обновлятор-1С». Хотя «Обновлятор» имеет свои механизмы выдворения пользователей, они часто пасуют перед окнами авторизации в файловых базах. В связке с «Киллером нежелательных окон» процесс автоматизации становится практически безупречным: «Киллер» зачищает зависшие окна авторизации, а основной инструмент обслуживания спокойно блокирует базу и выполняет регламентные задания.
Важно помнить, что программа не трогает окна браузеров при работе через веб-клиент. Это логично, так как в случае веб-сервера блокировку файлов осуществляет процесс веб-сервера (например, w3wp.exe или httpd.exe), и администратор может управлять ими централизованно на стороне сервера.
Резюмируем: использование специализированных утилит для мониторинга WinAPI-событий — это надежный способ обеспечить стабильное выполнение ночных заданий по обслуживанию файловых баз 1С, минимизируя человеческий фактор и особенности файловой блокировки платформы.