Монопольный доступ к базе 1С 8.3: от блокировки пользователей до скрипта rac
Содержание
Чтобы включить монопольный режим в 1С, в базе не должно остаться ни одного чужого сеанса. В типовой конфигурации на БСП это делается так: Администрирование → Обслуживание → Блокировка работы пользователей (в старых релизах раздел называется «Поддержка и обслуживание»), затем вход в конфигуратор с кодом разрешения. Конфигуратор сам запросит монопольный режим, когда вы запустите обновление конфигурации
базы данных, загрузку .dt или тестирование и исправление.
Для серверной базы есть ещё три пути: консоль кластера, утилита rac для скриптов и COM-соединение из кода. Если режим всё равно не ставится, почти всегда виноват забытый сеанс — фоновое задание, обмен или веб-публикация.
Когда нужен монопольный режим и чем файловая база отличается от серверной
Монопольный режим — это состояние, при котором с информационной базой работает только один сеанс: ваш. Он нужен не для любой работы в конфигураторе, а для конкретных операций:
- 🔧 обновление конфигурации базы данных с реструктуризацией таблиц;
- 📦 загрузка информационной базы из файла
.dt; - 🩺 тестирование и исправление информационной базы;
- 🧹 часть регламентных операций типовых конфигураций, которые сами просят монопольный доступ.
Механика зависит от варианта работы базы.
| Файловая база | Клиент-серверная база | |
|---|---|---|
| Кто мешает | Все, кто открыл файл 1Cv8.1CD: пользователи, веб-публикация, внешние COM-подключения | Сеансы в кластере: пользователи, фоновые и регламентные задания, веб-сервисы, обмены |
| Как увидеть сеансы | Список активных пользователей в базе, открытые файлы на сервере-хранилище | Консоль администрирования, rac session list |
| Как завершить чужой сеанс | Только попросить выйти или закрыть процесс/файл на компьютере | Удалить сеанс в консоли, rac session terminate, COM-соединение |
| Блокировка новых входов | Механизм БСП внутри базы | Флаг «Блокировка начала сеансов» в свойствах базы в кластере |
В файловом варианте нет службы, которая может оборвать чужое подключение. Поэтому там всё держится на дисциплине и на блокировке входа средствами конфигурации. В серверном варианте у администратора кластера есть полный контроль над сеансами.
Как установить монопольный режим в 1С:Предприятии через блокировку работы
Сам флажок «монопольный режим» в пользовательском режиме не включается. Задача интерфейса — выпустить всех из базы и не пустить обратно. Для этого в конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11, КА, ERP) есть одна и та же обработка.
Шаг 1. Проверьте, кто сейчас в базе
- Откройте
Администрирование → Обслуживание. - В группе служебных команд откройте «Активные пользователи».
- Посмотрите колонку приложения: кроме обычных клиентов там бывают фоновые задания, COM-соединения и веб-сервисы.
Предупредите живых пользователей заранее. Принудительное завершение рвёт несохранённые документы.
Шаг 2. Включите блокировку
- В том же разделе откройте «Блокировка работы пользователей».
- Напишите сообщение: что происходит и когда база снова будет доступна.
- Укажите время начала и окончания блокировки.
- Задайте код разрешения — любое слово или число. С ним вы сами войдёте в заблокированную базу.
- Нажмите кнопку установки блокировки.
Пользователи получат предупреждение, а к моменту начала блокировки их сеансы завершатся. Новые входы будут отклоняться.
Шаг 3. Войдите в конфигуратор с кодом
Без кода вас тоже не пустит. Добавьте параметр /UC в строку запуска:
"C:\Program Files\1cv8\common\1cestart.exe" DESIGNER /F"D:\Bases\Buh" /N"Администратор" /P"пароль" /UC"obnovlenie"
Для серверной базы вместо /F укажите /S"srv1c\buh".
Типовые конфигурации понимают параметры запуска /C"ЗавершитьРаботуПользователей" и /C"РазрешитьРаботуПользователей". Первый запускает ту же блокировку из командной строки, второй её снимает. Удобно для ночных заданий.
После работы не забудьте снять блокировку в той же форме. Иначе утром база встретит бухгалтерию сообщением о профилактике.
Монопольный режим в конфигураторе
В конфигураторе есть флажок «Монопольный режим» в главном меню. Включать его вручную приходится редко: операции, которым он нужен, запрашивают его сами.
Как это выглядит на практике:
- Вы нажимаете «Обновить конфигурацию
базы данных» (F7) или загружаете
.dt. - Платформа пытается установить монопольный режим.
- Если в базе есть другие сеансы, появляется окно со списком мешающих подключений.
- Платформа предлагает варианты: повторить попытку, завершить сеансы и повторить, отменить.
Перед тем как нажать завершение сеансов, посмотрите на список в окне: если там бухгалтер с открытым документом, сначала позвоните ему. Если кластер защищён паролем администратора, удобнее завершать сеансы из консоли кластера.
Вручную флажок ставят, когда нужно «застолбить» базу заранее. Например, перед серией операций: выгрузка .dt, обновление, тестирование. Пока флажок стоит, никто другой не войдёт ни в пользовательский режим, ни в конфигуратор.
Динамическое и фоновое обновление
Если изменения не требуют реструктуризации, конфигуратор может предложить динамическое обновление без монопольного режима. Для обновления типовой конфигурации на новый релиз динамическое обновление не используйте — сеансы останутся на старой версии метаданных, а обработчики обновления отработают некорректно.
В клиент-серверном варианте современные версии платформы умеют обновлять конфигурацию базы данных в фоне. Основная работа идёт при работающих пользователях, а монопольный доступ нужен только на короткий финальный шаг принятия изменений.
Консоль администрирования серверов 1С: блокировка и завершение сеансов
Для серверной базы самый наглядный способ — консоль кластера (оснастка MMC).
Блокировка входа
- Раскройте
Central 1C:Enterprise Servers → имя сервера → Кластеры → кластер → Информационные базы. - Откройте свойства нужной базы. Консоль попросит логин и пароль пользователя информационной базы с административными правами.
- Включите «Блокировка начала сеансов включена».
- Заполните время начала и окончания, сообщение и код разрешения.
- Включите «Блокировка регламентных заданий включена».
- Сохраните.
Пункт 5 часто забывают. Тогда регламентные задания (обмены, загрузка курсов, обновление индекса поиска) порождают новые фоновые сеансы, и монопольный режим не ставится.
Завершение сеансов
- Под базой откройте узел «Сеансы».
- Отсортируйте по колонке «Приложение»: «Конфигуратор» с вашим именем не трогайте.
- Выделите остальные сеансы, в контекстном меню выберите «Удалить».
Удаление сеанса — это обрыв работы пользователя без сохранения. Делайте это после предупреждения и в согласованное окно, а не посреди закрытия месяца.
Если консоль не открывается с ошибкой регистрации, перерегистрируйте оснастку от имени администратора: regsvr32 "C:\Program Files\1cv8\<версия>\bin\radmin.dll". Разрядность radmin.dll должна совпадать с разрядностью MMC, а версия — с версией сервера.
Скрипт на rac: монопольный режим из командной строки
Утилита rac работает через сервер администрирования ras (порт по умолчанию 1545). Если ras не запущен как служба, запустите его на сервере кластера:
"C:\Program Files\1cv8\<версия>\bin\ras.exe" cluster --port=1545 localhost:1540
Базовые команды:
| Команда | Что делает |
|---|---|
rac cluster list | UUID кластера |
rac infobase summary list --cluster=<uuid> | UUID и имена баз |
rac session list --cluster=<uuid> --infobase=<uuid> | сеансы базы |
rac session terminate --cluster=<uuid> --session=<uuid> | завершить сеанс |
rac infobase update ... --sessions-deny=on | включить блокировку входа |
Если на кластере задан администратор, добавляйте к каждой команде --cluster-user и --cluster-pwd. Остальные параметры смотрите в rac help и rac help session.
Готовый bat для ночного обновления
@echo off
chcp 65001 >nul
set RAC="C:\Program Files\1cv8\<версия>\bin\rac.exe"
set V8="C:\Program Files\1cv8\<версия>\bin\1cv8.exe"
set IB=uuid-базы-из-infobase-summary-list
set IBUSER=Администратор
set IBPWD=пароль
set CODE=obnovlenie
for /f "tokens=2 delims=: " %%i in ('%RAC% cluster list ^| findstr /b "cluster"') do set CL=%%i
rem 1. Запрет входа и регламентных заданий
%RAC% infobase update --cluster=%CL% --infobase=%IB% --infobase-user=%IBUSER% --infobase-pwd=%IBPWD% --sessions-deny=on --scheduled-jobs-deny=on --denied-message="Обновление базы" --permission-code=%CODE%
rem 2. Завершение всех сеансов базы
for /f "tokens=2 delims=: " %%s in ('%RAC% session list --cluster=%CL% --infobase=%IB% ^| findstr /b "session "') do %RAC% session terminate --cluster=%CL% --session=%%s
rem 3. Обновление конфигурации БД в пакетном режиме
%V8% DESIGNER /S"srv1c\buh" /N"%IBUSER%" /P"%IBPWD%" /UC"%CODE%" /UpdateDBCfg /Out"C:\Logs\update.log"
rem 4. Снятие блокировки
%RAC% infobase update --cluster=%CL% --infobase=%IB% --infobase-user=%IBUSER% --infobase-pwd=%IBPWD% --sessions-deny=off --scheduled-jobs-deny=off
Пояснения к скрипту:
- 🔑
/UCпропускает конфигуратор сквозь блокировку, которую поставил шаг 1; - 🧾 лог
/Outпоказывает, удалось ли установить монопольный режим и прошла ли реструктуризация; - 🖥️ скрипт рассчитан на один кластер; при нескольких кластерах подставьте UUID вручную;
- 🔐 пароли в bat-файле храните на сервере с ограниченным доступом, а не в общей папке.
Перед шагом 3 добавьте выгрузку .dt или резервную копию СУБД, если обновление не тестировали на копии.
Как завершить сеансы программно из кода 1С
Встроенный язык даёт два инструмента: установить монопольный режим для своего сеанса и посмотреть, кто мешает. Завершать чужие сеансы платформа из кода напрямую не умеет — для этого нужен COM-доступ к агенту кластера.
Установка режима и список мешающих
Попытка
УстановитьМонопольныйРежим(Истина);
Исключение
Текст = "Не удалось установить монопольный режим. В базе работают:";
Для Каждого Сеанс Из ПолучитьСеансыИнформационнойБазы() Цикл
Если Сеанс.НомерСеанса = НомерСеансаИнформационнойБазы() Тогда
Продолжить;
КонецЕсли;
Текст = Текст + Символы.ПС + Сеанс.ИмяПриложения + ", "
+ Сеанс.ИмяКомпьютера + ", сеанс " + Формат(Сеанс.НомерСеанса, "ЧГ=0");
КонецЦикла;
ВызватьИсключение Текст;
КонецПопытки;
Попытка
// операции, которым нужен монопольный доступ
УстановитьМонопольныйРежим(Ложь);
Исключение
УстановитьМонопольныйРежим(Ложь);
ВызватьИсключение;
КонецПопытки;
Проверить текущее состояние можно функцией МонопольныйРежим() — она возвращает Истина или Ложь. Для вызова нужны административные права.
Завершение сеансов через COM-соединение с агентом
Код выполняется на компьютере, где зарегистрирована библиотека comcntr.dll той же версии, что и сервер (regsvr32 comcntr.dll от имени администратора).
Коннектор = Новый COMОбъект("V83.COMConnector");
Агент = Коннектор.ConnectAgent("tcp://srv1c:1540");
Для Каждого Кластер Из Агент.GetClusters() Цикл
Агент.Authenticate(Кластер, "", ""); // администратор кластера, если задан
Для Каждого Сеанс Из Агент.GetSessions(Кластер) Цикл
Если ВРег(Сеанс.infoBase.Name) <> "BUH" Тогда
Продолжить;
КонецЕсли;
Если Сеанс.SessionID = НомерСеансаИнформационнойБазы() Тогда
Продолжить; // свой сеанс не трогаем
КонецЕсли;
Агент.TerminateSession(Кластер, Сеанс);
КонецЦикла;
КонецЦикла;
Имя базы в кластере (BUH) замените на своё. Сначала включите блокировку начала сеансов, иначе пользователи переподключатся раньше, чем вы установите монопольный режим.
Монопольный режим не устанавливается: зависшие сеансы и что с ними делать
Чаще всего режим не ставится не из-за людей, а из-за подключений, о которых забыли.
Если ничего не помогло
- Убедитесь, что вы сами не открыли вторую копию 1С с той же базой — у себя в соседнем окне или на терминальном сервере.
- Проверьте, не запущен ли конфигуратор у другого разработчика: его сеанс тоже мешает.
- В клиент-серверной базе перезапустите службу «Агент сервера 1С:Предприятия».
Перезапуск службы агента обрывает работу всех баз этого кластера, а не одной. Согласуйте окно и предупредите пользователей соседних баз.
После перезапуска сразу включите блокировку начала сеансов, иначе база снова наполнится подключениями.