При обслуживании парка компьютеров с локальными файловыми базами 1С 8.3 системные администраторы часто сталкиваются с проблемой: пути к информационным базам у каждого пользователя могут быть уникальными. Создать единый .bat файл с жестко прописанными путями невозможно, а установка стороннего ПО для бэкапа может быть запрещена политикой безопасности. В этой статье мы разберем, как автоматизировать процесс резервного копирования, используя штатные средства Windows и возможности платформы 1С.
Прежде чем приступать к написанию скрипта, проанализируем, откуда программа берет список баз. Платформа 1С:Предприятие 8 хранит настройки списка баз в специальных текстовых файлах с расширением .v8i. Самый важный для нас файл — ibases.v8i, который обычно располагается по пути:
%APPDATA%\1C\1CEstart\ibases.v8i
Этот файл содержит блоки данных для каждой базы. Нам интересна строка, начинающаяся с Connect=File=, так как именно в ней указан путь к каталогу с файлом 1Cv8.1CD. Наша задача — извлечь этот путь программно.
Рассмотрим наиболее современный и гибкий способ — использование PowerShell. Этот инструмент позволяет глубоко анализировать текстовые файлы и выполнять сложные операции с файловой системой. Разберем по шагам скрипт, который найдет все локальные базы и скопирует их в папку для бэкапа.
# Указываем папку, куда будут складываться бэкапы
$BackupFolder = "D:\Backups\"
# Проверяем существование целевой папки, если нет - создаем
if (!(Test-Path $BackupFolder)) {
New-Item -Path $BackupFolder -ItemType Directory
}
# Ищем файл со списком баз пользователя
$V8iFile = "$env:APPDATA\1C\1CEstart\ibases.v8i"
if (Test-Path $V8iFile) {
$Content = Get-Content $V8iFile
foreach ($line in $Content) {
# Ищем строку с путем к файловой базе
if ($line.Contains('Connect=File=')) {
# Очищаем строку от лишних символов, чтобы получить чистый путь
$PathBase = $line.Replace('Connect=File=', '').Replace(';', '').Replace('"', '')
# Проверяем, существует ли каталог базы
if (Test-Path $PathBase) {
$BaseName = (Get-Item $PathBase).Name
$DestPath = Join-Path $BackupFolder $BaseName
# Выполняем копирование. Параметр -Recurse копирует подпапки, -Force заменяет файлы
Write-Host "Копирование базы из $PathBase в $DestPath"
Copy-Item -Path $PathBase -Destination $DestPath -Recurse -Force
}
}
}
}
else {
Write-Host "Файл ibases.v8i не найден!"
}
В этом примере мы использовали команду Get-Content для чтения файла и метод Replace для обработки строк. Это позволяет динамически получить путь к любой базе, зарегистрированной у пользователя, независимо от того, где она находится — в «Документах», на диске C или на внешнем носителе.
Разберем важный нюанс: простое копирование файла 1Cv8.1CD во время работы пользователя крайне опасно. Если база открыта, файл может быть заблокирован или находиться в состоянии транзакции, что приведет к созданию «битого» или неактуального бэкапа. Проанализируем ситуацию: как понять, что 1С запущена? Платформа создает в папке базы файл блокировки 1Cv8.1cl.
Перед копированием рекомендуется добавить проверку этого файла. Если он существует, скрипт должен либо пропустить базу, либо завершить работу процессов 1С. Для принудительного завершения в рамках CMD можно использовать команду:
taskkill /F /IM 1cv8.exe
Однако более гуманным способом будет использование robocopy вместо обычного copy. Утилита robocopy (Robust File Copy) встроена в Windows и умеет корректно обрабатывать ошибки доступа.
Если работа с PowerShell кажется избыточной, рассмотрим оригинальный способ, предложенный участниками сообщества: создание внешней обработки 1С. Поскольку обработка запускается внутри конкретной базы, она имеет прямой доступ к методу СтрокаСоединенияИнформационнойБазы().
Алгоритм действий следующий:
backup.bat.Пример кода на встроенном языке 1С для извлечения пути:
СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
// Строка будет вида: File="C:\My1CBase";
НачалоПути = Найти(СтрокаСоединения, "File=""") + 6;
КонецПути = СтрДлина(СтрокаСоединения) - 2;
ЧистыйПуть = Сред(СтрокаСоединения, НачалоПути, КонецПути - НачалоПути + 1);
После этого программно создается текстовый файл, содержащий команды xcopy или robocopy с уже подставленным ЧистыйПуть. Пользователю достаточно один раз запустить обработку, чтобы получить готовый инструмент для бэкапа именно этой базы.
Выясним еще одну важную деталь: наиболее надежным способом резервного копирования является не копирование файла базы, а создание файла выгрузки .dt через конфигуратор. Это гарантирует отсутствие логических ошибок в архиве. Мы можем запустить 1С в пакетном режиме через обычный командный файл.
Рассмотрим пример команды для бэкапа в формате .dt:
"C:\Program Files\1cv8\common\1cestart.exe" DESIGNER /F "C:\Путь_К_Вашей_Базе" /DumpIB "D:\Backup\Base.dt" /Out "D:\Backup\log.txt" /N "Админ" /P "Пароль"
Здесь используются следующие параметры:
Подведем итог: если вам нужен универсальный скрипт, который сам найдет все базы на компьютере, используйте PowerShell для парсинга ibases.v8i. Если же ваша цель — максимальная надежность для конкретной базы, лучше настроить .bat файл с вызовом 1С в пакетном режиме (/DumpIB).
Для автоматического запуска бэкапа не забудьте добавить созданный скрипт в Планировщик заданий Windows. Рекомендуется настроить запуск в ночное время или в моменты отсутствия активных пользователей, чтобы избежать конфликтов блокировки файлов 1Cv8.1CD.