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

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

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

Метод 1. Программное завершение работы с помощью ОбработкиОжидания

Самый деликатный способ отключения пользователей — использование встроенного механизма 1С:Предприятия. Мы можем настроить периодическую проверку определенного флага (например, значения константы в базе или файла в сетевом каталоге). Если флаг установлен, система предупреждает пользователя и корректно закрывает приложение.

Рассмотрим по шагам реализацию этого механизма через конфигуратор:

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

Посмотрим на пример кода, который необходимо разместить в глобальном модуле:


Процедура ПриНачалеРаботыСистемы()
    // Запускаем проверку каждые 60 секунд
    ОбработкаОжидания("ПроверитьРежимБлокировки", 60);
КонецПроцедуры

Процедура ПроверитьРежимБлокировки()
    // Проверяем состояние нашей константы блокировки
    Если Константа.БлокировкаРаботы.Получить(РабочаяДата()) = 1 Тогда
        // Сначала предупреждаем пользователя
        Предупреждение("Внимание! Администратор закрывает систему для обслуживания. Сохраните данные!", 30);
        // Завершаем работу системы
        ЗавершитьРаботуСистемы(0);
    КонецЕсли;
КонецПроцедуры

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

Для обхода этой проблемы разработчики используют внешние компоненты. Проанализируем ситуацию: с помощью компоненты FormEx.dll можно перехватывать системные события Windows и принудительно эмулировать нажатие клавиш Esc или Enter для закрытия модальных окон, либо вызывать жесткое, но безопасное завершение процесса 1С, минуя стандартный интерактивный диалог выхода.

Метод 2. Блокировка повторного входа через каталог "usrdef"

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

В каталоге вашей базы данных находится папка usrdef, внутри которой хранится файл users.usr со списком пользователей и их правами. Разберем алгоритм действий:

  1. Переименуем папку usrdef в любое другое имя, например, в _usrdef.
  2. Те пользователи, которые уже находятся внутри базы, продолжат свою работу без сбоев (до момента их отключения).
  3. Любой новый пользователь при попытке запустить 1С 7.7 получит системное сообщение об ошибке доступа к списку пользователей и программа автоматически закроется.
  4. После завершения технических работ просто вернем папке оригинальное имя usrdef.

Метод 3. Принудительное завершение процессов на сервере терминалов (RDP)

Если пользователи работают с базой данных на сервере терминалов (что является наиболее частым сценарием для файловых баз 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

Метод 4. Сброс сетевых дескрипторов файлов (для SMB-доступа)

Если база данных расположена на выделенном файловом сервере, и пользователи подключаются к ней через общие сетевые папки (сетевой доступ по протоколу SMB), то физически завершить их сеансы можно непосредственно на сервере, закрыв открытые файлы базы данных (файлы таблиц .dbf, индексов .cdx и файл блокировок 1Cv7.LCK).

Рассмотрим два основных инструмента системного администрирования:

  1. Использование утилиты openfiles: Данная утилита позволяет разорвать подключение к конкретным файлам. Команда выглядит следующим образом: openfiles /disconnect /a * Это приведет к принудительному закрытию всех открытых сетевых файлов на сервере. У пользователей на рабочих станциях программа 1С мгновенно завершит работу с ошибкой сетевого доступа, освободив базу для монопольного режима.
  2. Использование PowerShell на современных серверах: Начиная с Windows Server 2012, для администрирования сетевых ресурсов эффективнее использовать командлет Close-SmbOpenFile. Он работает быстрее устаревших консольных утилит. Пример скрипта PowerShell для закрытия файлов базы:
    
    Get-SmbOpenFile | Where-Object {$_.Path -like "*1Cv7*"} | Close-SmbOpenFile -Force
    
    Этот скрипт находит все открытые сетевые файлы, путь к которым содержит имя каталога 1С, и принудительно их закрывает.

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

← На главную