Копия рабочей базы 1С в MS SQL Server: бэкап, attach и выгрузка .dt

· 11 мин

Содержание

Быстрее всего скопировать базу 1С на SQL так: сделать в SQL Server резервную копию рабочей базы с параметром COPY_ONLY, восстановить её под новым именем через RESTORE ... WITH MOVE, а затем зарегистрировать эту базу данных в консоли кластера 1С с включённой блокировкой регламентных заданий. Пользователи при этом продолжают работать, а цепочка регламентных бэкапов не ломается.

Типичная ситуация: программист просит «свежую копию бухгалтерии на сегодня», чтобы проверить обновление. Через выгрузку .dt базу на 80 ГБ придётся ждать час-два и выгонять всех из программы. Средствами MS SQL Server та же задача занимает 10–20 минут и никого не задевает. Ниже — оба пути, плюс detach/attach и автоматизация.

Что подготовить перед копированием базы 1С на SQL

Начните с проверки места и имён. Большинство неудачных копий ломаются не на самой команде, а на мелочах вокруг неё.

📌 Что выяснить заранее:

  • 💾 Размер базы и свободное место. Нужно место под файл бэкапа и под саму копию (данные + журнал). Размер файлов покажет запрос EXEC sp_helpdb N'buh';.
  • 🏷️ Имя базы данных в SQL. Оно может не совпадать с именем информационной базы в кластере. Посмотрите его в консоли кластера: свойства информационной базы → поле «База данных».
  • 🔢 Версии SQL Server на источнике и приёмнике. Бэкап восстанавливается только на ту же или более новую версию. На старую — никак, только через .dt.
  • 👤 Учётная запись, под которой 1С ходит в SQL. Она указана в свойствах информационной базы в поле «Пользователь сервера БД». Понадобится при настройке прав.
  • 📁 Папка для бэкапа. У службы SQL Server должны быть права на запись в неё. Иначе получите Operating system error 5(Access is denied.).

Какой способ выбрать

СпособКогда подходитПростой для пользователейРиски
BACKUP / RESTORE в SQLКопия на том же или более новом SQL ServerНетБез COPY_ONLY сбивается цепочка разностных бэкапов
Detach / AttachПеренос файлов на другой диск или серверДа, база отключается целикомОшибка при отсоединении оставляет рабочую базу недоступной
Выгрузка .dt средствами 1СДругая версия SQL, переход на другую СУБД, небольшая базаЖелательно, чтобы никто не работалДолго на больших базах, нужна монопольная загрузка в приёмник

Способ 1. Резервная копия и восстановление базы в MS SQL Server

Это основной способ для рабочих баз. Он не требует останавливать 1С и не трогает исходную базу.

Через Management Studio

  1. В SQL Server Management Studio разверните Databases, щёлкните правой кнопкой по рабочей базе → Tasks → Back Up....
  2. Тип копии — Full. Поставьте флажок Copy-only backup.
  3. В блоке Destination удалите старый путь и добавьте новый файл, например D:\Backup\buh_copy.bak.
  4. Нажмите OK и дождитесь сообщения об успешном завершении.
  5. Щёлкните правой кнопкой по Databases → Restore Database.... Источник — Device, укажите созданный файл.
  6. В поле Database в блоке Destination впишите новое имя, например buh_test.
  7. На странице Files включите Relocate all files to folder или вручную задайте новые имена файлов .mdf и .ldf.
  8. Нажмите OK.

Шаг 7 обязателен. Если оставить исходные пути, SQL Server попытается записать копию поверх файлов рабочей базы и откажется: файлы заняты. А при флажке перезаписи можно испортить рабочую базу.

Те же действия на T-SQL

Скрипт удобнее мышки: его можно сохранить и повторять каждую неделю.

-- 1. Копия рабочей базы, не влияющая на цепочку регламентных бэкапов
BACKUP DATABASE [buh]
TO DISK = N'D:\Backup\buh_copy.bak'
WITH COPY_ONLY, COMPRESSION, STATS = 10;

-- 2. Узнаём логические имена файлов внутри бэкапа
RESTORE FILELISTONLY FROM DISK = N'D:\Backup\buh_copy.bak';

-- 3. Восстанавливаем под новым именем и в новые файлы
RESTORE DATABASE [buh_test]
FROM DISK = N'D:\Backup\buh_copy.bak'
WITH MOVE N'buh'     TO N'D:\SQLData\buh_test.mdf',
     MOVE N'buh_log' TO N'D:\SQLData\buh_test_log.ldf',
     STATS = 10;

-- 4. Для тестовой копии журнал транзакций не нужен
ALTER DATABASE [buh_test] SET RECOVERY SIMPLE;

В шаге 3 подставьте логические имена из колонки LogicalName, которую вернул шаг 2. Имена buh и buh_log — только пример.

💡 COMPRESSION сокращает файл бэкапа в несколько раз и ускоряет копирование. В редакции Express сжатие бэкапов недоступно — просто уберите это слово.

Зачем нужен COPY_ONLY

Если на сервере настроен план обслуживания с полными и разностными бэкапами, каждый новый полный бэкап становится базой для следующих разностных. Сделали «разовую» копию без COPY_ONLY, потом удалили файл — и ночные разностные копии теперь опираются на бэкап, которого больше нет.

Без COPY_ONLY восстановить рабочую базу из регламентных копий может не получиться.

Обновить уже существующую копию

Когда тестовая база уже есть и её нужно освежить, восстанавливайте поверх с REPLACE. Перед этим выгоните из неё сеансы:

ALTER DATABASE [buh_test] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;

RESTORE DATABASE [buh_test]
FROM DISK = N'D:\Backup\buh_copy.bak'
WITH REPLACE,
     MOVE N'buh'     TO N'D:\SQLData\buh_test.mdf',
     MOVE N'buh_log' TO N'D:\SQLData\buh_test_log.ldf';

ALTER DATABASE [buh_test] SET MULTI_USER;

ROLLBACK IMMEDIATE обрывает всех, кто сейчас работает в buh_test, с откатом незавершённых транзакций. Трижды проверьте имя базы: эта команда, направленная на рабочую базу, остановит работу всей бухгалтерии.

Способ 2. Отсоединение и присоединение файлов базы

Detach/attach копирует файлы .mdf и .ldf как есть. Он полезен, когда базу переносят на новый диск или сервер, а места под отдельный бэкап нет. Минус — рабочая база на время копирования недоступна.

  1. В консоли кластера 1С откройте свойства информационной базы и включите блокировку начала сеансов. Предупредите пользователей заранее: их сеансы оборвутся.
  2. Переведите базу в однопользовательский режим и отсоедините:
ALTER DATABASE [buh] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
EXEC sp_detach_db @dbname = N'buh';
  1. Скопируйте buh.mdf и buh_log.ldf в новую папку под именами buh_test.mdf и buh_test_log.ldf.
  2. Присоедините обратно оригинал, а затем копию:
CREATE DATABASE [buh] ON
  (FILENAME = N'D:\SQLData\buh.mdf'),
  (FILENAME = N'D:\SQLData\buh_log.ldf')
FOR ATTACH;

CREATE DATABASE [buh_test] ON
  (FILENAME = N'E:\SQLData\buh_test.mdf'),
  (FILENAME = N'E:\SQLData\buh_test_log.ldf')
FOR ATTACH;
  1. Снимите блокировку сеансов у рабочей базы.

💡 После отсоединения SQL Server часто оставляет доступ к файлам только той учётной записи, которая выполняла detach. Если присоединение падает с ошибкой доступа, дайте учётной записи службы SQL Server полный доступ к файлам в свойствах безопасности Windows.

Пока рабочая база отсоединена, её нет на сервере. Не начинайте detach, если не уверены, что успеете присоединить её до начала рабочего дня.

Способ 3. Копирование базы встроенными средствами 1С

Выгрузка в .dt не зависит от СУБД. Ей пользуются, когда копию нужно поднять на более старом SQL Server, на PostgreSQL или передать базу подрядчику.

Вручную

  1. Откройте рабочую базу в Конфигураторе: Администрирование → Выгрузить информационную базу, укажите файл .dt. Делайте это, когда пользователи не вносят данные: так выгрузка получится согласованной.
  2. В консоли кластера создайте новую информационную базу с флажком «Создать базу данных в случае ее отсутствия» — 1С сама создаст пустую базу в SQL.
  3. Откройте новую базу в Конфигураторе: Администрирование → Загрузить информационную базу, выберите файл. Загрузка требует монопольного доступа к приёмнику.

Из командной строки

"C:\Program Files\1cv8\8.3.24.1548\bin\1cv8.exe" DESIGNER /S "srv1c\buh" /N "Администратор" /P "пароль" /DumpIB "D:\Backup\buh.dt" /Out "D:\Backup\dump.log"

"C:\Program Files\1cv8\8.3.24.1548\bin\1cv8.exe" DESIGNER /S "srv1c\buh_test" /N "Администратор" /P "пароль" /RestoreIB "D:\Backup\buh.dt" /Out "D:\Backup\restore.log"

Номер платформы в пути замените на свой. Лог из параметра /Out — первое место, куда смотреть при сбое.

/RestoreIB полностью заменяет данные в приёмнике. Перепутанное имя базы после /S — и вы загрузите вчерашнюю копию поверх рабочей бухгалтерии.

Регистрация копии в кластере и первый запуск

Восстановленная в SQL база ещё не видна 1С. Её нужно зарегистрировать в кластере серверов.

  1. Откройте консоль администрирования серверов 1С → кластер → Информационные базы → Создать → Информационная база.
  2. Заполните поля: имя (например, buh_test), сервер баз данных, тип СУБД MS SQL Server, имя базы данных buh_test, пользователь и пароль сервера БД.
  3. Поставьте флажок «Установить блокировку регламентных заданий». Иначе копия начнёт выполнять те же задания, что и рабочая база: обмены, загрузку выписок, рассылки.
  4. Добавьте базу в список у пользователя: в окне запуска Добавить → Добавление в список существующей информационной базы, вариант «На сервере 1С:Предприятия».

Что спросит 1С при первом входе

Типовые конфигурации на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) замечают, что база открыта по другому адресу, и блокируют работу с внешними ресурсами. Появляется окно с выбором: это копия или база перемещена.

  • ✅ Для тестовой копии выберите вариант про копию. Обмены, почта и синхронизация останутся выключенными.
  • ❌ Не подтверждайте перемещение: копия начнёт отправлять данные в банк, ЭДО и узлы обмена от имени рабочей базы.

💡 Чтобы никто не перепутал окна, измените заголовок: в Бухгалтерии 3.0 Администрирование → Общие настройки → Заголовок программы, например «КОПИЯ от 07.10 — не работать».

Права доступа к скопированной базе SQL

Пользователи 1С хранятся внутри информационной базы, поэтому список пользователей и их роли переезжают вместе с данными. Дополнительно настраивать нужно только доступ на стороне SQL.

Тот же сервер SQL

Если восстанавливали на том же сервере, логин 1С уже есть. Дайте ему права на новую базу:

USE [buh_test];
ALTER AUTHORIZATION ON DATABASE::[buh_test] TO [usr1c];

Пользователь usr1c становится владельцем базы и получает полные права. Вместо владельца можно добавить его в роль db_owner.

Другой сервер SQL

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

-- Найти пользователей базы без соответствующего логина
USE [buh_test];
EXEC sp_change_users_login 'Report';

-- Связать пользователя базы с логином сервера
ALTER USER [usr1c] WITH LOGIN = [usr1c];

Процедура sp_change_users_login устарела, но для отчёта её ещё можно вызывать. Связку делайте через ALTER USER.

Пользователи с входом через Windows

Если в 1С включена аутентификация операционной системы, у пользователей записаны доменные учётные записи. В том же домене они работают без изменений. В другом домене придётся переназначить учётные записи в списке пользователей копии.

Автоматизация копирования через PowerShell

Когда тестовую копию освежают каждую неделю, руками это делать незачем. Скрипт ниже использует модуль SqlServer (Install-Module SqlServer) и команду Invoke-Sqlcmd.

$srv     = "SQL01"
$src     = "buh"
$dst     = "buh_test"
$bak     = "D:\Backup\buh_copy.bak"
$dataDir = "D:\SQLData"

# Логические имена файлов источника
$files = Invoke-Sqlcmd -ServerInstance $srv -Database $src -Query "SELECT name, type_desc FROM sys.database_files"
$dataName = ($files | Where-Object type_desc -eq 'ROWS').name
$logName  = ($files | Where-Object type_desc -eq 'LOG').name

$sql = @"
BACKUP DATABASE [$src] TO DISK = N'$bak' WITH COPY_ONLY, INIT, STATS = 10;
IF DB_ID(N'$dst') IS NOT NULL
    ALTER DATABASE [$dst] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
RESTORE DATABASE [$dst] FROM DISK = N'$bak'
WITH REPLACE,
     MOVE N'$dataName' TO N'$dataDir\$dst.mdf',
     MOVE N'$logName'  TO N'$dataDir\${dst}_log.ldf';
ALTER DATABASE [$dst] SET MULTI_USER;
ALTER DATABASE [$dst] SET RECOVERY SIMPLE;
"@

Invoke-Sqlcmd -ServerInstance $srv -Query $sql -QueryTimeout 0 -ErrorAction Stop
Write-Output "Копия $dst обновлена: $(Get-Date)"

Скрипт рассчитан на базу с одним файлом данных и одним журналом — типичный случай для 1С. Если файлов больше, переменные $dataName и $logName вернут несколько имён, и MOVE нужно расписать для каждого.

-QueryTimeout 0 снимает ограничение по времени: восстановление большой базы идёт дольше стандартного таймаута. INIT перезаписывает старый файл бэкапа, а не дописывает в него новые копии.

📅 Чтобы запускать по расписанию, создайте задачу в Планировщике Windows с действием powershell.exe -File D:\Scripts\copy_buh.ps1 или шаг типа PowerShell в задании SQL Server Agent. Ставьте запуск на ночь: ROLLBACK IMMEDIATE выгонит тех, кто остался в тестовой базе.

💡 Блокировка регламентных заданий хранится в регистрации базы в кластере, а не в данных SQL. Поэтому при повторном восстановлении поверх существующей копии она сохраняется.

Ошибки при копировании базы 1С в SQL

Диагностика: выберите симптом

Частые вопросы

Можно ли копировать базу 1С на SQL, пока бухгалтеры работают?
Да, если копировать через BACKUP DATABASE. SQL Server делает согласованный бэкап без остановки работы. Detach и загрузка .dt так не умеют.
Копия займёт лицензию 1С?
Лицензии расходуются на сеансы, а не на базы. Пока в копию никто не зашёл, она лицензий не занимает.
Как уменьшить размер тестовой копии?
Переведите её в модель восстановления SIMPLE и сожмите журнал командой DBCC SHRINKFILE с логическим именем файла журнала. Файл данных сжимать обычно незачем.
Чем копия через SQL отличается от выгрузки .dt по содержимому?
Бэкап SQL — точная копия всех таблиц, включая служебные. Выгрузка .dt пересобирает базу заново, поэтому файл .dt не содержит лишнего места, но процесс идёт в разы дольше.
Можно ли так же скопировать файловую базу?
Нет. У файловой базы нет базы данных в SQL — копируют файл 1Cv8.1CD или выгружают .dt.