Сеансы 1С:Предприятия 8.3: как они устроены, где их смотреть и как завершать

· 10 мин

Содержание

Сеанс в 1С — это один «экземпляр работы» с информационной базой: открытый тонкий клиент бухгалтера, запущенный Конфигуратор, фоновое задание или внешнее COM-подключение. У каждого сеанса свой номер, пользователь, приложение и время начала. В клиент-серверном варианте сеансы видны в консоли Администрирование серверов 1С Предприятия, там же их завершают. В файловой базе — только в списке активных пользователей.

Управлять сеансами можно тремя способами. Консоль кластера подходит для разовых действий. Утилита rac нужна для скриптов и ночных регламентов. Обработка «Блокировка работы пользователей» в типовой конфигурации удобна бухгалтеру без доступа к серверу. Всё ниже относится к платформе 8.3 и одинаково для БП, ЗУП и УТ: сеансы — механизм платформы, а не конфигурации.

Как устроены сеанс и соединение в 1С

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

  • 🔌 Соединение — сетевой канал между клиентским приложением и рабочим процессом сервера (rphost). Это транспорт.
  • 👤 Сеанс — логическая работа пользователя с базой. Он хранит пользователя, параметры сеанса, временные хранилища, состояние управляемых блокировок.

Сеанс может пережить своё соединение. Пропал Wi-Fi на ноутбуке — соединение разорвалось, а сеанс остался на сервере и ждёт. Если клиент вернётся вовремя, работа продолжится с того же места.

Путь клиента к сеансу в клиент-серверном варианте:

  1. Клиент обращается к агенту сервера (ragent, порт 1540).
  2. Агент направляет его к менеджеру кластера (rmngr, порт 1541).
  3. Менеджер назначает рабочий процесс. Порт берётся из диапазона, который задан в свойствах рабочего сервера (по умолчанию 1560–1591).
  4. В рабочем процессе создаётся соединение, а в кластере регистрируется сеанс с номером.

Номер сеанса уникален в пределах базы, пока сеанс жив. Его видно в консоли и можно получить из кода функцией НомерСеансаИнформационнойБазы().

Спящий сеанс

Если клиент перестал выходить на связь, сеанс переходит в состояние «спящий». Двумя параметрами в свойствах информационной базы в консоли управляют поведением:

ПараметрЧто задаёт
Время засыпания пассивного сеансаЧерез сколько секунд бездействия сеанс без соединения уходит в сон
Время завершения спящего сеансаСколько секунд спящий сеанс живёт, прежде чем кластер его удалит

Спящий сеанс продолжает занимать лицензию. Поэтому «Время завершения спящего сеанса» не стоит ставить слишком большим, если лицензий впритык.

Какие бывают сеансы: приложения в списке

В колонке «Приложение» консоли (в выводе rac — поле app-id) видно, кто открыл сеанс. Основные значения:

app-idЧто этоКто обычно открывает
1CV8CТонкий клиентБухгалтеры, кадровики, менеджеры
1CV8Толстый клиентСтарые обработки, отладка
WebClientВеб-клиент через браузерУдалённые сотрудники
DesignerКонфигураторПрограммист, администратор
BackgroundJobФоновое заданиеРегламентные задания, длительные операции
COMConnectionВнешнее COM-соединениеОбмены, внешние программы
WSConnectionВызов веб-сервисаИнтеграции, мобильные приложения
HTTPServiceConnectionВызов HTTP-сервисаREST-интеграции

Отсюда практический вывод. Перед закрытием базы на обслуживание мало выгнать бухгалтеров. Фоновые задания и COM-обмены откроют новые сеансы через минуту, если их не запретить.

Из кода конфигурации человекочитаемое название приложения даёт функция ПредставлениеПриложения(). Ей передают строку вроде "1CV8C" и получают «Тонкий клиент».

Управление сеансами в консоли кластера

Консоль ставится вместе с сервером 1С. В меню «Пуск» она называется Администрирование серверов 1С Предприятия.

Где найти список сеансов

  1. Раскройте дерево: центральный сервер → Кластеры → нужный кластер → Информационные базы → ваша база.
  2. Откройте ветку Сеансы. Справа появится таблица с номером, пользователем, компьютером, приложением и временем начала.
  3. Рядом лежат ветки Соединения и Блокировки. Их смотрят при разборе зависаний.

Если в кластере назначены администраторы, консоль спросит логин и пароль кластера. Это не пользователь базы.

Как завершить сеанс

  1. Выделите строку в таблице сеансов. Можно выделить несколько с Ctrl.
  2. Вызовите контекстное меню и выберите «Удалить».
  3. Подтвердите действие.

Удаление сеанса обрывает работу пользователя. Несохранённый документ пропадёт, у пользователя появится сообщение о разрыве. Перед массовым удалением предупредите людей и выберите время, когда в базе никто не проводит документы.

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

Самая частая причина после обновления платформы — не зарегистрирована библиотека администрирования для новой версии. Консоль выдаёт ошибку создания объекта или открывается пустой. Лечится перерегистрацией от имени администратора:

regsvr32 "C:\Program Files\1cv8\<номер версии>\bin\radmin.dll"

Версия в пути должна совпадать с версией работающего сервера. Если на машине стоит несколько платформ, регистрируйте ту, что совпадает с сервером, иначе консоль не подключится к кластеру.

Блокировка начала новых сеансов

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

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

С кодом разрешения базу открывают параметром запуска /UC<код>. Например, при коде 1234 в строку запуска добавляют /UC1234.

Таблица сеансов как инструмент диагностики

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

Что смотреть, когда база «встала»

Колонка в консолиПоле racЧто показывает
Заблокировано СУБДblocked-by-dbmsНомер сеанса, который держит блокировку на уровне СУБД
Заблокировано упр.blocked-by-lsНомер сеанса, который держит управляемую блокировку
Время вызова (текущее)duration-currentСколько длится текущий серверный вызов
Память (текущая)memory-currentСколько памяти занял текущий вызов

Порядок поиска «виновника» ожидания:

  1. Отсортируйте сеансы по колонке блокировки. У ждущих сеансов там стоит число — номер того, кто мешает.
  2. Найдите сеанс с этим номером. Посмотрите пользователя, приложение и длительность вызова.
  3. Если это фоновое задание, проверьте, какое регламентное задание запущено, прежде чем его прерывать.
  4. Если это живой пользователь, свяжитесь с ним. Часто он проводит большой документ или формирует тяжёлый отчёт.
  5. Удаляйте сеанс только когда ждать дальше нельзя. Транзакция откатится, данные останутся целыми.

Признаки «зависшего» сеанса

  • 🔁 последняя активность была часы назад, а сеанс не спящий;
  • ⏳ время текущего вызова растёт и не сбрасывается;
  • 💤 спящий сеанс того же пользователя висит рядом с новым активным — человек переподключился, а старый сеанс ещё не истёк;
  • 🖥 сеанс на компьютере, который давно выключен.

Последний случай типичен после обрыва RDP-сессии на терминальном сервере. Пользователь входит снова и получает новый сеанс, а старый ещё держит лицензию.

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

Сеансы и лицензии 1С

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

Узнать, какой сеанс какую лицензию держит, проще всего утилитой rac:

rac session --cluster=<id кластера> list --licenses

В выводе для каждого сеанса видно, откуда получена лицензия: программная на сервере, ключ HASP или локальная лицензия клиента. Эта же информация есть в консоли, если открыть свойства сеанса.

Что из этого следует на практике:

  • 📉 спящие сеансы «съедают» лицензии — пользователь видит отказ, хотя в базе работает меньше людей, чем куплено мест;
  • 🖥 один сотрудник с двумя открытыми окнами клиента на разных компьютерах занимает две лицензии;
  • 🔄 после обрыва связи на терминальном сервере старый сеанс держит место до своего истечения.

Без доступной лицензии платформа не запустит клиентский сеанс — пользователь получит сообщение об отсутствии лицензии. Освобождают места завершением лишних сеансов, а не перезапуском сервера.

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

Автоматический контроль и завершение сеансов

Ручная очистка через консоль годится раз в неделю. Для ночного обновления или регулярной проверки нужен скрипт.

Подготовка: сервер администрирования

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

ras cluster --daemon

Если ras и rac на одной машине с кластером, адрес указывать не нужно. Для удалённого сервера в конце команды rac добавляют <имя сервера>:1545.

Основные команды

rem список кластеров - берём id кластера
rac cluster list

rem список баз кластера - берём id базы
rac infobase --cluster=<id кластера> summary list

rem сеансы конкретной базы
rac session --cluster=<id кластера> list --infobase=<id базы>

rem завершить один сеанс
rac session --cluster=<id кластера> terminate --session=<id сеанса>

Если в кластере есть администратор, к каждой команде добавьте --cluster-user=<логин> --cluster-pwd=<пароль>. Полный список параметров покажет rac help session.

Скрипт: завершить все клиентские сеансы базы

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

$rac    = "C:\Program Files\1cv8\<номер версии>\bin\rac.exe"
$ibName = "buh"

# id первого кластера
$cluster = ((& $rac cluster list | Select-String '^cluster\s*:') |
    Select-Object -First 1).ToString().Split(':')[1].Trim()

# id базы по имени
$ibId = $null; $curId = $null
foreach ($line in (& $rac infobase --cluster=$cluster summary list)) {
    if ($line -match '^infobase\s*:\s*(\S+)') { $curId = $Matches[1] }
    if ($line -match '^name\s*:\s*(\S+)' -and $Matches[1] -eq $ibName) { $ibId = $curId }
}

# сеансы клиентских приложений
$sessId = $null
foreach ($line in (& $rac session --cluster=$cluster list --infobase=$ibId)) {
    if ($line -match '^session\s*:\s*(\S+)') { $sessId = $Matches[1] }
    if ($line -match '^app-id\s*:\s*(1CV8C|1CV8|WebClient)\s*$') {
        & $rac session --cluster=$cluster terminate --session=$sessId
    }
}

Порядок ночного регламента, чтобы сеансы не вернулись:

  1. Включить блокировку начала сеансов и регламентных заданий в свойствах базы.
  2. Подождать несколько минут, пока фоновые задания завершатся сами.
  3. Запустить скрипт завершения сеансов.
  4. Выполнить обновление или выгрузку.
  5. Снять блокировку.

Скрипт запускайте из планировщика Windows под учётной записью, у которой есть доступ к каталогу платформы. Пароль администратора кластера лучше держать не в тексте скрипта, а в защищённом хранилище учётных данных.

Без доступа к серверу: средствами конфигурации

В БП 3.0, ЗУП 3.1 и УТ 11 есть встроенная обработка блокировки работы пользователей. Она находится в разделе Администрирование, в группе обслуживания. Обработка ставит ту же блокировку начала сеансов, показывает пользователям предупреждение и через заданное время завершает их сеансы. Нужны права администратора базы. Если в кластере заданы администраторы, обработка спросит их логин и пароль.

Посмотреть сеансы из самой конфигурации можно через список активных пользователей. Он есть в том же разделе Администрирование, а в Конфигураторе — в меню Администрирование → Активные пользователи.

Получить список сеансов из кода

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

&НаСервере
Процедура ПоказатьСеансыНаСервере()
    Сеансы = ПолучитьСеансыИнформационнойБазы();
    Для Каждого Сеанс Из Сеансы Цикл
        Если Сеанс.Пользователь = Неопределено Тогда
            ИмяПользователя = "<без пользователя>";
        Иначе
            ИмяПользователя = Сеанс.Пользователь.Имя;
        КонецЕсли;
        Сообщить(СтрШаблон("%1 | %2 | %3 | %4 | %5",
            Сеанс.НомерСеанса,
            ИмяПользователя,
            ПредставлениеПриложения(Сеанс.ИмяПриложения),
            Сеанс.ИмяКомпьютера,
            Сеанс.НачалоСеанса));
    КонецЦикла;
КонецПроцедуры

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

Сеансы в файловой базе

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

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

Не удаляйте файл 1Cv8.1CL в каталоге базы, пока хоть кто-то в ней работает. Это служебный файл блокировки: удаление при открытых сеансах грозит повреждением данных. Удалять его допустимо только когда все пользователи точно вышли, а программа всё равно сообщает о занятой базе.

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

Сколько сеансов может быть у одного пользователя?
Платформа не ограничивает число сеансов на пользователя. Ограничение задаётся в конфигурации или лицензиями: каждое окно клиента — отдельный сеанс и, как правило, отдельная лицензия.
Почему в списке сеансов есть сеансы без пользователя?
Так выглядят фоновые задания, запущенные без указания пользователя, и подключения к базе, в которой пользователи не заведены. Определить источник помогает колонка «Приложение».
Теряются ли данные при удалении сеанса в консоли?
Проведённые и записанные документы сохраняются. Незавершённая транзакция откатывается, а то, что пользователь набрал и не записал, пропадает.
Чем удаление сеанса отличается от удаления соединения?
Удаление соединения рвёт только канал связи — сеанс может уйти в спящее состояние и дождаться клиента. Удаление сеанса завершает работу пользователя полностью.
Как узнать, что делал конкретный сеанс?
Откройте журнал регистрации и отберите записи по номеру сеанса — он есть среди полей отбора. Номер берите из списка сеансов, пока сеанс жив.