Как выгнать пользователей из базы 1С перед обновлением и не потерять данные

· 9 мин

Содержание

Закрыть окно 1С мало: сеанс может остаться висеть на сервере ещё на несколько минут, а то и надолго. Из-за него не проходит обновление конфигурации , не запускается реструктуризация и не освобождается лицензия. Завершить сеансы в 1С 8.3 можно тремя способами: попросить пользователей выйти через встроенные «Активные пользователи», удалить сеанс в консоли кластера серверов или завершить его командой rac.

Ниже порядок от самого мягкого к самому жёсткому. Сначала всегда предупреждаем людей, потом блокируем вход, и только потом удаляем то, что осталось.

Сначала разберитесь, что именно висит

Сеансом считается каждое подключение к базе: пользователь в тонком или толстом клиенте, веб-клиент, Конфигуратор, COM-соединение, фоновое или регламентное задание. Конфигуратор, открытый кем-то «на минутку» неделю назад, - самый частый виновник сорванного обновления.

Откройте список и посмотрите три вещи:

  • 👤 Приложение. Тонкий клиент, толстый, Конфигуратор, фоновое задание. Фоновые задания трогать не нужно, пока не заблокированы регламентные задания (об этом ниже).
  • 💻 Компьютер. По имени узла понятно, кому звонить или к кому идти.
  • ⏱ Время начала и последняя активность. Сеанс, который начался вчера и молчит три часа, скорее всего брошен.

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

Список активных пользователей и мягкое завершение

Самый безопасный путь не требует прав администратора кластера. В конфигурациях на БСП (Бухгалтерия, ЗУП, УТ и другие) список открывается из раздела Администрирование → Поддержка и обслуживание: ищите пункт «Активные пользователи». В Конфигураторе тот же список есть в меню Администрирование → Активные пользователи.

Что делать:

  1. Откройте список и отсортируйте по времени начала.
  2. Позвоните тем, кто числится в базе, и попросите выйти.
  3. Найдите свой собственный сеанс. Его закрывать последним.
  4. Если базу нужно закрыть для работы на время, используйте блокировку входа (следующий раздел).

Для файловой базы это практически единственный штатный способ. Кнопки «убить сеанс на сервере» у файловой базы нет, потому что нет и сервера. Если сотрудник ушёл домой, а компьютер завис, завершить программу нужно на самой машине: диспетчер задач или команда taskkill /IM 1cv8.exe /F на нужном компьютере.

Для очистки «зомби» в файловом варианте смотрите, не осталось ли процессов 1cv8.exe и 1cv8c.exe на терминальном сервере. Часто пользователь «вышел», а его сеанс на терминале жив.

Блокировка входа: как остановить новые подключения

Пока вы завершаете старые сеансы, пользователи подключаются заново. Чтобы этого не было, включите блокировку.

В БСП есть форма блокировки работы пользователей. Задаются:

  • время начала и окончания блокировки, например с 22:00 до 23:30;
  • текст сообщения, которое увидит пользователь при попытке войти;
  • код разрешения, по которому вы сами сможете зайти в закрытую базу.

На сервере то же делается в свойствах информационной базы в консоли кластера. Там включается блокировка начала сеансов, задаются период, сообщение и параметр блокировки. Для входа в закрытую базу в строке запуска указывается ключ /UC с кодом разрешения:

"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /S "srv01\buh" /UCмойкод

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

Блокировка входа не завершает уже открытые сеансы. Она лишь не пускает новых. Оставшихся убираем следующим шагом.

Завершение сеансов через консоль кластера серверов

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

Где найти нужный сеанс

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

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

Удаление сеанса

Правой кнопкой по сеансу - команда удаления (в разных версиях консоли формулировка «Удалить» или «Завершить»). Можно выделить сразу несколько строк.

Отдельный узел «Соединения» показывает подключения к рабочим процессам. Удаление соединения жёстче, чем удаление сеанса. Начинайте с сеансов, а соединения трогайте, только если сеанс исчез, а соединение осталось.

ДействиеКогда применятьРиск
Попросить выйтиРабочее время, мало людейНет, но долго
Блокировка входаПеред обновлением, во время работНовые пользователи не войдут
Удалить сеансЧеловек не отвечает, сеанс брошенПотеря несохранённых данных
Удалить соединениеСеанс удалён, а подключение виситОшибка у пользователя в этом соединении
Завершить рабочий процессПроцесс завис целикомОбрыв всех сеансов этого процесса

Команда rac: завершить сеансы из командной строки

Если консоль неудобна или администрирование идёт по SSH и скриптам, используйте утилиту rac (клиент сервера администрирования). Она лежит в каталоге платформы рядом с ragent. Перед работой на сервере должна быть запущена служба ras; по умолчанию она слушает порт 1545.

Порядок команд:

rac cluster list
rac session list --cluster=<идентификатор_кластера>
rac session terminate --cluster=<идентификатор_кластера> --session=<идентификатор_сеанса>

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

Сеансы одной базы получите так:

rac infobase summary list --cluster=<идентификатор_кластера>
rac session list --cluster=<идентификатор_кластера> --infobase=<идентификатор_базы>

Скрипт для планировщика

Для ночного завершения всех сеансов базы пригодится простой bat-файл. Он вытаскивает идентификаторы из вывода и по очереди удаляет сеансы:

@echo off
set RAC="C:\Program Files\1cv8\8.3.XX.XXXX\bin\rac.exe"
set CL=идентификатор_кластера
set IB=идентификатор_базы
for /f "tokens=2 delims=: " %%s in ('%RAC% session list --cluster=%CL% --infobase=%IB% ^| findstr /b /c:"session "') do (
  %RAC% session terminate --cluster=%CL% --session=%%s
)

Номер версии в пути замените на свой. Запускайте скрипт после включения блокировки входа: иначе пользователи успеют зайти снова. Не запускайте его в рабочее время без предупреждения, он убирает всех подряд, включая вас.

Автоматическое завершение сеансов по расписанию

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

  1. В 21:30 в базе включается блокировка входа с понятным сообщением.
  2. В 22:00 планировщик (Windows или cron) запускает скрипт с rac.
  3. После обслуживания блокировка снимается, а регламентные задания возвращаются.

Варианты попроще и посложнее:

  • 🛠 Планировщик заданий Windows запускает bat-файл выше. Решение для небольшой организации.
  • 🛠 Свой скрипт на PowerShell или Python, который перед удалением проверяет время последней активности и пропускает тех, кто работал меньше 15 минут назад.
  • 🛠 COM-соединение V83.COMConnector: через объект агента сервера можно получить кластеры и сеансы и завершить их из кода. Работает, но требует аккуратной отладки на тестовой базе.
  • 🛠 Настройки неактивных пользователей в самой конфигурации, если она на БСП. Название и расположение настройки зависят от релиза, ищите в разделе администрирования.

Для обновления в окно обслуживания достаточно связки «блокировка входа плюс скрипт удаления сеансов». Не усложняйте её без причины.

Что у вас с сеансами?

Сеанс не завершается: рабочие процессы и зависшие вызовы

Бывает, что сеанс удаляют, а он остаётся в списке. Причина обычно одна: в этот момент выполняется длинный серверный вызов (проведение документов, закрытие месяца , тяжёлый отчёт), и платформа ждёт его завершения.

Порядок действий:

  1. Посмотрите свойства сеанса и текущий вызов. Если там идёт реальная операция, подождите.
  2. Удалите сеанс повторно через 1-2 минуты.
  3. Если не помогло, найдите рабочий процесс в узле «Рабочие процессы» кластера. Там видны его PID, занятая память и число соединений.
  4. Завершите процесс rphost.exe с этим PID.

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

Следите и за тем, чтобы уничтожаемый вами процесс не обслуживал другие базы этого кластера. Это видно в списке сеансов процесса.

Завершение на уровне СУБД: когда и зачем

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

Применяйте этот способ только если вызов виснет в самой СУБД и из консоли не снимается.

SQL Server. Найдите блокирующий запрос и его session_id:

SELECT session_id, blocking_session_id, wait_type, wait_time, status
FROM sys.dm_exec_requests
WHERE blocking_session_id <> 0;

Затем завершите конкретный session_id командой KILL <номер>. Откат убитой транзакции может занять столько же, сколько она шла.

PostgreSQL. Посмотрите активные запросы в представлении pg_stat_activity. Остановить запрос можно через pg_cancel_backend(pid), а при неудаче через pg_terminate_backend(pid).

Всегда начинайте с отмены запроса, а не с принудительного обрыва соединения. Не убивайте служебные процессы СУБД. На рабочей базе действуйте по согласованию с администратором СУБД.

Почему всё зависло: ищем виновника блокировок

Чтобы проблема не вернулась, разберитесь, что именно держало сеансы.

  • 🔒 Узел «Блокировки» в консоли кластера. Показывает, какой сеанс удерживает управляемую блокировку и кто на неё ждёт. Часто виновник один: незавершённое проведение или долгий отчёт.
  • 📋 Журнал регистрации. Фильтр по пользователю и времени покажет, какую операцию он запустил перед зависанием.
  • 🧾 Технологический журнал. Настраивается файлом logcfg.xml. Для блокировок полезны события TLOCK, TTIMEOUT и TDEADLOCK, для запросов к базе - DBMSSQL или DBPOSTGRS. Включайте на короткое время: журнал быстро растёт.
  • ⚙️ Оптимистичные и пессимистичные блокировки. Ошибка «Не удалось выполнить блокировку» с таймаутом говорит об управляемом уровне, а не об СУБД.

Типичные причины: два пользователя проводят документы по одному контрагенту, закрытие месяца запущено в рабочее время, регламентное задание пересекается с пиком нагрузки, нет обслуживания индексов и статистики СУБД.

Частые ошибки при завершении сеансов

  • ❌ Убирают сеансы без блокировки входа. Через минуту список снова полный.
  • ❌ Забывают про Конфигуратор, открытый на чьём-то компьютере. Он считается отдельным сеансом и мешает обновлению.
  • ❌ Завершают свой же сеанс первым, а потом не могут продолжить работу.
  • ❌ Убивают rphost.exe вместо удаления одного сеанса.
  • ❌ Оставляют блокировку включённой после работ. Утром пользователи видят сообщение, а код разрешения знает только администратор.
Что будет с данными, если завершить сеанс принудительно?
Всё, что пользователь успел записать, сохранится. Несохранённые изменения в открытых формах и непроведённые документы в процессе проведения пропадут.
Сколько сеансов может быть у одного пользователя?
Сколько угодно: каждый запущенный клиент, Конфигуратор и COM-соединение - отдельный сеанс. Лицензии при этом расходуются по правилам вашей лицензии, а не по числу окон.
Нужны ли права, чтобы завершать сеансы?
Для консоли кластера нужен доступ администратора кластера или информационной базы. Для списка активных пользователей в конфигурации нужна соответствующая роль администратора.
Как проверить, что в базе не осталось сеансов?
Откройте список сеансов этой базы в консоли или выполните rac session list с фильтром по базе. Пустой вывод означает, что подключений нет, но проверьте и фоновые задания.
Можно ли завершить сеанс из самой 1С?
Из конфигурации на БСП можно завершить работу пользователей через форму блокировки. Удалить произвольный серверный сеанс из кода можно только через COM-соединение с агентом сервера.