Как автоматически завершать сеансы пользователей в файловой 1С для ночного резервного копирования?

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

При работе с файловой версией 1С:Предприятие 8.3 в терминальном режиме (через удаленный рабочий стол) системные администраторы часто сталкиваются с проблемой: пользователи не закрывают программу в конце рабочего дня. Оставленные открытыми сеансы блокируют базу данных, создавая файлы 1Cv8.lck и exec.lck, что препятствует созданию корректной резервной копии. Разберем подробно, какими способами можно автоматизировать процесс выгона пользователей и обеспечить надежное сохранение данных.

Метод 1: Использование скриптов и планировщика задач Windows

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

Рассмотрим создание командного файла (батника), который будет запускаться по расписанию через Планировщик задач Windows (Task Scheduler). Мы можем пойти двумя путями: мягким завершением процессов или полной очисткой терминальных сессий.

Пример простого скрипта для закрытия всех запущенных клиентов 1С:


taskkill /F /IM 1cv8.exe /T
taskkill /F /IM 1cv8c.exe /T

Здесь флаг /F означает принудительное завершение, /IM указывает имя образа процесса, а /T завершает также все дочерние процессы. Однако, если пользователи работают через RDP, лучше использовать команду logoff. Выясним причину: taskkill закроет только окно программы, но сама сессия пользователя в Windows останется висеть, что может привести к другим проблемам при повторном входе.

Более продвинутый вариант на PowerShell позволяет завершить сеансы всех пользователей, кроме администратора:


$sessions = query user
foreach ($session in $sessions) {
    if ($session -match "rdp-tcp") {
        $id = ($session -split "\s+")[2]
        logoff $id
    }
}

Метод 2: Настройка групповых политик (GPO) для RDP

Посмотрим на ситуацию со стороны настроек сервера. Часто пользователи не "выходят" из системы, а просто закрывают окно RDP "крестиком", переводя сессию в состояние Disconnected (Отключена). В этом состоянии 1С продолжает работать и держать блокировки на файле 1Cv8.1CD.

Чтобы решить эту задачу системно, настроим автоматическое завершение сеансов через редактор локальной групповой политики (gpedit.msc). Пройдем по шагам:

  1. Откроем ветку: Конфигурация компьютера — Административные шаблоны — Компоненты Windows — Службы удаленных рабочих столов — Узел сеансов удаленных рабочих столов — Ограничение времени сеансов.
  2. Найдем параметр "Задайте ограничение по времени для отключенных сеансов". Рекомендуется установить значение 1 или 5 минут. После этого, если пользователь нажмет "крестик", сервер сам корректно завершит его работу через указанное время.
  3. Настроим параметр "Ограничение по времени для активных, но бездействующих сеансов служб удаленных рабочих столов". Если установить здесь, например, 2 часа, то пользователи, ушедшие домой и оставившие сессию открытой, будут автоматически отключены.
  4. Включим опцию "Завершать сеанс при достижении ограничений по времени", чтобы система не просто переводила сессию в режим ожидания, а именно закрывала процессы.

Метод 3: Программное завершение работы внутри 1С

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

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


ПодключитьОбработчикОжидания("ЗавершениеСеансаДляБэкапа", 300); // Проверка каждые 5 минут

Теперь создадим саму процедуру, которая будет проверять текущее время и принимать решение о закрытии программы. Предположим, нам нужно выгнать всех в период с 02:40 до 03:00 ночи:


Процедура ЗавершениеСеансаДляБэкапа() Экспорт
    ТекДата = ТекущаяДата();
    НачалоИнтервала = НачалоДня(ТекДата) + 9600; // 02:40:00 (9600 секунд от начала дня)
    КонецИнтервала = НачалоДня(ТекДата) + 10800; // 03:00:00 (10800 секунд от начала дня)

    Если ТекДата >= НачалоИнтервала И ТекДата <= КонецИнтервала Тогда
        // Завершаем работу системы без подтверждения пользователя
        ПрекратитьРаботуСистемы(Ложь); 
    КонецЕсли;
КонецПроцедуры

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

Метод 4: Использование механизма блокировки соединений

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

Проанализируем объект УстановкаБлокировкиСеансовИнформационнойБазы. С его помощью можно установить сообщение для пользователей, которое они увидят перед отключением. Это гораздо гуманнее, чем резкий вылет программы.


Блокировка = Новый БлокировкаСеансовИнформационнойБазы;
Блокировка.Начало = ТекущаяДата();
Блокировка.Конец = ТекущаяДата() + 3600; // Блокировка на час
Блокировка.Сообщение = "База закрыта для проведения резервного копирования до 04:00";
Блокировка.Установить();

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

Метод 5: Проблема "автоматов" и специализированное ПО

Рассмотрим ситуацию, когда в базе должна круглосуточно работать какая-то обработка (например, обмен данными или регламентное задание). В этом случае обычные "выгонялки" могут нарушить бизнес-процесс. Если обмен важен, стоит рассмотреть переход на клиент-серверный вариант работы или использование VSS (Volume Shadow Copy Service).

Использование службы теневого копирования тома позволяет делать бэкап файла 1Cv8.1CD даже тогда, когда он открыт и заблокирован процессами 1С. Популярные инструменты, такие как Effector Saver или BackUp Maker, умеют работать с VSS. Это избавляет от необходимости выгонять пользователей, так как система создает мгновенный "снимок" файла в консистентном состоянии.

Однако помните: если вы просто скопируете файл 1Cv8.1CD обычным проводником или скриптом copy во время активной записи в базу, вы рискуете получить поврежденный архив ("битый" файл), который невозможно будет восстановить. Поэтому либо используйте специализированное ПО с поддержкой VSS, либо гарантированно завершайте все сеансы 1С и RDP перед копированием.

Резюме и рекомендации

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

← На главную