При настройке регулярного обслуживания информационных баз 1С системные администраторы часто автоматизируют процесс выгрузки данных через командную строку Windows. Типовой сценарий предполагает запуск сеанса в режиме ENTERPRISE со специальным параметром запуска /C ЗавершитьРаботуПользователей, после чего должна производиться выгрузка информационной базы конфигуратором (ключ /DumpIB). Однако на практике администраторы сталкиваются с проблемой: сеанс администратора успешно рассылает предупреждения и выгоняет других пользователей, но сам процесс 1cv8.exe не закрывается, блокируя дальнейшее выполнение командного файла .bat.
Разберем причины такого поведения платформы и рассмотрим надежные варианты решения этой задачи.
Выясним причину остановки скрипта. При передаче строки /C ЗавершитьРаботуПользователей управление передается механизмам Библиотеки стандартных подсистем (БСП). Здесь возникают следующие проблемы:
Наиболее стабильный и универсальный способ для управляемого приложения — передать логику блокировки во внешнюю обработку, которая гарантированно завершит работу системы без вывода интерактивных вопросов.
Создадим внешнюю обработку, например УстановитьБлокировкуИВыйти.epf. В модуле формы или в обработке инициализации вызовем процедуру установки блокировки сеансов, после чего используем штатный метод платформы ПрекратитьРаботуСистемы() или ЗавершитьРаботуСистемы() с параметром Ложь (завершение без интерактивного подтверждения):
ПараметрыБлокировки = Новый БлокировкаСеансовИнформационнойБазы;
ПараметрыБлокировки.Установлена = Истина;
ПараметрыБлокировки.Начало = ТекущаяДата();
ПараметрыБлокировки.Сообщение = "Выполняется резервное копирование информационной базы.";
ПараметрыБлокировки.КодРазрешения = "BackupPass";
УстановитьБлокировкуСеансов(ПараметрыБлокировки);
// Принудительно завершаем работу текущего сеанса без вывода диалоговых окон
ПрекратитьРаботуСистемы(Ложь);
Запуск такой обработки выполняется через командную строку с помощью ключа /Execute:
"C:\Program Files\1cv8\8.3.10.2252\bin\1cv8.exe" ENTERPRISE /F "C:\1С\infobase" /N "Admin" /P "Pass" /Execute "C:\Scripts\УстановитьБлокировкуИВыйти.epf" /DisableStartupMessages
Типичная ошибка при проектировании сценариев резервного копирования — снятие блокировки базы перед выгрузкой в .dt. Если снять блокировку заранее, пользователи или регламентные задания успеют занять сеансы, и запуск конфигуратора в монопольном режиме для выгрузки завершится аварией.
Посмотрим на пример правильной цепочки действий: блокировка устанавливается с секретным кодом разрешения, а последующая выгрузка через конфигуратор использует этот же код через ключ /UC. В таком сценарии база остается заблокированной для всех, кроме процесса резервного копирования:
@echo off
set v8path="C:\Program Files\1cv8\8.3.10.2252\bin\1cv8.exe"
set ibPath="C:\1С\infobase"
set user="Admin"
set pass="Pass"
set ucCode="BackupPass"
set logFile="C:\1С\backup_log.txt"
set dumpFile="C:\1С\backup.dt"
rem 1. Установка блокировки через внешнюю обработку
%v8path% ENTERPRISE /F %ibPath% /N %user% /P %pass% /Execute "C:\Scripts\УстановитьБлокировкуИВыйти.epf" /DisableStartupMessages /Out %logFile%
rem 2. Выгрузка базы с ключом разрешения блокировки /UC
%v8path% DESIGNER /F %ibPath% /N %user% /P %pass% /UC %ucCode% /DumpIB %dumpFile% /DumpResult "C:\1С\result.txt" /Out %logFile% -NoTruncate
rem 3. Разблокировка базы отдельной внешней обработкой или удалением блокировки
%v8path% ENTERPRISE /F %ibPath% /N %user% /P %pass% /UC %ucCode% /Execute "C:\Scripts\СнятьБлокировкуИВыйти.epf" /DisableStartupMessages
Параметр /DumpResult позволяет батнику зафиксировать код возврата: значение 0 свидетельствует об успешной выгрузке, а 1 — о возникновении ошибок. Параметр /Out с флагом -NoTruncate дописывает сообщения платформы в единый файл журнала.
Проанализируем файловую архитектуру 1С. В файловой базе механизм УстановитьБлокировкуСеансов создает рядом с файлом базы 1Cv8.1CD специальный маркерный файл 1Cv8.cdn. Другие клиенты при запуске считывают данные из этого файла и не входят в базу.
Файл 1Cv8.cdn представляет собой текстовый документ следующего формата:
{1,20260329120000,00010101000000,"Выполняется резервное копирование базы данных.","BackupPass",""}
Для файловой базы можно сформировать данный файл средствами операционной системы или скрипта перед выполнением процедур копирования, а по окончании резервного копирования — удалить его командующим вызовом del /f /q "C:\1С\infobase\1Cv8.cdn".
Если в файловой базе сеансы пользователей не закрываются из-за зависших модальных окон, регулярный скрипт может прибегнуть к принудительному завершению зависших экземпляров клиента перед монопольной операцией:
taskkill /t /f /im 1cv8.exe
taskkill /t /f /im 1cv8c.exe
Важно: Применение taskkill является аварийной мерой. Принудительное закрытие файловой базы в момент записи транзакции может привести к повреждению структуры таблиц 1Cv8.1CD. Используйте эту команду только после отправки штатного сигнала на завершение и технологической паузы (команда timeout /t 60).
Если в дальнейшем планируется перенос информационной базы на клиент-серверный вариант (SQL), использование графического клиента для отключения сеансов становится нецелесообразным. Платформа 1С предоставляет специализированные утилиты командной строки:
rac (в связке со службой ras). Позволяет централизованно через команды кластера заблокировать начало новых сеансов (rac infobase update --sessions-deny=on), запросить список активных сеансов (rac session list) и мгновенно разорвать их (rac session terminate). Это полностью исключает зависание скрипта на стороне клиентских окон.ibcmd. Начиная с современных версий 8.3, для создания дампа можно использовать команду ibcmd infobase dump, которая работает напрямую с кластером или файловой базой без запуска графического конфигуратора 1cv8.exe.Помните также, что формат .dt предназначен в первую очередь для переноса данных между различными СУБД и для разработки. Для полноценного регулярного резервного копирования в промышленной эксплуатации рекомендуется прямое копирование файла 1Cv8.1CD (в файловом режиме при остановленных сеансах) либо создание резервных копий средствами СУБД (в клиент-серверном режиме).