Как программно проверить результат выполнения команды /CЗавершитьРаботуПользователей и убедиться, что база 1С свободна?

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

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

Анализ механизма работы команды завершения сеансов

Проанализируем сначала, как именно работает штатный механизм. При запуске 1С с параметром /CЗавершитьРаботуПользователей (в типовых конфигурациях на базе БСП) система создает в каталоге базы специальный файл блокировки и рассылает активным пользователям уведомление. По умолчанию платформа дает пользователям 60 секунд на сохранение данных и выход.

Важно понимать, что значение ErrorLevel (код возврата), которое возвращает процесс 1cv8.exe, в данном случае малоинформативно. Если процесс запустился и команда была принята, 1С вернет 0, даже если в базе остались "зависшие" сеансы или модальные окна, блокирующие закрытие программы. Рассмотрим ситуацию глубже: процесс 1С может просто зависнуть, ожидая ответа пользователя на вопрос "Сохранить изменения?", и ваша автоматизация остановится.

Способ 1: Проверка наличия файла блокировок 1Cv8.1CL

Для файловой базы данных основным индикатором активных соединений является файл 1Cv8.1CL (или .lcl в старых версиях). Выясним причину его появления: этот файл создается автоматически, как только первый пользователь открывает базу, и удаляется только тогда, когда базу покидает последний сеанс.

Рассмотрим алгоритм проверки через скрипт:

  1. Запускаем команду завершения работы пользователей.
  2. Выжидаем технологическую паузу (от 1 до 2 минут).
  3. Проверяем наличие файла 1Cv8.1CL в папке с базой.
  4. Если файл отсутствует — база гарантированно свободна.

Важный нюанс: иногда при аварийном завершении работы 1С файл 1Cv8.1CL может "застрять" в файловой системе, хотя реальных процессов нет. Поэтому этот метод лучше комбинировать с проверкой запущенных процессов 1cv8.exe на сервере.

Способ 2: Использование PowerShell для проверки монопольного доступа

Самый надежный метод узнать, свободна ли база — попытаться открыть основной файл базы данных 1Cv8.1CD в монопольном режиме. Если файл занят хотя бы одним сеансом, операционная система не даст его открыть на чтение-запись. Проанализируем пример кода на PowerShell, который можно интегрировать в ваш батник или скрипт обслуживания:


$DatabaseFile = "C:\Bases\Trade\1Cv8.1CD"
try {
    $FileStream = [System.IO.File]::Open($DatabaseFile, 'Open', 'ReadWrite', 'None')
    $FileStream.Close()
    Write-Host "База свободна, можно делать бэкап."
    exit 0
}
catch {
    Write-Host "База занята другим процессом!"
    exit 1
}

Этот подход хорош тем, что он не зависит от логики самой 1С. Мы оперируем на уровне файловой системы. Если попытка открытия Open с параметром None (запрет на совместный доступ) проходит успешно, значит, ни один пользователь не удерживает дескриптор файла.

Способ 3: Установка блокировки через Объектную Модель 1С

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


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

УстановитьБлокировкуСеансов(Блокировка);

После установки такой блокировки новые пользователи не смогут войти, а текущие будут принудительно завершены (в зависимости от настроек конфигурации). Для последующего входа скрипта в заблокированную базу используйте параметр запуска /UC MySecretKey2024.

Борьба с зависшими процессами

Ситуация, описанная автором темы (процесс 1С завис и заблокировал базу до утра), требует жесткого контроля таймаутов. Разберем, как правильно организовать запуск в Windows-скриптах. Вместо простого вызова используем команду start с последующим контролем времени.

Посмотрим на логику "умного" завершения:

  1. Запускаем 1С для блокировки: start "1C_Block" /Wait "C:\Program Files\1cv8\common\1cv8.exe" ENTERPRISE /F "C:\Base" /CЗавершитьРаботуПользователей /N "Admin" /P "Pass".
  2. Если через 5 минут процесс всё еще активен, используем принудительное завершение: taskkill /F /FI "IMAGENAME eq 1cv8.exe".
  3. Дополнительно проверяем наличие процессов 1cv8c.exe (тонкий клиент) и 1cv8s.exe, которые могли остаться от пользователей.

Итоговый алгоритм идеального скрипта обслуживания

Объединим все полученные знания в единую последовательность действий, которую мы рекомендуем внедрить:

  1. Инициируем завершение: Вызываем 1С с параметром /CЗавершитьРаботуПользователей.
  2. Ожидаем: Даем системе 2-3 минуты на штатное закрытие всех сеансов.
  3. Проверяем процессы: Если в системе остались запущенные 1cv8.exe или 1cv8c.exe от имени пользователей — завершаем их принудительно через taskkill.
  4. Файловый контроль: Проверяем отсутствие файла 1Cv8.1CL. Если он есть, пытаемся его удалить (если удаляется — база свободна, это был "мусорный" файл).
  5. Финальный тест: Пытаемся открыть 1Cv8.1CD через PowerShell в монопольном режиме.
  6. Действие: Только при успешном прохождении всех этапов запускаем копирование.
  7. Снимаем блокировку: Запускаем 1С с параметром /CРазрешитьРаботуПользователей /UC РезервноеКопирование.

Такой многоуровневый подход исключает "человеческий фактор" и гарантирует, что ваша резервная копия будет целостной, а пользователи не останутся заблокированными из-за зависшего процесса администратора.

← На главную