Как ограничить количество одновременно запущенных сеансов 1С для одного пользователя?

Системный администратор 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

В условиях работы на сервере терминалов часто возникает ситуация, когда пользователи злоупотребляют ресурсами системы, запуская чрезмерное количество экземпляров 1С (по 5–6 и более баз одновременно). Это приводит к дефициту оперативной памяти и перегрузке дисковой подсистемы, из-за чего формирование отчетов у других сотрудников замедляется в разы. Рассмотрим, как программно ограничить количество запущенных сеансов, чтобы обеспечить стабильную работу сервера для всех пользователей.

Решение 1: Использование скрипта-обертки (Batch-файл)

Одним из самых простых и эффективных способов является подмена стандартного ярлыка 1С на специальный командный файл (.bat или .cmd). Этот файл перед запуском основной программы будет проверять количество уже запущенных процессов 1cv8.exe или 1cv8c.exe для текущего пользователя.

Разберем логику работы такого скрипта по шагам. Нам потребуется утилита tasklist, которая позволяет фильтровать процессы по имени исполняемого файла и имени пользователя. Проанализируем пример команды:

tasklist /FI "IMAGENAME eq 1cv8.exe" /FI "USERNAME eq %username%"

В данном случае фильтр IMAGENAME указывает на процесс толстого клиента, а USERNAME автоматически подставляет имя текущего пользователя терминальной сессии. Выясним, как превратить это в полноценный ограничитель. Создадим батник, который будет подсчитывать строки в выводе команды tasklist и принимать решение о запуске.


@echo off
setlocal
set /a limit=3
set /a count=0

for /f %%i in ('tasklist /FI "IMAGENAME eq 1cv8.exe" /FI "USERNAME eq %username%" /NH') do set /a count+=1

if %count% GEQ %limit% (
    msg %username% "Превышено максимально допустимое количество запущенных баз (макс. %limit%)! Пожалуйста, закройте неиспользуемые сеансы."
    exit
) else (
    start "" "C:\Program Files\1cv8\common\1cestart.exe"
)

Важные моменты реализации:

  1. Подмена ярлыка: На рабочем столе пользователей необходимо заменить путь к 1cestart.exe на путь к вашему скрипту. Для сохранения привычного вида можно изменить иконку батника на стандартную иконку 1С.
  2. Учет разных процессов: Обратите внимание, что 1С может запускаться через 1cv8.exe (толстый клиент), 1cv8c.exe (тонкий клиент) или 1cv8s.exe (стартер). Рекомендуется проверять именно рабочие процессы (1cv8.exe и 1cv8c.exe), так как 1cv8s.exe обычно закрывается после выбора базы.
  3. Кодировка сообщений: Чтобы команда msg корректно отображала кириллицу, файл скрипта должен быть сохранен в кодировке OEM (DOS/866) или можно использовать команду chcp 1251 в начале скрипта.

Решение 2: Ограничение сеансов внутри информационной базы (1С:Предприятие)

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

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


Процедура ПриНачалеРаботыСистемы()
    ТекНомерСоединения = НомерСоединенияИнформационнойБазы();
    ТекущийПользовательУИД = ПользователиИнформационнойБазы.ТекущийПользователь.УникальныйИдентификатор;
    
    МассивСоединений = ПолучитьСоединенияИнформационнойБазы();
    КоличествоСеансов = 0;
    
    Для Каждого ТекСоединение Из МассивСоединений Цикл
        // Проверяем, что это клиентское приложение и тот же самый пользователь
        Если (ТекСоединение.ИмяПриложения = "1CV8" ИЛИ ТекСоединение.ИмяПриложения = "1CV8C") 
            И ТекСоединение.Пользователь <> Неопределено 
            И ТекСоединение.Пользователь.УникальныйИдентификатор = ТекущийПользовательУИД Тогда
            
            КоличествоСеансов = КоличествоСеансов + 1;
        КонецЕсли;
    КонецЦикла;
    
    Если КоличествоСеансов > 3 Тогда
        Предупреждение("Вы уже запустили максимально допустимое количество сеансов этой базы!");
        ЗавершитьРаботуСистемы(Ложь);
    КонецЕсли;
КонецПроцедуры

Особенности этого метода:

Решение 3: Продвинутый контроль через PowerShell

Если требуется более гибкий контроль, например, мониторинг всех процессов 1С на сервере в реальном времени, лучше использовать PowerShell. Скрипт может работать в фоновом режиме и принудительно завершать процессы, нарушающие политику компании (хотя это "жесткий" метод, он иногда необходим).

Рассмотрим пример скрипта, который подсчитывает суммарное количество процессов 1С для каждого пользователя:


$Limit = 3
$Processes = Get-Process -Name "1cv8*" -ErrorAction SilentlyContinue | Select-Object Id, ProcessName, @{N="UserName";E={(Get-Process -Id $_.Id -IncludeUserName).UserName}}

$UserGroups = $Processes | Group-Object UserName

foreach ($Group in $UserGroups) {
    if ($Group.Count -gt $Limit) {
        Write-Host "Пользователь $($Group.Name) превысил лимит: $($Group.Count) сеансов."
        # Здесь можно добавить логику уведомления или завершения процесса
    }
}

Проанализируем преимущества PowerShell: мы можем не только считать количество окон, но и отслеживать потребление памяти каждым конкретным сеансом. Если какой-то процесс 1cv8.exe потребляет более 1 ГБ ОЗУ и при этом не проявляет активности, его можно автоматически "килять" (завершать), предварительно отправив пользователю сообщение через msg.exe.

Рекомендации по оптимизации сервера

Помимо программных ограничений, выясним причины тормозов. Если даже 3 сеанса работают медленно, проблема может быть глубже:

  1. Дисковая подсистема: Файловые базы 1С крайне чувствительны к скорости диска. Переход на SSD (или NVMe) в RAID-массиве часто решает проблему медленного формирования отчетов без ограничения сеансов.
  2. Объем ОЗУ: Каждый сеанс 1С v8.3 "съедает" от 200 до 800 МБ оперативной памяти. Умножьте это на 15 пользователей и 3 сеанса — серверу требуется минимум 32-48 ГБ ОЗУ только под 1С.
  3. Настройка терминальных служб: Посмотрите на настройки Resource Governor (если используется Windows Server). Можно ограничить максимальный процент процессорного времени на одну сессию, чтобы один "тяжелый" отчет не вешал весь сервер.

Итог: Оптимальным решением будет комбинация подмены ярлыка на батник (для предотвращения запуска лишних баз) и внутреннего кода в 1С (для контроля дублей в одной базе). Это дисциплинирует пользователей и позволит серверу работать в штатном режиме даже в отчетный период.

← На главную