Сеансы 1С:Предприятия 8.3: как они устроены, где их смотреть и как завершать
Содержание
Сеанс в 1С — это один «экземпляр работы» с информационной базой: открытый тонкий клиент бухгалтера, запущенный Конфигуратор, фоновое задание или внешнее COM-подключение. У каждого сеанса свой номер, пользователь, приложение и время начала. В клиент-серверном варианте сеансы видны в консоли Администрирование серверов 1С Предприятия, там же их завершают. В файловой базе — только в списке активных пользователей.
Управлять сеансами можно тремя способами. Консоль кластера подходит для разовых действий. Утилита rac нужна для скриптов и ночных регламентов. Обработка «Блокировка работы пользователей» в типовой конфигурации удобна бухгалтеру без доступа к серверу. Всё ниже относится к платформе 8.3 и одинаково для БП, ЗУП и УТ: сеансы — механизм платформы, а не конфигурации.
Как устроены сеанс и соединение в 1С
Сеанс и соединение путают чаще всего. Это разные сущности, и в консоли они лежат в разных ветках.
- 🔌 Соединение — сетевой канал между клиентским приложением и рабочим процессом сервера (
rphost). Это транспорт. - 👤 Сеанс — логическая работа пользователя с базой. Он хранит пользователя, параметры сеанса, временные хранилища, состояние управляемых блокировок.
Сеанс может пережить своё соединение. Пропал Wi-Fi на ноутбуке — соединение разорвалось, а сеанс остался на сервере и ждёт. Если клиент вернётся вовремя, работа продолжится с того же места.
Путь клиента к сеансу в клиент-серверном варианте:
- Клиент обращается к агенту сервера (
ragent, порт 1540). - Агент направляет его к менеджеру кластера (
rmngr, порт 1541). - Менеджер назначает рабочий процесс. Порт берётся из диапазона, который задан в свойствах рабочего сервера (по умолчанию 1560–1591).
- В рабочем процессе создаётся соединение, а в кластере регистрируется сеанс с номером.
Номер сеанса уникален в пределах базы, пока сеанс жив. Его видно в консоли и можно получить из кода функцией НомерСеансаИнформационнойБазы().
Спящий сеанс
Если клиент перестал выходить на связь, сеанс переходит в состояние «спящий». Двумя параметрами в свойствах информационной базы в консоли управляют поведением:
| Параметр | Что задаёт |
|---|---|
| Время засыпания пассивного сеанса | Через сколько секунд бездействия сеанс без соединения уходит в сон |
| Время завершения спящего сеанса | Сколько секунд спящий сеанс живёт, прежде чем кластер его удалит |
Спящий сеанс продолжает занимать лицензию. Поэтому «Время завершения спящего сеанса» не стоит ставить слишком большим, если лицензий впритык.
Какие бывают сеансы: приложения в списке
В колонке «Приложение» консоли (в выводе rac — поле app-id) видно, кто открыл сеанс. Основные значения:
app-id | Что это | Кто обычно открывает |
|---|---|---|
1CV8C | Тонкий клиент | Бухгалтеры, кадровики, менеджеры |
1CV8 | Толстый клиент | Старые обработки, отладка |
WebClient | Веб-клиент через браузер | Удалённые сотрудники |
Designer | Конфигуратор | Программист, администратор |
BackgroundJob | Фоновое задание | Регламентные задания, длительные операции |
COMConnection | Внешнее COM-соединение | Обмены, внешние программы |
WSConnection | Вызов веб-сервиса | Интеграции, мобильные приложения |
HTTPServiceConnection | Вызов HTTP-сервиса | REST-интеграции |
Отсюда практический вывод. Перед закрытием базы на обслуживание мало выгнать бухгалтеров. Фоновые задания и COM-обмены откроют новые сеансы через минуту, если их не запретить.
Из кода конфигурации человекочитаемое название приложения даёт функция ПредставлениеПриложения(). Ей передают строку вроде "1CV8C" и получают «Тонкий клиент».
Управление сеансами в консоли кластера
Консоль ставится вместе с сервером 1С. В меню «Пуск» она называется Администрирование серверов 1С Предприятия.
Где найти список сеансов
- Раскройте дерево: центральный сервер →
Кластеры→ нужный кластер →Информационные базы→ ваша база. - Откройте ветку
Сеансы. Справа появится таблица с номером, пользователем, компьютером, приложением и временем начала. - Рядом лежат ветки
СоединенияиБлокировки. Их смотрят при разборе зависаний.
Если в кластере назначены администраторы, консоль спросит логин и пароль кластера. Это не пользователь базы.
Как завершить сеанс
- Выделите строку в таблице сеансов. Можно выделить несколько с Ctrl.
- Вызовите контекстное меню и выберите «Удалить».
- Подтвердите действие.
Удаление сеанса обрывает работу пользователя. Несохранённый документ пропадёт, у пользователя появится сообщение о разрыве. Перед массовым удалением предупредите людей и выберите время, когда в базе никто не проводит документы.
Если консоль не открывается
Самая частая причина после обновления платформы — не зарегистрирована библиотека администрирования для новой версии. Консоль выдаёт ошибку создания объекта или открывается пустой. Лечится перерегистрацией от имени администратора:
regsvr32 "C:\Program Files\1cv8\<номер версии>\bin\radmin.dll"
Версия в пути должна совпадать с версией работающего сервера. Если на машине стоит несколько платформ, регистрируйте ту, что совпадает с сервером, иначе консоль не подключится к кластеру.
Блокировка начала новых сеансов
Удалять сеансы бессмысленно, если люди тут же входят снова. В свойствах информационной базы в консоли есть блок блокировки:
- ✅ флажок «Блокировка начала сеансов включена»;
- 🕐 поля начала и окончания блокировки;
- 💬 сообщение, которое увидит пользователь при входе;
- 🔑 код разрешения — с ним администратор войдёт в заблокированную базу;
- ⛔ отдельный флажок блокировки регламентных заданий.
С кодом разрешения базу открывают параметром запуска /UC<код>. Например, при коде 1234 в строку запуска добавляют /UC1234.
Таблица сеансов как инструмент диагностики
Список сеансов — это не только «кто сидит в базе». Его колонки помогают найти, кто держит блокировку и кто грузит сервер. Набор видимых колонок меняется через настройку списка в консоли.
Что смотреть, когда база «встала»
| Колонка в консоли | Поле rac | Что показывает |
|---|---|---|
| Заблокировано СУБД | blocked-by-dbms | Номер сеанса, который держит блокировку на уровне СУБД |
| Заблокировано упр. | blocked-by-ls | Номер сеанса, который держит управляемую блокировку |
| Время вызова (текущее) | duration-current | Сколько длится текущий серверный вызов |
| Память (текущая) | memory-current | Сколько памяти занял текущий вызов |
Порядок поиска «виновника» ожидания:
- Отсортируйте сеансы по колонке блокировки. У ждущих сеансов там стоит число — номер того, кто мешает.
- Найдите сеанс с этим номером. Посмотрите пользователя, приложение и длительность вызова.
- Если это фоновое задание, проверьте, какое регламентное задание запущено, прежде чем его прерывать.
- Если это живой пользователь, свяжитесь с ним. Часто он проводит большой документ или формирует тяжёлый отчёт.
- Удаляйте сеанс только когда ждать дальше нельзя. Транзакция откатится, данные останутся целыми.
Признаки «зависшего» сеанса
- 🔁 последняя активность была часы назад, а сеанс не спящий;
- ⏳ время текущего вызова растёт и не сбрасывается;
- 💤 спящий сеанс того же пользователя висит рядом с новым активным — человек переподключился, а старый сеанс ещё не истёк;
- 🖥 сеанс на компьютере, который давно выключен.
Последний случай типичен после обрыва 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
}
}
Порядок ночного регламента, чтобы сеансы не вернулись:
- Включить блокировку начала сеансов и регламентных заданий в свойствах базы.
- Подождать несколько минут, пока фоновые задания завершатся сами.
- Запустить скрипт завершения сеансов.
- Выполнить обновление или выгрузку.
- Снять блокировку.
Скрипт запускайте из планировщика Windows под учётной записью, у которой есть доступ к каталогу платформы. Пароль администратора кластера лучше держать не в тексте скрипта, а в защищённом хранилище учётных данных.
Без доступа к серверу: средствами конфигурации
В БП 3.0, ЗУП 3.1 и УТ 11 есть встроенная обработка блокировки работы пользователей. Она находится в разделе Администрирование, в группе обслуживания. Обработка ставит ту же блокировку начала сеансов, показывает пользователям предупреждение и через заданное время завершает их сеансы. Нужны права администратора базы. Если в кластере заданы администраторы, обработка спросит их логин и пароль.
Посмотреть сеансы из самой конфигурации можно через список активных пользователей. Он есть в том же разделе Администрирование, а в Конфигураторе — в меню Администрирование → Активные пользователи.
Получить список сеансов из кода
Для своей обработки или проверки в регламентном задании. Код выполняется на сервере и требует административных прав:
&НаСервере
Процедура ПоказатьСеансыНаСервере()
Сеансы = ПолучитьСеансыИнформационнойБазы();
Для Каждого Сеанс Из Сеансы Цикл
Если Сеанс.Пользователь = Неопределено Тогда
ИмяПользователя = "<без пользователя>";
Иначе
ИмяПользователя = Сеанс.Пользователь.Имя;
КонецЕсли;
Сообщить(СтрШаблон("%1 | %2 | %3 | %4 | %5",
Сеанс.НомерСеанса,
ИмяПользователя,
ПредставлениеПриложения(Сеанс.ИмяПриложения),
Сеанс.ИмяКомпьютера,
Сеанс.НачалоСеанса));
КонецЦикла;
КонецПроцедуры
Завершать чужие сеансы из встроенного языка напрямую нельзя: для этого используют интерфейс администрирования кластера, как делает типовая обработка блокировки.
Сеансы в файловой базе
В файловом варианте нет кластера, консоли и rac. Каждый пользователь открывает файл базы 1Cv8.1CD напрямую, а список сеансов виден только изнутри: через активных пользователей в конфигурации или в Конфигураторе.
Завершить чужой сеанс в файловой базе можно только через механизм блокировки в конфигурации или закрыв программу на компьютере пользователя. Если пользователь «вылетел», а база считает его подключённым, обычно помогает дождаться, пока все выйдут, и открыть базу снова.
Не удаляйте файл 1Cv8.1CL в каталоге базы, пока хоть кто-то в ней работает. Это служебный файл блокировки: удаление при открытых сеансах грозит повреждением данных. Удалять его допустимо только когда все пользователи точно вышли, а программа всё равно сообщает о занятой базе.