Восстановление базы 1С из файла .bak на MS SQL Server и подключение к кластеру

· 10 мин

Содержание

Чтобы загрузить бэкап 1С в SQL, откройте SQL Server Management Studio, щёлкните правой кнопкой по узлу Databases и выберите Restore Database…, укажите файл .bak, задайте имя новой базы и пути к файлам данных и журнала. После восстановления базу нужно зарегистрировать в кластере серверов 1С через консоль администрирования — без этого клиент 1С её не увидит.

Типичная ситуация: прислали .bak рабочей базы, чтобы развернуть тестовую копию, или сервер умер и базу поднимают на новом железе. Ниже — порядок действий для MS SQL Server и платформы 1С:Предприятие 8.3 в клиент-серверном варианте, плюс скрипт, который повторяет восстановление без мастера.

1. Что проверить до восстановления бэкапа в SQL Server

Большая часть неудачных восстановлений ломается ещё до нажатия «ОК». Пять проверок занимают минуты.

Версия SQL Server: бэкап идёт только «вверх»

Файл .bak, снятый на SQL Server 2019, не восстановится на 2017 или 2016. Обратно — пожалуйста: бэкап с 2016 спокойно ляжет на 2019 или 2022.

Узнать, на какой версии сделан бэкап, можно без восстановления:

RESTORE HEADERONLY FROM DISK = N'D:\Backup\buh.bak';

Смотрите столбцы SoftwareVersionMajor и DatabaseName. Сравните с версией своего сервера (SELECT @@VERSION;).

Номер версииSQL Server
112012
122014
132016
142017
152019
162022

Номер версии сервера назначения должен быть не ниже номера из бэкапа.

Остальные проверки

  • 📦 Редакция Express. Её лимит — 10 ГБ на файл данных одной базы. Рабочая база 1С на 15–20 ГБ в Express не восстановится, нужна Standard или выше.
  • 💾 Место на диске. SQL Server создаёт файлы того размера, какими они были в исходной базе, вместе с пустым местом внутри. Если у источника журнал раздут до 40 ГБ, столько же понадобится и вам.
  • 🔐 Доступ к файлу. Файл читает не ваша учётная запись, а служба SQL Server (по умолчанию NT Service\MSSQLSERVER). Положите .bak в локальную папку, к которой у службы есть чтение. Сетевые диски, подключённые буквой в вашем сеансе, служба не видит — указывайте UNC-путь \\server\share\buh.bak.
  • 🧩 Сеансы 1С. Если восстанавливаете поверх существующей базы, в ней не должно быть пользователей (подробно — в разделе 4).

Размеры файлов из бэкапа показывает вторая команда:

RESTORE FILELISTONLY FROM DISK = N'D:\Backup\buh.bak';

Столбец Size — в байтах. Запомните и LogicalName обоих файлов: они понадобятся для путей.

2. Загрузка бэкапа 1С через мастер SSMS

Мастер подходит для разового восстановления. Порядок такой:

  1. Подключитесь в SSMS к экземпляру SQL Server под учётной записью с правами sysadmin или dbcreator.
  2. В Object Explorer щёлкните правой кнопкой по папке Databases и выберите Restore Database….
  3. На странице General в блоке Source выберите Device, нажмите кнопку с многоточием, затем Add и укажите файл .bak.
  4. В таблице Backup sets to restore отметьте нужный набор. В одном файле бывает несколько бэкапов — ориентируйтесь на дату в столбце Start Date.
  5. В поле Database блока Destination впишите имя базы. По умолчанию подставится имя исходной — для тестовой копии поменяйте его, например на buh_test.
  6. Перейдите на страницы Files и Options (о них — следующие два раздела).
  7. Нажмите OK и дождитесь сообщения об успешном восстановлении.

В русской версии SSMS команда называется «Восстановить базу данных…», страницы — «Общие», «Файлы» и «Параметры».

Скорость зависит от дисков. Ориентир — база 1С на 30–50 ГБ на SSD восстанавливается за 5–15 минут. На HDD и с сетевой папки — в разы дольше.

3. Пути к файлам базы при восстановлении

База MS SQL состоит минимум из двух файлов: данных .mdf и журнала транзакций .ldf. Бэкап хранит пути, где они лежали на исходном сервере. Если на новом сервере нет диска E: или там уже лежит файл с таким именем, восстановление упадёт.

На странице Files мастера:

  • отметьте Relocate all files to folder;
  • в Data file folder укажите папку для .mdf;
  • в Log file folder — папку для .ldf.

Проверьте столбец Restore As в таблице ниже. При восстановлении копии рядом с оригиналом имена файлов должны отличаться, иначе SQL Server попытается перезаписать файлы рабочей базы.

ФайлЛогическое имя (пример)Куда класть
ДанныеbuhБыстрый диск под данные, E:\SQLData\buh_test.mdf
Журналbuh_logОтдельный диск под журналы, F:\SQLLog\buh_test_log.ldf

Логические имена остаются от исходной базы и на работу 1С не влияют. Переименовывать их не обязательно.

4. Перезапись существующей базы и закрытие подключений

Когда база с таким именем уже есть, нужны параметры на странице Options:

  • Overwrite the existing database (WITH REPLACE) — разрешает затереть существующую базу. Без него SQL Server откажется восстанавливать бэкап другой базы поверх этой.
  • Close existing connections to destination database — переводит базу в однопользовательский режим и обрывает все подключения.
  • Take tail-log backup before restore — снимите этот флажок. Иначе SSMS попробует сделать бэкап хвоста журнала целевой базы, и в модели восстановления SIMPLE это закончится ошибкой.
  • Recovery state — оставьте RESTORE WITH RECOVERY, если восстанавливаете один полный бэкап.

Перезапись уничтожает текущие данные целевой базы без возможности отката. Перед восстановлением поверх рабочей базы сделайте её свежий бэкап.

Закрытие подключений обрывает сеансы 1С на полуслове: несохранённые документы пропадут, у пользователей появится ошибка соединения. Делайте это вне рабочего времени. Удобнее заранее остановить вход в базу через консоль кластера 1С: в свойствах информационной базы включите Блокировка начала сеансов включена, задайте сообщение и код разрешения, затем завершите оставшиеся сеансы.

5. Скрипт T-SQL для восстановления бэкапа

Скрипт удобен, когда тестовую копию обновляют регулярно, например каждый понедельник. Подставьте свои логические имена из RESTORE FILELISTONLY:

USE master;
GO
IF DB_ID(N'buh_test') IS NOT NULL
    ALTER DATABASE [buh_test] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
RESTORE DATABASE [buh_test]
FROM DISK = N'D:\Backup\buh.bak'
WITH FILE = 1,
     MOVE N'buh'     TO N'E:\SQLData\buh_test.mdf',
     MOVE N'buh_log' TO N'F:\SQLLog\buh_test_log.ldf',
     REPLACE,
     RECOVERY,
     STATS = 10;
GO
ALTER DATABASE [buh_test] SET MULTI_USER;
ALTER DATABASE [buh_test] SET RECOVERY SIMPLE;
GO

Что делает каждая часть:

  • SET SINGLE_USER WITH ROLLBACK IMMEDIATE — обрывает подключения и откатывает незавершённые транзакции;
  • FILE = 1 — номер набора в файле (столбец Position из RESTORE HEADERONLY);
  • MOVE — новые пути для каждого логического файла;
  • STATS = 10 — выводит прогресс каждые 10%;
  • RECOVERY SIMPLE в конце — для тестовой копии журнал не нужен, так он не разрастётся.

Запуск по расписанию

Сохраните скрипт в C:\Scripts\restore_buh_test.sql и запускайте через sqlcmd:

sqlcmd -S localhost -E -i C:\Scripts\restore_buh_test.sql -o C:\Scripts\restore_log.txt

Ключ -E — вход под Windows-учётной записью, -o пишет вывод в лог. Команду ставят в Планировщик заданий Windows или в задание SQL Server Agent. В редакции Express агента нет — только Планировщик.

Цепочка: полный, разностный, журналы

Если резервные копии делают по схеме «полный + разностные + журналы», восстанавливайте по порядку. Все шаги, кроме последнего, — с NORECOVERY:

RESTORE DATABASE [buh] FROM DISK = N'D:\Backup\buh_full.bak' WITH NORECOVERY, REPLACE;
RESTORE DATABASE [buh] FROM DISK = N'D:\Backup\buh_diff.bak' WITH NORECOVERY;
RESTORE LOG [buh] FROM DISK = N'D:\Backup\buh_log1.trn' WITH NORECOVERY;
RESTORE LOG [buh] FROM DISK = N'D:\Backup\buh_log2.trn'
    WITH STOPAT = N'2026-10-05T14:30:00', RECOVERY;

STOPAT возвращает базу на конкретный момент — например, за минуту до того, как кто-то удалил документы. Пока не выполнен шаг с RECOVERY, база висит в состоянии Restoring… и недоступна.

6. Регистрация восстановленной базы в кластере 1С

SQL Server теперь хранит базу, но сервер 1С о ней не знает. Регистрируем:

  1. Откройте Администрирование серверов 1С Предприятия (консоль кластера).
  2. Разверните центральный сервер → Кластеры → ваш кластер → Информационные базы.
  3. Правой кнопкой → Создать → Информационная база.
  4. Заполните поля:
    • Имя — как база будет называться в кластере, например buh_test;
    • Сервер баз данных — имя сервера SQL, для именованного экземпляра SRV\SQL2019;
    • Тип СУБД — MS SQL Server;
    • База данных — точное имя базы, которое задали при восстановлении;
    • Пользователь сервера БД и Пароль — учётная запись SQL, под которой 1С ходит в базу.
  5. Флажок Создать базу данных в случае ее отсутствия не ставьте — база уже есть.
  6. Для тестовой копии включите Блокировка регламентных заданий включена. Иначе копия начнёт загружать банковские выписки, отправлять почту и запускать обмены от имени рабочей базы.

Затем добавьте базу в список у пользователя: в окне запуска 1С нажмите Добавить → Добавление в список существующей информационной базы, выберите размещение На сервере 1С:Предприятия, укажите кластер и имя базы из шага 4.

Сообщение о перемещённой базе

Типовые конфигурации на БСП при первом входе в восстановленную копию обычно спрашивают, перемещена ли база или это копия. Для тестовой базы выбирайте вариант про копию: программа отключит работу с внешними ресурсами — обмены, синхронизацию, отправку отчётности. Для рабочей базы, перенесённой на новый сервер, выбирайте перемещение.

7. Права пользователя SQL после восстановления

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

Найти таких пользователей:

USE [buh_test];
SELECT dp.name AS db_user
FROM sys.database_principals dp
LEFT JOIN sys.server_principals sp ON dp.sid = sp.sid
WHERE dp.type = 'S' AND dp.principal_id > 4 AND sp.sid IS NULL;

Связать пользователя с логином (логин на сервере уже должен быть создан):

ALTER USER [user1c] WITH LOGIN = [user1c];

Если 1С подключается под отдельным логином, проще сделать его владельцем базы:

ALTER AUTHORIZATION ON DATABASE::[buh_test] TO [user1c];

Учётной записи из поля Пользователь сервера БД для обычной работы нужна роль db_owner в этой базе. Для обновления конфигурации её тоже хватает. Давать sysadmin не обязательно.

8. Ошибки при загрузке бэкапа 1С в SQL и что с ними делать

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

После любой ошибки, если база осталась в состоянии Restoring…, повторите восстановление с RECOVERY или удалите недовосстановленную базу и начните заново.

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

Чем .bak отличается от выгрузки .dt?
Файл .bak — бэкап средствами MS SQL, его восстанавливают только в MS SQL Server той же или более новой версии. Файл .dt делает Конфигуратор 1С, он не привязан к СУБД и загружается в файловую базу, PostgreSQL или MS SQL.
Можно ли из .bak получить файловую базу 1С?
Напрямую нет. Восстановите .bak на любом SQL Server, хоть на Express при небольшом размере, зарегистрируйте базу в кластере, выгрузите .dt через Конфигуратор и загрузите его в файловую базу.
Можно ли загрузить .bak из MS SQL в PostgreSQL?
Нет, форматы несовместимы. Перенос между СУБД для 1С делают через выгрузку и загрузку .dt.
Нужно ли менять уровень совместимости базы после переноса на новую версию SQL?
SQL Server сохраняет уровень совместимости из бэкапа. Его можно поднять командой ALTER DATABASE … SET COMPATIBILITY_LEVEL, но перед этим проверьте, что ваша версия платформы 1С поддерживает эту версию SQL Server.
Как восстановить из бэкапа одну таблицу или документ 1С?
Средствами SQL выдернуть отдельный документ нельзя: данные 1С разложены по связанным таблицам. Восстановите бэкап отдельной копией рядом с рабочей базой, найдите нужные данные и перенесите их средствами 1С, например выгрузкой в XML через обработку.