Как создать универсальный скрипт для копирования файловой базы 1С 8.3 при неизвестном пути

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

При обслуживании парка компьютеров с локальными файловыми базами 1С 8.3 системные администраторы часто сталкиваются с проблемой: пути к информационным базам у каждого пользователя могут быть уникальными. Создать единый .bat файл с жестко прописанными путями невозможно, а установка стороннего ПО для бэкапа может быть запрещена политикой безопасности. В этой статье мы разберем, как автоматизировать процесс резервного копирования, используя штатные средства Windows и возможности платформы 1С.

Где 1С хранит пути к информационным базам

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

%APPDATA%\1C\1CEstart\ibases.v8i

Этот файл содержит блоки данных для каждой базы. Нам интересна строка, начинающаяся с Connect=File=, так как именно в ней указан путь к каталогу с файлом 1Cv8.1CD. Наша задача — извлечь этот путь программно.

Решение задачи с помощью PowerShell

Рассмотрим наиболее современный и гибкий способ — использование 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 и умеет корректно обрабатывать ошибки доступа.

Альтернативный метод: Генерация батника из самой 1С

Если работа с PowerShell кажется избыточной, рассмотрим оригинальный способ, предложенный участниками сообщества: создание внешней обработки 1С. Поскольку обработка запускается внутри конкретной базы, она имеет прямой доступ к методу СтрокаСоединенияИнформационнойБазы().

Алгоритм действий следующий:

  1. Создаем внешнюю обработку в 1С.
  2. В модуле прописываем получение пути к текущей базе.
  3. Формируем текст батника, подставляя полученный путь.
  4. Записываем этот текст в файл backup.bat.

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


СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
// Строка будет вида: File="C:\My1CBase";
НачалоПути = Найти(СтрокаСоединения, "File=""") + 6;
КонецПути = СтрДлина(СтрокаСоединения) - 2;
ЧистыйПуть = Сред(СтрокаСоединения, НачалоПути, КонецПути - НачалоПути + 1);

После этого программно создается текстовый файл, содержащий команды xcopy или robocopy с уже подставленным ЧистыйПуть. Пользователю достаточно один раз запустить обработку, чтобы получить готовый инструмент для бэкапа именно этой базы.

Использование штатного режима выгрузки 1С

Выясним еще одну важную деталь: наиболее надежным способом резервного копирования является не копирование файла базы, а создание файла выгрузки .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.

← На главную