При автоматизации обслуживания файловых баз 1С системные администраторы часто сталкиваются с проблемой: команда /CЗавершитьРаботуПользователей запускается, но база остается занятой. Скрипт резервного копирования продолжает работу, не подозревая о проблеме, что приводит к порче архивов или ошибкам копирования. Разберем подробно, как выстроить надежный алгоритм проверки состояния базы и гарантировать, что все сеансы действительно завершены.
Проанализируем сначала, как именно работает штатный механизм. При запуске 1С с параметром /CЗавершитьРаботуПользователей (в типовых конфигурациях на базе БСП) система создает в каталоге базы специальный файл блокировки и рассылает активным пользователям уведомление. По умолчанию платформа дает пользователям 60 секунд на сохранение данных и выход.
Важно понимать, что значение ErrorLevel (код возврата), которое возвращает процесс 1cv8.exe, в данном случае малоинформативно. Если процесс запустился и команда была принята, 1С вернет 0, даже если в базе остались "зависшие" сеансы или модальные окна, блокирующие закрытие программы. Рассмотрим ситуацию глубже: процесс 1С может просто зависнуть, ожидая ответа пользователя на вопрос "Сохранить изменения?", и ваша автоматизация остановится.
Для файловой базы данных основным индикатором активных соединений является файл 1Cv8.1CL (или .lcl в старых версиях). Выясним причину его появления: этот файл создается автоматически, как только первый пользователь открывает базу, и удаляется только тогда, когда базу покидает последний сеанс.
Рассмотрим алгоритм проверки через скрипт:
1Cv8.1CL в папке с базой.Важный нюанс: иногда при аварийном завершении работы 1С файл 1Cv8.1CL может "застрять" в файловой системе, хотя реальных процессов нет. Поэтому этот метод лучше комбинировать с проверкой запущенных процессов 1cv8.exe на сервере.
Самый надежный метод узнать, свободна ли база — попытаться открыть основной файл базы данных 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 (запрет на совместный доступ) проходит успешно, значит, ни один пользователь не удерживает дескриптор файла.
Если вам нужно более тонкое управление, разберем по шагам, как установить блокировку программно, используя встроенный язык 1С. Это можно сделать через внешнюю обработку или скрипт, запускаемый под администратором. Посмотрим на пример кода:
Блокировка = Новый БлокировкаСеансов;
Блокировка.КодРазрешения = "MySecretKey2024";
Блокировка.Начало = ТекущаяДата();
Блокировка.Конец = ТекущаяДата() + 3600; // на один час
Блокировка.Сообщение = "Выполняется регламентное обслуживание базы.";
Блокировка.Установлена = Истина;
УстановитьБлокировкуСеансов(Блокировка);
После установки такой блокировки новые пользователи не смогут войти, а текущие будут принудительно завершены (в зависимости от настроек конфигурации). Для последующего входа скрипта в заблокированную базу используйте параметр запуска /UC MySecretKey2024.
Ситуация, описанная автором темы (процесс 1С завис и заблокировал базу до утра), требует жесткого контроля таймаутов. Разберем, как правильно организовать запуск в Windows-скриптах. Вместо простого вызова используем команду start с последующим контролем времени.
Посмотрим на логику "умного" завершения:
start "1C_Block" /Wait "C:\Program Files\1cv8\common\1cv8.exe" ENTERPRISE /F "C:\Base" /CЗавершитьРаботуПользователей /N "Admin" /P "Pass".taskkill /F /FI "IMAGENAME eq 1cv8.exe".1cv8c.exe (тонкий клиент) и 1cv8s.exe, которые могли остаться от пользователей.Объединим все полученные знания в единую последовательность действий, которую мы рекомендуем внедрить:
/CЗавершитьРаботуПользователей.1cv8.exe или 1cv8c.exe от имени пользователей — завершаем их принудительно через taskkill.1Cv8.1CL. Если он есть, пытаемся его удалить (если удаляется — база свободна, это был "мусорный" файл).1Cv8.1CD через PowerShell в монопольном режиме./CРазрешитьРаботуПользователей /UC РезервноеКопирование.Такой многоуровневый подход исключает "человеческий фактор" и гарантирует, что ваша резервная копия будет целостной, а пользователи не останутся заблокированными из-за зависшего процесса администратора.