Выгнать всех из базы 1С перед обновлением: от вежливой блокировки до rac и остановки службы

· 10 мин

Содержание

Отключить активных пользователей в 1С 8.3 проще всего через саму программу: Администрирование → Обслуживание → Блокировка работы пользователей (в старых релизах раздел называется «Поддержка и обслуживание»). Программа предупредит всех, кто работает в базе, и через несколько минут сама завершит их сеансы. Если база клиент-серверная, сеанс любого пользователя можно убить вручную в консоли кластера или командой rac session terminate.

Типичная картина: вечер пятницы, нужно накатить обновление конфигурации , а конфигуратор не может получить монопольный доступ. В списке активных пользователей висят три бухгалтера, которые ушли домой с открытой 1С, и пара фоновых заданий. Способы отключения идут от самого мягкого к самому грубому, и работают они не везде одинаково.

Чем опасно «просто закрыть» 1С у пользователя

Снять процесс 1cv8.exe в диспетчере задач терминального сервера или выдернуть сеанс в консоли можно за секунду. Но последствия у такого отключения есть:

  • 📝 Несохранённые данные пропадают. Документ, который бухгалтер заполнял полчаса и не записал, исчезнет.
  • 🔄 Открытая транзакция откатывается. Если пользователь в момент отключения проводил документ или закрывал месяц, изменения не запишутся. База останется целой, но операцию придётся запускать заново.
  • 🔁 Сеанс возвращается. Клиент 1С после разрыва пытается переподключиться, а регламентные задания стартуют снова по расписанию. Без блокировки новых сеансов через минуту список опять не пуст.
  • 🔒 Повисшие файлы в файловой базе. Если процесс убит на компьютере, который держит открытым файл 1Cv8.1CD по сети, блокировка файла на сервере может остаться до таймаута сетевой сессии.

Поэтому порядок такой: сначала запретить новые входы, потом предупредить, и только потом принудительно завершать то, что осталось.

Какой способ подходит вашей базе

СпособФайловая базаКлиент-сервернаяПраваРиск
Блокировка из программы (БСП)дадаполные права в базенизкий
Конфигуратортолько просмотртолько просмотр + завершение при обновленииадминистратор базынизкий
Консоль кластеранетдаадминистратор кластерасредний
Утилита racнетдаадминистратор кластерасредний
Скрипт через COM-соединениенетдаадминистратор кластерасредний
Разрыв соединений в СУБДнетдаадминистратор СУБДвысокий
Остановка службы или серверазакрыть файл на сервередаадминистратор ОСвысокий

Способ 1. Блокировка работы пользователей прямо в программе

Этот путь есть во всех типовых конфигурациях на Библиотеке стандартных подсистем: Бухгалтерии 3.0, ЗУП 3.1, УТ 11, КА, ERP. Работает и в файловом, и в клиент-серверном варианте.

  1. Откройте Администрирование → Обслуживание.
  2. В группе «Обслуживание» найдите ссылку «Блокировка работы пользователей».
  3. Укажите время начала и окончания блокировки и текст сообщения: «С 19:00 база закрыта на обновление».
  4. Задайте код разрешения входа — по нему администратор войдёт в заблокированную базу.
  5. Нажмите «Установить блокировку».

Пользователи увидят предупреждение и смогут дописать документы. Когда наступит время блокировки, программа сама завершит их сеансы, а новые не пустит.

Рядом в том же разделе есть список «Активные пользователи». В клиент-серверной базе из него можно завершить выделенный сеанс: программа попросит логин и пароль администратора кластера, если он задан.

Вход в заблокированную базу

Администратор заходит в базу с параметром запуска /UC и кодом разблокировки. Например, для кода upd2024:

"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /F"D:\Bases\Buh" /UCupd2024

Для конфигуратора — то же самое с режимом DESIGNER. Код можно вписать и в поле «Дополнительные параметры запуска» в настройках базы в окне запуска.

Блокировку можно включить без входа в интерфейс: запуск с параметром /C"ЗавершитьРаботуПользователей" ставит её из командной строки, а /C"РазрешитьРаботуПользователей" снимает. Это удобно для ночных скриптов обновления.

Не забудьте снять блокировку после работ. Иначе утром ни один бухгалтер не войдёт в базу, а увидит ваше вечернее сообщение.

Способ 2. Что умеет конфигуратор

В конфигураторе есть пункт Администрирование → Активные пользователи. Он показывает, кто сидит в базе, с какого компьютера, в каком приложении и с какого времени. Завершить сеанс из этого списка нельзя — он нужен для того, чтобы понять, кого просить выйти.

Принудительное завершение конфигуратор предлагает в другом месте. Когда в клиент-серверной базе вы запускаете обновление конфигурации базы данных, а монопольный режим установить не удаётся, появляется окно с кнопкой «Завершить сеансы и повторить». Она завершает все сеансы, кроме вашего, и повторяет попытку.

Для файловой базы такой кнопки нет: каждый пользователь держит файл базы сам, и конфигуратор не может его вытолкнуть. Тут поможет только способ 1 или закрытие файла на сервере (способ 6).

Способ 3. Консоль администрирования серверов 1С

Для клиент-серверной базы это основной ручной инструмент. Консоль ставится вместе с сервером 1С или отдельно, компонентой «Администрирование сервера 1С:Предприятия».

  1. Запустите «Администрирование серверов 1С Предприятия».
  2. Раскройте Central 1C:Enterprise 8.3 servers → <имя сервера> → Кластеры → <кластер> → Информационные базы → <ваша база> → Сеансы.
  3. Выделите сеансы. В колонке «Приложение» видно тип: тонкий клиент, конфигуратор, фоновое задание, COM-соединение.
  4. Правой кнопкой мыши — «Удалить». Консоль спросит подтверждение и завершит сеанс.

Чтобы список не наполнился снова, откройте свойства информационной базы (правая кнопка по базе → «Свойства») и включите:

  • ✅ «Блокировка начала сеансов включена» — с текстом сообщения, интервалом и кодом разрешения;
  • ✅ «Блокировка регламентных заданий включена» — иначе фоновые задания будут стартовать по расписанию.

Для изменения свойств консоль попросит логин и пароль пользователя самой информационной базы с правами администратора.

Если консоль не открывается

Самая частая беда — консоль после обновления платформы перестаёт запускаться. Оснастка привязана к библиотеке radmin.dll конкретной версии. Перерегистрируйте её от имени администратора, указав папку установленной версии:

regsvr32 "C:\Program Files\1cv8\8.3.xx.xxxx\bin\radmin.dll"

Версия radmin.dll должна совпадать с версией сервера, к которому вы подключаетесь.

Способ 4. Утилита rac: завершение сеансов из командной строки

Утилита rac работает через сервер администрирования ras. Он не запускается сам по себе — его ставят отдельной службой или стартуют вручную. По умолчанию ras слушает порт 1545 и обращается к агенту кластера на порту 1540:

ras cluster --daemon

Дальше последовательность из четырёх команд. Если на кластере есть администратор, к командам добавляют --cluster-user и --cluster-pwd.

rem 1. Узнать идентификатор кластера
rac cluster list

rem 2. Найти идентификатор базы
rac infobase summary list --cluster=<uuid-кластера>

rem 3. Посмотреть сеансы этой базы
rac session list --cluster=<uuid-кластера> --infobase=<uuid-базы>

rem 4. Завершить конкретный сеанс
rac session terminate --cluster=<uuid-кластера> --session=<uuid-сеанса>

Запрет новых сеансов ставится той же утилитой. Для изменения свойств базы нужны логин и пароль её администратора:

rac infobase update --cluster=<uuid-кластера> --infobase=<uuid-базы> ^
  --infobase-user=Админ --infobase-pwd=Пароль ^
  --sessions-deny=on --scheduled-jobs-deny=on ^
  --denied-message="Обновление базы" --permission-code=upd2024

После работ то же самое с --sessions-deny=off --scheduled-jobs-deny=off. Полный список параметров для вашей версии выводит rac help infobase и rac help session.

Скрипт PowerShell: завершить все сеансы одной базы

Удобно для планировщика заданий перед ночным обновлением. Путь к rac.exe и имя базы замените на свои:

$rac  = "C:\Program Files\1cv8\8.3.xx.xxxx\bin\rac.exe"
$base = "buh"   # имя базы в кластере

# Идентификатор первого кластера
$cluster = ((& $rac cluster list) | Where-Object { $_ -match '^cluster\s*:' } |
    Select-Object -First 1) -replace '^cluster\s*:\s*', ''

# Идентификатор базы по имени
$ibId = $null
foreach ($line in (& $rac infobase summary list --cluster=$cluster)) {
    if ($line -match '^infobase\s*:\s*(\S+)') { $current = $Matches[1] }
    if ($line -match '^name\s*:\s*(\S+)' -and $Matches[1] -eq $base) { $ibId = $current }
}
if (-not $ibId) { Write-Host "База $base не найдена"; exit 1 }

# Завершить все сеансы базы
foreach ($line in (& $rac session list --cluster=$cluster --infobase=$ibId)) {
    if ($line -match '^session\s*:\s*(\S+)') {
        & $rac session terminate --cluster=$cluster --session=$Matches[1]
        Write-Host "Завершён сеанс $($Matches[1])"
    }
}

Скрипт рассчитан на ras, запущенный на том же компьютере. Для удалённого сервера после команды rac укажите адрес: & $rac srv1c:1545 cluster list и так далее.

Способ 5. Код на встроенном языке через COM-соединение

Методы встроенного языка вроде ПолучитьСеансыИнформационнойБазы() показывают сеансы, но не завершают их. Завершить сеанс из 1С можно через COM-объект V83.COMConnector, который подключается к агенту сервера. Работает только в Windows и только на той машине, где зарегистрирована библиотека comcntr.dll:

regsvr32 "C:\Program Files\1cv8\8.3.xx.xxxx\bin\comcntr.dll"

Пример процедуры для внешней обработки. Она завершает в указанной базе все сеансы тонкого и толстого клиента, кроме сеансов конфигуратора и консоли:

&НаСервереБезКонтекста
Процедура ЗавершитьСеансыБазы(ИмяБазы, АдминКластера, ПарольКластера)

    Коннектор = Новый COMОбъект("V83.COMConnector");
    Агент = Коннектор.ConnectAgent("tcp://srv1c:1540");

    Кластеры = Агент.GetClusters();
    Кластер = Кластеры[0];
    Агент.Authenticate(Кластер, АдминКластера, ПарольКластера);

    Завершено = 0;
    Сеансы = Агент.GetSessions(Кластер);
    Для Каждого Сеанс Из Сеансы Цикл
        Если НРег(Сеанс.infoBase.Name) <> НРег(ИмяБазы) Тогда
            Продолжить;
        КонецЕсли;
        Если Сеанс.AppID = "Designer" Или Сеанс.AppID = "SrvrConsole" Тогда
            Продолжить;
        КонецЕсли;
        Агент.TerminateSession(Кластер, Сеанс);
        Завершено = Завершено + 1;
    КонецЦикла;

    Сообщить(СтрШаблон("Завершено сеансов: %1", Завершено));

КонецПроцедуры

Учтите два момента. Код с директивой &НаСервереБезКонтекста выполняется на сервере 1С, и comcntr.dll должна быть зарегистрирована там. Сеанс, из которого запущена обработка, попадёт в список и тоже будет завершён — запускайте её из другой базы или добавьте фильтр по имени пользователя (Сеанс.userName).

В конфигурациях на БСП есть готовый программный интерфейс — модуль СоединенияИБ и подсистема администрирования кластера. На нём и построены команды способа 1, так что писать своё стоит только для нетиповых сценариев.

Способ 6. Разрыв соединений в СУБД и остановка службы

Это крайние меры. Их применяют, когда сеансы зависли и не удаляются ни консолью, ни rac.

Соединения на стороне SQL Server и PostgreSQL

Сеанс 1С живёт в кластере, а не в базе данных СУБД. Рабочий процесс rphost держит к СУБД свои соединения и после их разрыва подключается снова. Поэтому убивать соединения в СУБД имеет смысл только тогда, когда базу нужно освободить для операции на уровне самой СУБД — например, восстановления из бэкапа.

Для MS SQL Server:

ALTER DATABASE [buh] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
-- ... восстановление или обслуживание ...
ALTER DATABASE [buh] SET MULTI_USER;

Для PostgreSQL:

SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname = 'buh' AND pid <> pg_backend_pid();

Перед этим сделайте резервную копию и поставьте блокировку начала сеансов в кластере. Незавершённые транзакции откатятся, а пользователи, которые в этот момент работали, получат ошибку. Удалять или править строки в служебных таблицах 1С на SQL нельзя: так легко испортить базу.

Перезапуск службы агента сервера

Остановка службы сервера 1С обрывает сеансы во всех базах кластера, а не только в нужной. Делайте это в согласованное окно, когда никто не работает . Служба называется «Агент сервера 1С:Предприятия 8.3», команда из консоли от имени администратора:

net stop "1C:Enterprise 8.3 Server Agent (x86-64)"
net start "1C:Enterprise 8.3 Server Agent (x86-64)"

Имя службы для вашей установки проверьте в оснастке services.msc — у 32-разрядного сервера и при нескольких версиях оно отличается. Удалять папки кластера и файлы реестра кластера в каталоге srvinfo при этом не нужно.

Файловая база: кто держит файл

Для файловой базы консоли нет, но файл 1Cv8.1CD лежит в сетевой папке. На сервере, где она расшарена, откройте Управление компьютером → Общие папки → Открытые файлы. Найдите в списке 1Cv8.1CD, в колонке видно, какой пользователь его держит. Правой кнопкой — «Закрыть открытый файл».

Если база работает на терминальном сервере, сеанс пользователя можно завершить в диспетчере задач на вкладке «Пользователи» или снять у него процесс 1cv8.exe. Несохранённые данные этого пользователя пропадут.

Типичные промахи администратора

  • 🔁 Сеансы удалили, а через минуту они снова в списке. Не включена блокировка начала сеансов и регламентных заданий. Клиенты переподключились, задания стартовали по расписанию.
  • 🧩 Мешает фоновое задание или COM-соединение. Его выдаёт внешняя система: обмен с сайтом, интеграция с банком, сервис отчётности. Пока источник не остановлен, соединение будет появляться снова. Найдите в колонке «Компьютер» адрес и остановите обмен на той стороне.
  • 🔑 Консоль и rac пишут, что нет прав. На кластере назначен администратор, а вы входите без его логина. Пароль утерян — остановите службу и восстановите файлы кластера из резервной копии или обратитесь к тому, кто настраивал сервер.
  • 🧭 Подключились не к той версии. На сервере стоят две версии платформы, а консоль или rac от другой. Используйте утилиты из папки той версии, под которой работает служба агента.
  • 🚪 Заблокировали базу и сами не можете войти. Забыли код разблокировки. Снимите блокировку в свойствах базы в консоли кластера или командой rac infobase update ... --sessions-deny=off.
Перед обновлением базы
Выполнено: 0 / 6

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

Сколько сеансов я вижу в списке, столько лицензий занято?
Не всегда. Фоновые задания и COM-соединения лицензию не занимают. Какой сеанс сколько расходует, показывает rac session list --licenses или колонка лицензий в консоли кластера.
Почему у пользователя два сеанса, хотя он открыл одно окно?
Обычно второй остался после обрыва связи: старый сеанс ещё не удалён по таймауту, а клиент уже подключился заново. Висящий сеанс можно смело завершить в консоли.
Блокировка установлена, но пользователи продолжают работать. Почему?
Блокировка из программы срабатывает в назначенное время начала, а не в момент нажатия кнопки. Проверьте, что время начала уже наступило и что часы на сервере совпадают с вашими.
Сохранится ли то, что пользователь не успел записать?
Нет. Данные открытой, но не записанной формы теряются при любом принудительном завершении сеанса. Поэтому сначала предупреждение и блокировка, и только потом принудительное отключение.
Нужно ли отключать всех, чтобы сделать выгрузку .dt?
Да. Выгрузка информационной базы в файл требует монопольного режима, как и обновление структуры конфигурации базы данных и тестирование и исправление.