Как развернуть копию MS SQL Server и снова подключить к ней 1С

· 10 мин

Содержание

Базу 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

  1. Подключитесь к экземпляру SQL Server, щёлкните правой кнопкой по Databases и выберите Restore Database….
  2. В блоке Source отметьте Device, нажмите кнопку с многоточием и добавьте файл .bak.
  3. В поле Database блока Destination впишите имя базы. Для копии рядом с рабочей — новое имя, например buh_test.
  4. На вкладке Files включите Relocate all files to folder и укажите папки для данных и журнала. Проверьте, что имена физических файлов не совпадают с файлами рабочей базы.
  5. На вкладке Options при восстановлении поверх существующей базы включите Overwrite the existing database (WITH REPLACE).
  6. Там же снимите галочку Take tail-log backup before restore, если восстанавливаете в новую базу. Для отката рабочей базы в модели Full хвостовой журнал, наоборот, полезен.
  7. Нажмите 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. Откройте Администрирование серверов 1С Предприятия, разверните центральный сервер и кластер.
  2. Правой кнопкой по узлу Информационные базы выберите Создать → Информационная база.
  3. Заполните Имя — так база будет называться в кластере, например buh_test.
  4. Сервер баз данных — имя экземпляра SQL Server, Тип СУБД — MSSQLServer, База данных — имя восстановленной базы ровно как в SSMS.
  5. Укажите пользователя и пароль сервера БД.
  6. Снимите галочку «Создать базу данных в случае ее отсутствия». База уже есть, создавать ничего не нужно, а опечатка в имени приведёт к созданию пустой базы.
  7. Для тестовой копии включите Установить блокировку регламентных заданий.
  8. Нажмите 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. Запуск. Откройте базу в режиме 1С:Предприятие под администратором. Если база не открывается, сначала зайдите в Конфигуратор: платформа сообщит, если конфигурация базы данных отличается от основной.
  2. Диалог о перемещённой базе. Типовые конфигурации на БСП при первом запуске копии часто показывают предупреждение, что база перемещена или восстановлена из копии. Для тестовой базы отвечайте, что это копия: тогда программа отключит обмены и интернет-сервисы, которые нельзя запускать с двух баз сразу.
  3. Данные. Откройте журнал документов и найдите последние документы. Их дата должна совпадать с моментом копии или с точкой STOPAT.
  4. Итоги и регистры. Сформируйте оборотно-сальдовую ведомость или ключевой отчёт за текущий месяц и сравните с ожидаемыми цифрами.
  5. Пользователи. Проверьте вход под обычным пользователем. Список пользователей хранится в самой базе, поэтому он вернётся в состояние на дату копии: сотрудники, добавленные позже, исчезнут.
  6. Физическая целостность. Для базы, которая пойдёт в работу, выполните DBCC CHECKDB на стороне SQL. Ошибок быть не должно.
DBCC CHECKDB (N'buh_test') WITH NO_INFOMSGS;

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

Тестирование и исправление информационной базы в Конфигураторе после чистого восстановления обычно не нужно. Запускайте его, только если CHECKDB прошёл, а 1С выдаёт ошибки при открытии документов. Для этой процедуры нужен монопольный доступ к базе.

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

Можно ли восстановить .bak в файловую базу 1С?
Напрямую нет. Разверните копию на любом SQL Server, хоть на бесплатной редакции Express, зарегистрируйте базу в кластере и выгрузите её в файл .dt через Конфигуратор. Затем загрузите .dt в пустую файловую базу.
Чем SQL-бэкап отличается от выгрузки .dt?
Бэкап SQL создаётся быстро, без остановки работы пользователей и поддерживает откат на момент времени. Выгрузка .dt переносима между СУБД и файловым вариантом, но требует монопольного доступа и на больших базах идёт долго.
Подойдёт ли бесплатный SQL Server Express?
Для тестов — да, если база укладывается в ограничение Express на размер файла данных (10 ГБ). Рабочую базу большего объёма в Express не развернуть.
Нужно ли заново регистрировать лицензии после восстановления?
Нет. Лицензии привязаны к компьютеру или серверу, а не к базе SQL. Восстановление данных на них не влияет.
Можно ли перенести базу из бэкапа MS SQL на PostgreSQL?
Не напрямую: файл .bak понимает только SQL Server. Восстановите копию на SQL Server, выгрузите базу в .dt через Конфигуратор и загрузите её в новую базу на PostgreSQL, созданную в кластере 1С.