Разработчики и администраторы, работающие с платформой 1С:Предприятие 7.7, часто сталкиваются с необходимостью монопольного доступа к базе данных. Это требуется для проведения технического обслуживания: резервного копирования, обновления конфигурации, восстановления последовательностей или переиндексации таблиц. Поскольку в версии 7.7 отсутствует штатный серверный кластер с возможностью управления сеансами, задача «выгона» пользователей из файловой базы ложится на плечи администратора. В этой статье мы подробно разберем, как решить эту задачу программными и административными методами.
Самый деликатный способ отключения пользователей — использование встроенного механизма 1С:Предприятия. Мы можем настроить периодическую проверку определенного флага (например, значения константы в базе или файла в сетевом каталоге). Если флаг установлен, система предупреждает пользователя и корректно закрывает приложение.
Рассмотрим по шагам реализацию этого механизма через конфигуратор:
ПриНачалеРаботыСистемы запустим периодическую проверку с помощью функции ОбработкаОжидания.БлокировкаРаботы) или проверять наличие определенного файла на диске.Посмотрим на пример кода, который необходимо разместить в глобальном модуле:
Процедура ПриНачалеРаботыСистемы()
// Запускаем проверку каждые 60 секунд
ОбработкаОжидания("ПроверитьРежимБлокировки", 60);
КонецПроцедуры
Процедура ПроверитьРежимБлокировки()
// Проверяем состояние нашей константы блокировки
Если Константа.БлокировкаРаботы.Получить(РабочаяДата()) = 1 Тогда
// Сначала предупреждаем пользователя
Предупреждение("Внимание! Администратор закрывает систему для обслуживания. Сохраните данные!", 30);
// Завершаем работу системы
ЗавершитьРаботуСистемы(0);
КонецЕсли;
КонецПроцедуры
Важное ограничение метода: Как справедливо отмечают специалисты, встроенный метод ОбработкаОжидания в 1С 7.7 перестает работать, если у пользователя на экране открыто любое модальное окно (например, предупреждение, вопрос системы или окно выбора значения). Программа просто проигнорирует таймер ожидания, пока окно не будет закрыто вручную.
Для обхода этой проблемы разработчики используют внешние компоненты. Проанализируем ситуацию: с помощью компоненты FormEx.dll можно перехватывать системные события Windows и принудительно эмулировать нажатие клавиш Esc или Enter для закрытия модальных окон, либо вызывать жесткое, но безопасное завершение процесса 1С, минуя стандартный интерактивный диалог выхода.
Прежде чем выгонять текущих пользователей, необходимо гарантировать, что новые пользователи не смогут войти в базу во время проведения профилактических работ. Для этого используется изящный административный прием с каталогом учетных записей.
В каталоге вашей базы данных находится папка usrdef, внутри которой хранится файл users.usr со списком пользователей и их правами. Разберем алгоритм действий:
usrdef в любое другое имя, например, в _usrdef.usrdef.Если пользователи работают с базой данных на сервере терминалов (что является наиболее частым сценарием для файловых баз 1С 7.7), самым быстрым и эффективным методом очистки базы является сброс процессов операционной системы.
Для мгновенного и гарантированного закрытия всех зависших сессий и открытых программ 1С мы можем использовать командный файл (батник) со следующими командами:
:: Жестко завершаем процессы локальных и сетевых пользователей терминала
taskkill /F /IM 1cv7.exe
taskkill /F /IM 1cv7s.exe
Параметр /F указывает на принудительное завершение процесса, а параметр /IM задает имя исполняемого файла (обычная и сетевая версии 1С 7.7 соответственно). Этот метод «убивает» процессы мгновенно. Обратите внимание, что несохраненные данные пользователей при таком подходе будут утеряны, поэтому рекомендуется предварительно разослать предупреждения.
Для закрытия зависших терминальных сессий пользователей (RDP), которые продолжают удерживать файлы базы данных, используем утилиты командной строки:
:: Получаем список активных сессий
qwinsta
:: Завершаем сессию конкретного пользователя по его ID (например, ID 5)
rwinsta 5
Если база данных расположена на выделенном файловом сервере, и пользователи подключаются к ней через общие сетевые папки (сетевой доступ по протоколу SMB), то физически завершить их сеансы можно непосредственно на сервере, закрыв открытые файлы базы данных (файлы таблиц .dbf, индексов .cdx и файл блокировок 1Cv7.LCK).
Рассмотрим два основных инструмента системного администрирования:
openfiles /disconnect /a *
Это приведет к принудительному закрытию всех открытых сетевых файлов на сервере. У пользователей на рабочих станциях программа 1С мгновенно завершит работу с ошибкой сетевого доступа, освободив базу для монопольного режима.Close-SmbOpenFile. Он работает быстрее устаревших консольных утилит. Пример скрипта PowerShell для закрытия файлов базы:
Get-SmbOpenFile | Where-Object {$_.Path -like "*1Cv7*"} | Close-SmbOpenFile -Force
Важное предупреждение: Принудительное закрытие сетевых файлов (особенно файлов индексов .cdx) может привести к повреждению индексных таблиц базы данных 1С 7.7. Будьте готовы к тому, что при первом последующем запуске системы в монопольном режиме программа потребует выполнить полную переиндексацию таблиц. Это штатное поведение системы, гарантирующее целостность ваших данных.