Копия рабочей базы 1С в MS SQL Server: бэкап, attach и выгрузка .dt
Содержание
Быстрее всего скопировать базу 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
- В SQL Server Management Studio разверните
Databases, щёлкните правой кнопкой по рабочей базе →Tasks → Back Up.... - Тип копии —
Full. Поставьте флажокCopy-only backup. - В блоке
Destinationудалите старый путь и добавьте новый файл, напримерD:\Backup\buh_copy.bak. - Нажмите
OKи дождитесь сообщения об успешном завершении. - Щёлкните правой кнопкой по
Databases→Restore Database.... Источник —Device, укажите созданный файл. - В поле
Databaseв блокеDestinationвпишите новое имя, напримерbuh_test. - На странице
FilesвключитеRelocate all files to folderили вручную задайте новые имена файлов.mdfи.ldf. - Нажмите
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С откройте свойства информационной базы и включите блокировку начала сеансов. Предупредите пользователей заранее: их сеансы оборвутся.
- Переведите базу в однопользовательский режим и отсоедините:
ALTER DATABASE [buh] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
EXEC sp_detach_db @dbname = N'buh';
- Скопируйте
buh.mdfиbuh_log.ldfв новую папку под именамиbuh_test.mdfиbuh_test_log.ldf. - Присоедините обратно оригинал, а затем копию:
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;
- Снимите блокировку сеансов у рабочей базы.
💡 После отсоединения SQL Server часто оставляет доступ к файлам только той учётной записи, которая выполняла detach. Если присоединение падает с ошибкой доступа, дайте учётной записи службы SQL Server полный доступ к файлам в свойствах безопасности Windows.
Пока рабочая база отсоединена, её нет на сервере. Не начинайте detach, если не уверены, что успеете присоединить её до начала рабочего дня.
Способ 3. Копирование базы встроенными средствами 1С
Выгрузка в .dt не зависит от СУБД. Ей пользуются, когда копию нужно поднять на более старом SQL Server, на PostgreSQL или передать базу подрядчику.
Вручную
- Откройте рабочую базу в Конфигураторе:
Администрирование → Выгрузить информационную базу, укажите файл.dt. Делайте это, когда пользователи не вносят данные: так выгрузка получится согласованной. - В консоли кластера создайте новую информационную базу с флажком «Создать базу данных в случае ее отсутствия» — 1С сама создаст пустую базу в SQL.
- Откройте новую базу в Конфигураторе:
Администрирование → Загрузить информационную базу, выберите файл. Загрузка требует монопольного доступа к приёмнику.
Из командной строки
"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С → кластер →
Информационные базы→Создать → Информационная база. - Заполните поля: имя (например,
buh_test), сервер баз данных, тип СУБДMS SQL Server, имя базы данныхbuh_test, пользователь и пароль сервера БД. - Поставьте флажок «Установить блокировку регламентных заданий». Иначе копия начнёт выполнять те же задания, что и рабочая база: обмены, загрузку выписок, рассылки.
- Добавьте базу в список у пользователя: в окне запуска
Добавить → Добавление в список существующей информационной базы, вариант «На сервере 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. Поэтому при повторном восстановлении поверх существующей копии она сохраняется.