Проблема «зависших» сеансов актуальна для многих организаций. Пользователи часто забывают закрывать программу в конце рабочего дня или уходят на длительные перерывы, оставляя 1С открытой. Это приводит к нерациональному расходу лицензий и излишней нагрузке на ресурсы сервера. Рассмотрим основные способы, как можно автоматически «выгонять» пользователя, если он перестал проявлять активность в системе.
В современных типовых конфигурациях (таких как Бухгалтерия предприятия 3.0, Управление торговлей 11 или ERP) уже реализован готовый функционал для контроля бездействия. Это наиболее безопасный и рекомендуемый способ, так как он корректно завершает работу приложения на уровне программного кода. Проанализируем, как это работает:
Система будет автоматически отслеживать отсутствие обращений к серверу 1С и интерактивных действий. Перед завершением программа выдаст предупреждение пользователю. Если реакция не последует, работа будет завершена с сохранением базовых настроек окон.
Важно различать «активный» и «спящий» сеансы. Сеанс переходит в статус Спящий только в том случае, если физическая связь между клиентом и сервером была разорвана (например, при переходе компьютера в режим сна или обрыве Wi-Fi), но сервер еще хранит данные о сеансе. Разберем, как настроить время жизни таких сеансов:
Стоит учитывать, что если пользователь просто не трогает мышь, но 1С открыта и связь с сервером стабильна, такой сеанс считается Активным, и данная настройка на него не подействует.
Существует возможность настроить платформу на автоматическое закрытие через конфигурационный файл conf.cfg, расположенный в папке bin/conf установленной платформы. Рассмотрим этот метод. В файл можно добавить параметр InactivityTimeout, который определяет время бездействия в секундах, после которого клиентское приложение должно закрыться.
Пример записи в файле:
InactivityTimeout=3600
Эта настройка является глобальной для рабочего места и будет действовать на все базы, запускаемые на данном компьютере.
Если нам необходимо жестко контролировать активность пользователя на уровне операционной системы, можно воспользоваться скриптом, который проверяет время последнего ввода данных (движение мыши или нажатие клавиш). Проанализируем пример скрипта, который можно адаптировать для завершения процесса 1cv8.exe или 1cv8c.exe:
Add-Type @'
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace PInvoke.Win32 {
public static class UserInput {
[DllImport("user32.dll", SetLastError=false)]
private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);
[StructLayout(LayoutKind.Sequential)]
private struct LASTINPUTINFO {
public uint cbSize;
public int dwTime;
}
public static DateTime LastInput {
get {
DateTime bootTime = DateTime.UtcNow.AddMilliseconds(-Environment.TickCount);
DateTime lastInput = bootTime.AddMilliseconds(LastInputTicks);
return lastInput;
}
}
public static TimeSpan IdleTime {
get {
return DateTime.UtcNow.Subtract(LastInput);
}
}
public static int LastInputTicks {
get {
LASTINPUTINFO lii = new LASTINPUTINFO();
lii.cbSize = (uint)Marshal.SizeOf(typeof(LASTINPUTINFO));
GetLastInputInfo(ref lii);
return lii.dwTime;
}
}
}
}
'@
# Если пользователь бездействует более 30 минут
if ([PInvoke.Win32.UserInput]::IdleTime.TotalMinutes -ge 30) {
# Завершаем процессы 1С
Get-Process | Where-Object {$_.Name -like "1cv8*"} | Stop-Process -Force
}
Такой скрипт можно поместить в Планировщик задач Windows и настроить его выполнение каждые 10-15 минут. Это гарантированно освободит лицензии, однако стоит помнить, что принудительное завершение процесса может привести к потере несохраненных данных пользователя.
Для компаний, работающих в терминальном режиме, наиболее эффективным решением будет настройка групповых политик (GPO) сервера. Выясним, какие параметры за это отвечают:
При достижении лимита операционная система сама закроет все приложения пользователя и выполнит выход из системы (Logoff), что автоматически освободит все занятые лицензии 1С.
Если вы используете конфигурацию, в которой нет БСП, можно реализовать проверку самостоятельно. Посмотрим на алгоритм:
ПодключитьОбработчикОжидания.ВремяПоследнейАктивности.ТекущаяДата() с переменной ВремяПоследнейАктивности.ЗавершитьРаботуСистемы(Ложь).Важное замечание: Принудительное выдворение пользователей, особенно таких как главный бухгалтер, может вызвать негативную реакцию. Рекомендуется всегда предварительно уведомлять сотрудников о вводе подобных ограничений и учитывать, что во время выполнения длительных отчетов или обработок активность пользователя может быть нулевой, хотя программа выполняет важную работу.