Удаление информационной базы 1С вместе с базой данных на MS SQL

· 10 мин

Содержание

Правильный порядок такой: сначала удалить информационную базу из кластера 1С в консоли администрирования, затем удалить базу данных на SQL Server — либо прямо из консоли (вариант «Удалить базу данных»), либо командой DROP DATABASE в SQL Server Management Studio. Если сделать наоборот, в кластере останется «висящая» база, к которой пользователи будут пытаться подключиться и получать ошибку.

Порядок одинаков для клиент-серверной 1С 8.3 на любой версии MS SQL Server: от 2016 до 2022 меняются только детали интерфейса SSMS.

1. Подготовка: копия и проверка, что база точно не нужна

Удаление необратимо. Восстановить базу потом можно только из копии, поэтому до любых действий сделайте две вещи: убедитесь, что удаляете нужную базу, и снимите копию.

Сверьте имя базы в 1С и в SQL

Имя информационной базы в кластере и имя базы данных на SQL Server могут не совпадать. В кластере база называется, например, buh_2023, а в SQL — bp30_old. Посмотреть соответствие можно в свойствах базы в консоли кластера: поле «База данных» и «Сервер баз данных».

📌 Что проверить перед удалением:

  • 🔎 в свойствах базы — сервер СУБД и точное имя базы данных;
  • 👥 нет ли активных сеансов (ветка «Сеансы» у базы в консоли);
  • 🔗 не ссылаются ли на базу обмены, веб-публикации и внешние отчёты;
  • 🗓 не настроены ли на неё задания SQL Server Agent и планы обслуживания.

Сделайте копию двумя способами

Без копии базу не удаляйте, даже если она «точно старая». Чаще всего «старая» база оказывается единственным источником данных за закрытый период.

  1. Выгрузка .dt — в конфигураторе: Администрирование → Выгрузить информационную базу. Файл не зависит от СУБД и разворачивается на любом сервере 1С.
  2. Копия на стороне SQL — полный бэкап средствами СУБД:
BACKUP DATABASE [bp30_old]
TO DISK = N'D:\Backup\bp30_old_before_drop.bak'
WITH COPY_ONLY, CHECKSUM, STATS = 10;

Параметр COPY_ONLY не ломает цепочку регулярных бэкапов, если на базе настроено резервное копирование с журналами.

Выгрузку .dt для больших баз (сотни гигабайт) делать долго. Если база нужна «на всякий случай», хватит SQL-бэкапа: его можно восстановить и снова зарегистрировать в кластере.

2. Удаление информационной базы из кластера 1С

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

Заблокируйте вход и регламентные задания

Откройте Консоль администрирования серверов 1С:Предприятия, раскройте Центральные серверы → <сервер> → Кластеры → <кластер> → Информационные базы и откройте свойства нужной базы. Включите флажки «Блокировка начала сеансов включена» и «Блокировка регламентных заданий включена», сохраните.

Если в базе кто-то работает, после завершения сеансов пользователи потеряют несохранённые данные. Предупредите их заранее или делайте это вне рабочего времени.

Затем в ветке «Сеансы» этой базы удалите оставшиеся сеансы, а в ветке «Соединения» убедитесь, что соединений не осталось.

Удалите базу и выберите, что сделать с данными

Щёлкните по базе правой кнопкой и выберите Удалить. Консоль спросит логин и пароль администратора информационной базы (если пользователи в базе заведены) и предложит один из трёх вариантов:

ВариантЧто произойдёт на SQL ServerКогда выбирать
Оставить базу данных без измененийБаза данных остаётся, удаляется только регистрация в кластереНужно перенести базу на другой сервер 1С или оставить в SQL «в архиве»
Очистить базу данныхТаблицы 1С удаляются, пустая база данных остаётсяРедко; например, если под этим именем база будет создана заново
Удалить базу данныхБаза данных удаляется командой на сервере СУБДБазу нужно убрать полностью

Вариант «Удалить базу данных» срабатывает, только если у пользователя СУБД, указанного в свойствах информационной базы, есть право удалять базы. Если прав нет, регистрация в кластере удалится, а база данных на SQL останется — её придётся удалить вручную (раздел 3).

Если вы не уверены в правах пользователя СУБД, надёжнее выбрать «Оставить базу данных без изменений» и удалить базу данных в SSMS: так вы видите результат каждой команды.

3. Удаление базы данных в SQL Server Management Studio

Подключитесь к экземпляру SQL Server в SSMS под учётной записью с правами sysadmin или владельца базы.

Через интерфейс SSMS

  1. В «Обозревателе объектов» раскройте Базы данных.
  2. Правой кнопкой по базе → Удалить (Delete).
  3. В окне отметьте «Закрыть существующие соединения» (Close existing connections).
  4. Флажок про удаление сведений журнала резервного копирования и восстановления отметьте, если история бэкапов этой базы в msdb больше не нужна.
  5. Нажмите ОК.

Флажок закрытия соединений — главное, о чём забывают. Без него SSMS вернёт ошибку, если к базе подключён хоть один процесс, включая открытое окно запроса в той же SSMS.

Перейдите в контекст master

Удалить базу, находясь «внутри» неё, нельзя. Если в окне запроса выбрана удаляемая база, ваша же сессия заблокирует удаление. Поэтому любой скрипт начинайте с переключения контекста:

USE master;
GO

Проверить, кто ещё подключён к базе:

SELECT session_id, login_name, host_name, program_name
FROM sys.dm_exec_sessions
WHERE database_id = DB_ID(N'bp30_old');

В колонке program_name у соединений рабочих процессов 1С обычно видно 1CV83 Server. Если они есть, значит, база ещё зарегистрирована в кластере или рабочий процесс не отпустил соединение — вернитесь к разделу 2.

Удалите базу командой

USE master;
GO
ALTER DATABASE [bp30_old] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
DROP DATABASE [bp30_old];
GO

SET SINGLE_USER WITH ROLLBACK IMMEDIATE разрывает все чужие соединения и откатывает их незавершённые транзакции. После этого DROP DATABASE удаляет базу из каталога SQL Server и её файлы с диска.

ROLLBACK IMMEDIATE обрывает соединения без предупреждения. Проверьте имя базы в квадратных скобках дважды: SQL Server не переспрашивает.

4. Проверка и ручная очистка файлов данных

Обычно DROP DATABASE сам удаляет файлы .mdf, .ndf и .ldf. Но есть случаи, когда файлы остаются на диске и занимают место:

  • 📴 база была переведена в состояние OFFLINE перед удалением — SQL Server удаляет её из каталога, но файлы не трогает;
  • 🔌 базу ранее отсоединили (Detach), а не удалили;
  • 🗂 у базы были дополнительные файлы на другом диске, о которых забыли.

Чтобы знать, где искать, запишите пути к файлам до удаления:

SELECT name, physical_name, size * 8 / 1024 AS size_mb
FROM sys.master_files
WHERE database_id = DB_ID(N'bp30_old');

После DROP пройдите по этим путям. Если файлы остались, удалите их вручную в проводнике. Если Windows пишет, что файл занят, проверьте, не подключена ли база под другим именем: найдите путь в той же sys.master_files по всем базам.

Перевод в OFFLINE перед удалением — частый «безопасный» приём, который как раз оставляет мусор. Если базу нужно убрать полностью, переводите её в SINGLE_USER, а не в OFFLINE.

5. Хвосты на сервере 1С, в SQL и на клиентах

После удаления базы из кластера и из SQL остаются следы в нескольких местах. Они не мешают работе, но засоряют сервер и сбивают с толку.

Каталог сеансовых данных на сервере 1С

В каталоге кластера (по умолчанию C:\Program Files\1cv8\srvinfo\reg_1541) у каждой базы есть папка, названная её идентификатором (GUID). В ней лежат журнал регистрации и служебные данные. После удаления базы папка может остаться.

Идентификатор удалённой базы удобно записать заранее — он виден в свойствах базы или в выводе rac. Папку с таким GUID можно удалить. Файл реестра кластера 1CV8Clst.lst руками не правьте: консоль и rac сами убирают из него запись о базе.

Не трогайте папки с GUID, которые не можете сопоставить с удалённой базой. Там лежат журналы регистрации живых баз.

Что остаётся в SQL Server

  • 🔑 Логин SQL. Если под базу создавался отдельный логин, удалите его в Безопасность → Имена входа, но только убедившись, что им не пользуются другие базы 1С.
  • 🗓 Задания Agent и планы обслуживания. Задание, которое бэкапит удалённую базу, начнёт падать с ошибкой. Уберите базу из плана.
  • 📜 История бэкапов в msdb. Если не отмечали флажок в SSMS, очистите её процедурой EXEC msdb.dbo.sp_delete_database_backuphistory @database_name = N'bp30_old';.

Список баз у пользователей

У клиентов база останется в окне запуска. Список хранится в файле %APPDATA%\1C\1CEStart\ibases.v8i, а кэш конкретной базы — в папках с GUID внутри %LOCALAPPDATA%\1C\1cv8 и %APPDATA%\1C\1cv8. Проще всего удалить базу из списка кнопкой «Удалить» в окне запуска, а если список раздаётся централизованно через общий файл .v8i, убрать её оттуда.

Что убрать после удаления базы
Выполнено: 0 / 5

6. Удаление базы 1С скриптом: rac и PowerShell

Когда нужно убрать десяток старых баз (например, копии для тестов), руками долго. Удобнее связка утилиты rac и PowerShell.

Удаление из кластера через rac

rac работает через сервер администрирования ras. Если он не запущен, стартуйте его на сервере 1С (по умолчанию слушает порт 1545):

"C:\Program Files\1cv8\8.3.24.1586\bin\ras.exe" cluster --port=1545 localhost:1540

Номер версии в пути подставьте свой. Далее получите идентификаторы кластера и базы:

rac localhost:1545 cluster list
rac localhost:1545 infobase summary list --cluster=<uuid кластера>

И удалите базу вместе с базой данных на SQL:

rac localhost:1545 infobase --cluster=<uuid кластера> drop --infobase=<uuid базы> --infobase-user=Администратор --infobase-pwd=<пароль> --drop-database

Вместо --drop-database можно указать --clear-database (очистить) или не указывать ничего — тогда база данных на SQL останется. Если на кластере задан администратор, добавьте --cluster-user и --cluster-pwd. Полный список параметров — в rac help infobase.

Удаление в SQL через PowerShell

Для SQL-части удобен модуль SqlServer (ставится командой Install-Module SqlServer):

$server = "SQL01"
$bases  = @("bp30_test1", "bp30_test2", "zup_copy")

foreach ($db in $bases) {
    $query = @"
IF DB_ID(N'$db') IS NOT NULL
BEGIN
    ALTER DATABASE [$db] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
    DROP DATABASE [$db];
END
"@
    Invoke-Sqlcmd -ServerInstance $server -Database master -Query $query -TrustServerCertificate
    Write-Host "Обработана база: $db"
}

Скрипт подключается сразу к master, поэтому проблема контекста не возникает. Проверка DB_ID(...) IS NOT NULL не даёт скрипту упасть, если базу уже удалили. Параметр -TrustServerCertificate есть в модуле SqlServer версии 22 и выше; в более старых версиях его уберите.

Массовое удаление — самый частый способ стереть не ту базу. Перед запуском выведите список $bases на экран и сверьте его с консолью кластера.

7. Ошибки при удалении базы 1С с SQL Server

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

Ещё одна неочевидная ситуация — база «возвращается». Обычно это значит, что её восстанавливает задание SQL Server Agent или скрипт развёртывания тестовых копий. Проверьте список заданий Agent и планировщик Windows на сервере.

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

Можно ли восстановить базу 1С после DROP DATABASE?
Только из резервной копии: SQL-бэкапа .bak или выгрузки .dt. Корзины у SQL Server нет.
Что быстрее восстановить при ошибке — .bak или .dt?
Обычно .bak: восстановление идёт средствами SQL Server, без пересоздания таблиц через 1С. .dt удобнее, когда базу переносят на другой сервер СУБД или в файловый вариант.
Освободит ли удаление базы клиентскую лицензию?
Лицензии занимают сеансы, а не базы. После завершения сеансов удалённой базы лицензии освобождаются сами.
Нужно ли перезапускать службу сервера 1С после удаления?
Нет. Консоль и rac удаляют базу без перезапуска. Перезапуск службы оборвёт сеансы во всех остальных базах кластера.
Можно ли удалить базу 1С на PostgreSQL так же?
Логика та же: удалить в кластере 1С, затем базу в СУБД. Но команды и инструменты другие, приведённые здесь SQL-скрипты для PostgreSQL не подходят.