Как развернуть копию MS SQL Server и снова подключить к ней 1С
Содержание
Базу 1С из SQL-бэкапа восстанавливают в два этапа. Сначала файл .bak разворачивают средствами MS SQL Server: в SQL Server Management Studio через Databases → Restore Database… или командой RESTORE DATABASE … WITH MOVE. Затем эту базу данных регистрируют как информационную базу в кластере серверов 1С и добавляют в список баз у пользователей.
Сама платформа 1С про файл .bak ничего не знает. Всё, что касается восстановления, делает SQL Server, а 1С нужно лишь правильно «показать», где лежат данные. Ниже порядок для платформы 8.3 в клиент-серверном варианте и MS SQL Server 2016 и новее.
Подготовка к восстановлению и проверка бэкапа SQL
Прежде чем запускать восстановление, ответьте себе на три вопроса.
- 🎯 Куда восстанавливаем. Поверх рабочей базы (откат после сбоя) или в новую базу рядом (копия для разбора, тестовая база). Второй вариант безопаснее: рабочая база остаётся нетронутой.
- 🧩 Из чего восстанавливаем. Только полная копия или цепочка: полная + разностная + журналы транзакций. От этого зависит, до какого момента можно откатиться.
- 🖥️ Какая версия SQL Server. Копию с более новой версии на более старую не восстановить. Бэкап с SQL Server 2022 не развернуть на 2017.
Проверка целостности копии
Начните с проверки файла. Это занимает минуты и избавляет от сюрпризов на середине процесса.
-- Читается ли копия и не повреждена ли она
RESTORE VERIFYONLY FROM DISK = N'D:\Backup\buh_2026_10_06.bak' WITH CHECKSUM;
-- Что внутри: дата копии, имя исходной базы, версия сервера
RESTORE HEADERONLY FROM DISK = N'D:\Backup\buh_2026_10_06.bak';
-- Логические имена файлов данных и журнала (нужны для WITH MOVE)
RESTORE FILELISTONLY FROM DISK = N'D:\Backup\buh_2026_10_06.bak';
WITH CHECKSUM сработает, только если копию создавали с контрольными суммами. Если их нет, команда сообщит об этом, а проверка пройдёт в упрощённом режиме.
В выводе HEADERONLY смотрите колонки BackupFinishDate и DatabaseName. Так легко убедиться, что в руках копия нужной базы за нужную дату, а не похожий файл из соседней папки.
Место на диске и права
- 💾 Свободного места нужно не меньше, чем размер файлов из
FILELISTONLY(колонкаSize), а не размер.bak. Сжатый бэкап на 20 ГБ может развернуться в базу на 90 ГБ. - 🔐 Файл
.bakчитает служба SQL Server, а не ваша учётная запись. У учётной записи службы должны быть права на чтение папки с копией.
Как восстановить базу 1С из SQL бэкапа: SSMS и консоль
Оба способа дают одинаковый результат. Графический интерфейс удобен для разовой операции, T-SQL — для повторяемой и для серверов без SSMS.
| Способ | Когда подходит | На что смотреть |
|---|---|---|
| SSMS, мастер Restore | Разовое восстановление, одна копия | Вкладки Files и Options |
T-SQL RESTORE | Цепочка копий, восстановление на момент времени | Логические имена файлов |
| PowerShell / sqlcmd | Регулярное обновление тестовой базы | Права учётной записи задания |
Вариант 1. Через SQL Server Management Studio
- Подключитесь к экземпляру SQL Server, щёлкните правой кнопкой по
Databasesи выберитеRestore Database…. - В блоке Source отметьте
Device, нажмите кнопку с многоточием и добавьте файл.bak. - В поле
Databaseблока Destination впишите имя базы. Для копии рядом с рабочей — новое имя, напримерbuh_test. - На вкладке
FilesвключитеRelocate all files to folderи укажите папки для данных и журнала. Проверьте, что имена физических файлов не совпадают с файлами рабочей базы. - На вкладке
Optionsпри восстановлении поверх существующей базы включитеOverwrite the existing database (WITH REPLACE). - Там же снимите галочку
Take tail-log backup before restore, если восстанавливаете в новую базу. Для отката рабочей базы в модели Full хвостовой журнал, наоборот, полезен. - Нажмите
OKи дождитесь сообщения об успешном завершении.
Если в шаге 3 оставить имя рабочей базы и включить WITH REPLACE, рабочие данные будут перезаписаны без вопросов. Перепроверьте имя перед нажатием OK.
Вариант 2. Командой RESTORE
Логические имена берите из RESTORE FILELISTONLY. У баз, созданных 1С, они обычно совпадают с именем исходной базы и её журнала, но гадать не нужно.
RESTORE DATABASE [buh_test]
FROM DISK = N'D:\Backup\buh_2026_10_06.bak'
WITH
MOVE N'buh' TO N'E:\SQLData\buh_test.mdf',
MOVE N'buh_log' TO N'F:\SQLLog\buh_test_log.ldf',
STATS = 10,
RECOVERY;
STATS = 10 выводит прогресс каждые 10%. Для базы на сотни гигабайт это единственный способ понять, что процесс идёт.
Восстановление на конкретный момент времени
Если база работает в модели восстановления Full и есть журналы транзакций, можно откатиться не на ночь, а, например, на 14:25 — за пять минут до ошибочной групповой обработки.
RESTORE DATABASE [buh_test] FROM DISK = N'D:\Backup\buh_full.bak'
WITH MOVE N'buh' TO N'E:\SQLData\buh_test.mdf',
MOVE N'buh_log' TO N'F:\SQLLog\buh_test_log.ldf',
NORECOVERY;
RESTORE DATABASE [buh_test] FROM DISK = N'D:\Backup\buh_diff.bak' WITH NORECOVERY;
RESTORE LOG [buh_test] FROM DISK = N'D:\Backup\buh_log_1400.trn' WITH NORECOVERY;
RESTORE LOG [buh_test] FROM DISK = N'D:\Backup\buh_log_1430.trn'
WITH STOPAT = N'2026-10-06T14:25:00', RECOVERY;
Все копии, кроме последней, восстанавливаются с NORECOVERY. База при этом висит в состоянии Restoring… — так и должно быть до финальной команды с RECOVERY.
В модели Simple журналы не сохраняются. Откатиться можно только на момент полной или разностной копии.
Регистрация восстановленной базы в кластере 1С
Восстановленная база SQL пока ничья. Чтобы с ней работала 1С, её регистрируют в кластере серверов.
Учётная запись SQL для 1С
Сначала проверьте, что у пользователя, под которым 1С ходит в SQL Server, есть доступ к новой базе. Если копию переносили с другого сервера, пользователь внутри базы может оказаться «осиротевшим»: он есть в базе, но не связан с логином на сервере.
USE [buh_test];
-- Найти пользователей без привязки к логину
EXEC sp_change_users_login 'Report';
-- Привязать пользователя базы к логину сервера
ALTER USER [user1c] WITH LOGIN = [user1c];
Логину 1С нужна роль db_owner в этой базе. Проще всего назначить её в свойствах логина на странице User Mapping.
Добавление информационной базы в консоли кластера
- Откройте
Администрирование серверов 1С Предприятия, разверните центральный сервер и кластер. - Правой кнопкой по узлу
Информационные базывыберитеСоздать → Информационная база. - Заполните
Имя— так база будет называться в кластере, напримерbuh_test. Сервер баз данных— имя экземпляра SQL Server,Тип СУБД—MSSQLServer,База данных— имя восстановленной базы ровно как в SSMS.- Укажите пользователя и пароль сервера БД.
- Снимите галочку «Создать базу данных в случае ее отсутствия». База уже есть, создавать ничего не нужно, а опечатка в имени приведёт к созданию пустой базы.
- Для тестовой копии включите
Установить блокировку регламентных заданий. - Нажмите
OK.
Блокировка регламентных заданий на копии обязательна. Без неё тестовая база по расписанию начнёт выгружать обмены, отправлять письма контрагентам и забирать документы ЭДО — от имени настоящей организации.
Если восстанавливали поверх рабочей базы, в кластере ничего менять не нужно: регистрация прежняя, сменились только данные.
Добавление в список баз у пользователя
В окне запуска 1С: Добавить → Добавление в список существующей информационной базы, вариант На сервере 1С:Предприятия. Укажите имя кластера (сервер) и имя базы в кластере из шага 3. Имя базы SQL здесь не вводится.
Ошибки при восстановлении базы 1С из бэкапа SQL
Большинство сбоев — это сообщения SQL Server с номером. По номеру причину находят быстро.
Перевод базы в SINGLE_USER и завершение сеансов делайте вне рабочего времени или после предупреждения пользователей. После восстановления верните режим: ALTER DATABASE [buh] SET MULTI_USER;.
Автоматическое восстановление через PowerShell и SQL
Частая задача — каждую ночь обновлять тестовую базу свежей копией рабочей. Вручную это надоедает уже на третий раз.
Скрипт на PowerShell
Модуль SqlServer содержит командлет Restore-SqlDatabase. Модуль ставится командой Install-Module SqlServer.
Import-Module SqlServer
$instance = "SQLSRV01"
$db = "buh_test"
$bak = Get-ChildItem "D:\Backup\buh_*.bak" |
Sort-Object LastWriteTime -Descending |
Select-Object -First 1
$data = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile("buh", "E:\SQLData\buh_test.mdf")
$log = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile("buh_log", "F:\SQLLog\buh_test_log.ldf")
Invoke-Sqlcmd -ServerInstance $instance -Query "IF DB_ID('$db') IS NOT NULL ALTER DATABASE [$db] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;"
Restore-SqlDatabase -ServerInstance $instance -Database $db `
-BackupFile $bak.FullName -RelocateFile @($data, $log) -ReplaceDatabase
Invoke-Sqlcmd -ServerInstance $instance -Query "ALTER DATABASE [$db] SET MULTI_USER;"
Скрипт берёт самый свежий файл по маске, выгоняет сеансы из тестовой базы и разворачивает копию поверх неё. Логические имена buh и buh_log замените своими из FILELISTONLY.
Вариант без PowerShell: sqlcmd и задание SQL Agent
Тот же RESTORE можно сохранить в файл restore_test.sql и запускать так:
sqlcmd -S SQLSRV01 -E -b -i "C:\Scripts\restore_test.sql" -o "C:\Scripts\restore_test.log"
Ключ -E — вход под текущей учётной записью Windows, -b — код возврата при ошибке, -o — файл журнала. Ещё проще создать задание в SQL Server Agent → Jobs с шагом типа T-SQL и расписанием на ночь.
Что добавить после восстановления копии
После автоматического обновления тестовой базы полезно сразу выполнить в ней пару действий:
- 👤 привязать пользователя 1С (
ALTER USER … WITH LOGIN), если копия с другого сервера; - 📉 перевести тестовую базу в модель Simple:
ALTER DATABASE [buh_test] SET RECOVERY SIMPLE;— журнал тестовой базы не будет разрастаться; - 🔒 убедиться, что в кластере для неё стоит блокировка регламентных заданий. Она хранится в регистрации базы в кластере, поэтому перезапись данных её не снимает.
Проверка базы 1С после восстановления
Сообщение SQL Server об успехе ещё не значит, что 1С работает. Проверьте по порядку.
- Запуск. Откройте базу в режиме 1С:Предприятие под администратором. Если база не открывается, сначала зайдите в Конфигуратор: платформа сообщит, если конфигурация базы данных отличается от основной.
- Диалог о перемещённой базе. Типовые конфигурации на БСП при первом запуске копии часто показывают предупреждение, что база перемещена или восстановлена из копии. Для тестовой базы отвечайте, что это копия: тогда программа отключит обмены и интернет-сервисы, которые нельзя запускать с двух баз сразу.
- Данные. Откройте журнал документов
и найдите последние документы. Их дата должна совпадать с моментом копии или с точкой
STOPAT. - Итоги и регистры. Сформируйте оборотно-сальдовую ведомость или ключевой отчёт за текущий месяц и сравните с ожидаемыми цифрами.
- Пользователи. Проверьте вход под обычным пользователем. Список пользователей хранится в самой базе, поэтому он вернётся в состояние на дату копии: сотрудники, добавленные позже, исчезнут.
- Физическая целостность. Для базы, которая пойдёт в работу, выполните
DBCC CHECKDBна стороне SQL. Ошибок быть не должно.
DBCC CHECKDB (N'buh_test') WITH NO_INFOMSGS;
Если сеансы при открытии сразу падают с ошибками блокировок или «зависают», очистите кэш клиента на рабочем месте — ключ /ClearCache в строке запуска базы. Старый кэш метаданных иногда цепляется к копии с тем же именем.
Тестирование и исправление информационной базы в Конфигураторе после чистого восстановления обычно не нужно. Запускайте его, только если CHECKDB прошёл, а 1С выдаёт ошибки при открытии документов. Для этой процедуры нужен монопольный доступ к базе.
Частые вопросы
Можно ли восстановить .bak в файловую базу 1С?
.dt через Конфигуратор. Затем загрузите .dt в пустую файловую базу.Чем SQL-бэкап отличается от выгрузки .dt?
.dt переносима между СУБД и файловым вариантом, но требует монопольного доступа и на больших базах идёт долго.Подойдёт ли бесплатный SQL Server Express?
Нужно ли заново регистрировать лицензии после восстановления?
Можно ли перенести базу из бэкапа MS SQL на PostgreSQL?
.bak понимает только SQL Server. Восстановите копию на SQL Server, выгрузите базу в .dt через Конфигуратор и загрузите её в новую базу на PostgreSQL, созданную в кластере 1С.