1С на терминальном сервере — обычная схема для офиса с удалёнными сотрудниками: платформа стоит на Windows Server с ролью узла сеансов RDS, пользователи подключаются по RDP, а тонкий клиент 1cv8c.exe работает в их сеансах на сервере. Жалобы типовые: на ПК база открывается быстро, а 1С медленно работает на Windows Server; на экране 4K всё мелко; появляется лишняя раскладка; диск забит профилями. Ниже — настройки Windows и RDP по заметкам автора сайта, с поправками и готовыми скриптами.
Если тормозит у всех, а не только в RDP, ищите причину на сервере 1С и в СУБД: поиск причины тормозов, настройки MS SQL. Изменения — от администратора, в окно обслуживания, с копией реестра.
Скрипт только читает: Fair Share, схема питания, масштаб и раскладка, приоритеты из Image File Execution Options, память клиентов 1С по сеансам, общий 1CEStart.cfg и исключения Defender. Запуск — Windows PowerShell 5.1 от имени администратора, до и после каждой правки; файл сохраните в UTF-8 с BOM, иначе кириллица в выводе сломается.
# rds-1c-audit.ps1 - аудит терминального сервера под 1С. Только чтение, ничего не меняет.
# Windows PowerShell 5.1 от имени администратора. Файл сохраните в UTF-8 с BOM.
function Get-RegValue([string]$Path, [string]$Name) {
# Значение параметра реестра или '(нет)', если нет раздела или параметра
$item = Get-ItemProperty -Path $Path -Name $Name -ErrorAction SilentlyContinue
if ($null -eq $item) { return '(нет)' }
return $item.$Name
}
Write-Host '== Fair Share: распределение ресурсов между сеансами ==' -ForegroundColor Cyan
$ts = Get-CimInstance -Namespace root\cimv2\terminalservices -ClassName Win32_TerminalServiceSetting -ErrorAction SilentlyContinue
if ($ts) {
'Процессор EnableDFSS={0} диск EnableDiskFSS={1} сеть EnableNetworkFSS={2}' -f $ts.EnableDFSS, $ts.EnableDiskFSS, $ts.EnableNetworkFSS
} else {
'Win32_TerminalServiceSetting не прочитан: нет прав администратора или роли RDS'
}
'EnableCpuQuota = ' + (Get-RegValue 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Quota System' 'EnableCpuQuota')
'Disk EnableFairShare = ' + (Get-RegValue 'HKLM:\SYSTEM\CurrentControlSet\Services\TSFairShare\Disk' 'EnableFairShare')
'NetFS EnableFairShare = ' + (Get-RegValue 'HKLM:\SYSTEM\CurrentControlSet\Services\TSFairShare\NetFS' 'EnableFairShare')
Write-Host '== Схема электропитания ==' -ForegroundColor Cyan
powercfg /getactivescheme
Write-Host '== Масштаб и раскладка ==' -ForegroundColor Cyan
'IgnoreClientDesktopScaleFactor = ' + (Get-RegValue 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations' 'IgnoreClientDesktopScaleFactor')
'IgnoreRemoteKeyboardLayout = ' + (Get-RegValue 'HKLM:\SYSTEM\CurrentControlSet\Control\Keyboard Layout' 'IgnoreRemoteKeyboardLayout')
Write-Host '== Приоритеты в Image File Execution Options ==' -ForegroundColor Cyan
$ifeo = 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options'
foreach ($exe in '1cv8c.exe', '1cv8.exe', '1cv8s.exe', 'rphost.exe', 'sqlservr.exe') {
'{0,-13} CpuPriorityClass = {1}' -f $exe, (Get-RegValue "$ifeo\$exe\PerfOptions" 'CpuPriorityClass')
}
Write-Host '== Клиенты 1С по сеансам Windows ==' -ForegroundColor Cyan
Get-Process -Name '1cv8c', '1cv8' -ErrorAction SilentlyContinue |
Group-Object SessionId |
ForEach-Object {
$mb = ($_.Group | Measure-Object WorkingSet64 -Sum).Sum / 1MB
$prio = ($_.Group | ForEach-Object { $_.PriorityClass } | Sort-Object -Unique) -join ', '
'Сеанс {0,3}: процессов {1}, память {2:N0} МБ, приоритет {3}' -f $_.Name, $_.Count, $mb, $prio
}
Write-Host '== Общий 1CEStart.cfg и исключения Defender ==' -ForegroundColor Cyan
$cfg = Join-Path $env:ALLUSERSPROFILE '1C\1CEStart\1CEStart.cfg'
if (Test-Path $cfg) {
Get-Content $cfg | Where-Object { $_ -match '^(CommonInfoBases|ConfigurationTemplatesLocation|UseHWLicenses)=' }
}
(Get-MpPreference -ErrorAction SilentlyContinue).ExclusionPath
Второй замер — изнутри 1С: сеанс Windows и компьютер пользователя, DPI экранов, время одинакового цикла на клиенте и на сервере, задержка пустого серверного вызова. Код — в модуль формы внешней обработки с командой ДиагностикаКлиента; запустите на RDS и на обычном ПК.
// Диагностика клиента 1С на терминальном сервере.
// Модуль формы внешней обработки; на форме - команда ДиагностикаКлиента.
// Выводит: где запущен клиент, DPI экранов, время цикла на клиенте и на сервере,
// среднюю задержку пустого серверного вызова.
// Режим совместимости конфигурации - 8.3.6 и выше (СтрШаблон, СтрНачинаетсяС).
&НаКлиенте
Процедура ДиагностикаКлиента(Команда)
СисИнфо = Новый СистемнаяИнформация;
Сообщить(СтрШаблон("Платформа %1 (%2), ОС клиента: %3",
СисИнфо.ВерсияПриложения, СисИнфо.ТипПлатформы, СисИнфо.ВерсияОС));
Сообщить(СтрШаблон("Процессор: %1; оперативная память: %2 МБ",
СисИнфо.Процессор, Формат(СисИнфо.ОперативнаяПамять, "ЧГ=")));
ВывестиСеансWindows();
ВывестиЭкраны();
Сообщить("Скорость соединения: " + Строка(ПолучитьСкоростьКлиентскогоСоединения()));
// Одна и та же работа на клиенте и на сервере - сравните с обычным ПК
Итераций = 1000000;
МсКлиент = ЗамерЦикла(Итераций);
МсСервер = ЗамерЦиклаНаСервере(Итераций);
Сообщить(СтрШаблон("Цикл на %1 итераций: клиент %2 мс, сервер %3 мс",
Формат(Итераций, "ЧГ="), Формат(МсКлиент, "ЧН=0; ЧГ="), Формат(МсСервер, "ЧН=0; ЧГ=")));
// Задержка вызова сервера: среднее по 20 пустым вызовам
Вызовов = 20;
Начало = ТекущаяУниверсальнаяДатаВМиллисекундах();
Для Номер = 1 По Вызовов Цикл
ПустойВызовСервера();
КонецЦикла;
Задержка = (ТекущаяУниверсальнаяДатаВМиллисекундах() - Начало) / Вызовов;
Сообщить(СтрШаблон("Пустой серверный вызов: %1 мс в среднем; сервер 1С: %2",
Формат(Задержка, "ЧДЦ=1; ЧН=0"), ИмяКомпьютераСервера()));
КонецПроцедуры
&НаКлиенте
Процедура ВывестиСеансWindows()
#Если ВебКлиент Тогда
Сообщить("Веб-клиент: сеанс Windows из браузера не определить");
#Иначе
// В RDP-сеансе ИмяКомпьютера() - это имя терминального сервера,
// а компьютер пользователя - в переменной среды CLIENTNAME
Оболочка = Новый COMОбъект("WScript.Shell");
ИмяСеанса = Оболочка.ExpandEnvironmentStrings("%SESSIONNAME%");
КомпьютерПользователя = Оболочка.ExpandEnvironmentStrings("%CLIENTNAME%");
Если СтрНачинаетсяС(ВРег(ИмяСеанса), "RDP") Тогда
Сообщить(СтрШаблон("RDP-сеанс %1 на сервере %2, подключение с компьютера %3",
ИмяСеанса, ИмяКомпьютера(), КомпьютерПользователя));
Иначе
Сообщить(СтрШаблон("Не RDP: сеанс %1, компьютер %2", ИмяСеанса, ИмяКомпьютера()));
КонецЕсли;
#КонецЕсли
КонецПроцедуры
&НаКлиенте
Процедура ВывестиЭкраны()
Экраны = ПолучитьИнформациюЭкрановКлиента();
Если Экраны = Неопределено Тогда
Возврат;
КонецЕсли;
// 96 DPI - масштаб 100%, 120 - 125%, 144 - 150%, 192 - 200%
Для Каждого Экран Из Экраны Цикл
ПроцентМасштаба = ?(Экран.DPI > 0, Окр(Экран.DPI * 100 / 96), 0);
Сообщить(СтрШаблон("Экран %1x%2, DPI %3, масштаб Windows %4%%",
Формат(Экран.Ширина, "ЧГ="), Формат(Экран.Высота, "ЧГ="), Экран.DPI, ПроцентМасштаба));
КонецЦикла;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция ЗамерЦикла(Итераций)
Начало = ТекущаяУниверсальнаяДатаВМиллисекундах();
Сумма = 0;
Для Номер = 1 По Итераций Цикл
Сумма = Сумма + Номер % 7;
КонецЦикла;
Возврат ТекущаяУниверсальнаяДатаВМиллисекундах() - Начало;
КонецФункции
&НаСервереБезКонтекста
Функция ЗамерЦиклаНаСервере(Итераций)
Возврат ЗамерЦикла(Итераций);
КонецФункции
&НаСервереБезКонтекста
Процедура ПустойВызовСервера()
// Пусто: замеряем только дорогу клиент - сервер - клиент
КонецПроцедуры
&НаСервереБезКонтекста
Функция ИмяКомпьютераСервера()
// В файловом варианте серверный код выполняется в процессе клиента,
// и здесь будет то же имя, что и у клиента
Возврат ИмяКомпьютера();
КонецФункции
Как читать:
В файловом варианте серверный код выполняется в клиенте каждого пользователя, поэтому ограничения процессора сеанса бьют и по проведению, и по отчётам.
Технологии Fair Share делят между сеансами RDS процессор (DFSS — Dynamic Fair Share Scheduling), диск и сеть, чтобы один пользователь не занял весь сервер. В заметках автора сохранён разбор случая: Windows Server 2012 R2, три бухгалтера, база на 1 ГБ — клиент открывался около 20 секунд, SSD и отключение регламентных заданий не помогли, на 2008 R2 всё работало быстро. Помогло выключение Fair Share. Проверка — (gwmi win32_terminalservicesetting -N "root\cimv2\terminalservices").enabledfss (1 — включено), решение — два значения реестра и перезагрузка (.reg сохраняйте в UTF-16 LE, как их экспортирует сам regedit):
Windows Registry Editor Version 5.00
; dfss-off-2012r2.reg - случай из заметок автора: Windows Server 2012 R2, 1С тормозит у всех в RDS.
; Перед импортом - копии разделов (reg export), после импорта - перезагрузка.
; Квоты процессора между сеансами (Fair Share CPU)
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Quota System]
"EnableCpuQuota"=dword:00000000
; Справедливое распределение дисковых операций
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TSFairShare\Disk]
"EnableFairShare"=dword:00000000
В актуальной статье Microsoft «Fair Share technologies are enabled by default in Remote Desktop Services» картина другая: на узле сеансов по умолчанию включено только распределение процессора, дисковое и сетевое выключены, менять их предлагается через WMI. Политика «Turn off Fair Share CPU Scheduling» ещё в 2008 R2 не работала, и обходным путём Microsoft называла тот же EnableCpuQuota = 0; раздел TSFairShare в статьях Microsoft о Fair Share не упоминается.
# rds-fairshare.ps1 - выключить Fair Share на узле сеансов RDS (Windows Server 2012 и новее).
# Windows PowerShell 5.1 от имени администратора, после - перезагрузка в окно обслуживания.
# .\rds-fairshare.ps1 -Cpu только процессор (обычно достаточно)
# .\rds-fairshare.ps1 -Cpu -Disk процессор и диск
param([switch]$Cpu, [switch]$Disk, [switch]$Network)
if (-not ($Cpu -or $Disk -or $Network)) { 'Укажите -Cpu, -Disk или -Network'; return }
# 1. Копии разделов реестра на всякий случай. Основной откат - те же свойства WMI = 1.
# Если reg export ответил ошибкой, раздела не было.
$backup = 'C:\Backup'
New-Item -ItemType Directory -Path $backup -Force | Out-Null
reg export 'HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Quota System' "$backup\quota_system.reg" /y
reg export 'HKLM\SYSTEM\CurrentControlSet\Services\TSFairShare' "$backup\tsfairshare.reg" /y
# 2. Было
$ts = Get-WmiObject -Namespace root\cimv2\terminalservices -Class Win32_TerminalServiceSetting
'Было: EnableDFSS={0} EnableDiskFSS={1} EnableNetworkFSS={2}' -f $ts.EnableDFSS, $ts.EnableDiskFSS, $ts.EnableNetworkFSS
# 3. Выключение через WMI
if ($Cpu) { $ts.EnableDFSS = 0 }
if ($Disk) { $ts.EnableDiskFSS = 0 }
if ($Network) { $ts.EnableNetworkFSS = 0 }
$ts.Put() | Out-Null
# 4. Стало: объект читаем заново
$ts = Get-WmiObject -Namespace root\cimv2\terminalservices -Class Win32_TerminalServiceSetting
'Стало: EnableDFSS={0} EnableDiskFSS={1} EnableNetworkFSS={2}' -f $ts.EnableDFSS, $ts.EnableDiskFSS, $ts.EnableNetworkFSS
'Перезагрузите сервер, когда пользователи выйдут. Включить обратно - те же свойства = 1.'
Выключайте только процессорную часть и только если клиентский цикл медленный при незагруженном процессоре: без Fair Share тяжёлая обработка в одном сеансе заберёт процессор у всех.
В Windows Server по умолчанию схема «Сбалансированная»: в простое процессор сбрасывает частоту, а работа в интерфейсе 1С — это короткие всплески нагрузки. Вручную — «Панель управления → Электропитание», из командной строки:
rem power-high.cmd - схема «Высокая производительность», cmd от имени администратора.
rem Какие схемы есть и какая активна (отмечена звёздочкой):
powercfg /list
rem SCHEME_MIN - псевдоним «Высокой производительности» (GUID 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c), все псевдонимы - powercfg /aliases
powercfg /setactive SCHEME_MIN
powercfg /getactivescheme
rem Откат на «Сбалансированную»: powercfg /setactive SCHEME_BALANCED
На физическом сервере профиль производительности нужен и в BIOS. На виртуальной машине важнее питание хоста: схема внутри гостя частотой процессора не управляет.
Из практики автора: Windows выставляет приоритет при каждом запуске процесса, если в разделе Image File Execution Options\<имя exe>\PerfOptions есть CpuPriorityClass. Microsoft этот параметр не документирует, коды классов известны из практики: 1 — низкий, 2 — обычный, 3 — высокий, 5 — ниже среднего, 6 — выше среднего. В .reg автора — 3 (высокий) для 1cv8.exe, 1cv8s.exe и sqlservr.exe. Две поправки: 1cv8s.exe по справке платформы — окно со списком баз, а работают в 1cv8c.exe (тонкий клиент) и 1cv8.exe (толстый клиент и конфигуратор); в сохранённой к .reg инструкции «8 — средний», но 8 — базовый приоритет потоков обычного класса, а не код класса.
Windows Registry Editor Version 5.00
; 1c-client-priority.reg - приоритет клиентов 1С на выделенном RDS-сервере (из практики).
; CpuPriorityClass: 2 - обычный, 6 - выше среднего, 3 - высокий (так было в .reg автора).
; Действует на процессы, запущенные после импорта, во всех сеансах и для всех версий платформы.
; Тонкий клиент: в нём работают пользователи конфигураций на управляемых формах
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\1cv8c.exe\PerfOptions]
"CpuPriorityClass"=dword:00000006
; Толстый клиент и конфигуратор
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\1cv8.exe\PerfOptions]
"CpuPriorityClass"=dword:00000006
Откат:
Windows Registry Editor Version 5.00
; 1c-client-priority-undo.reg - откат: удаляет только подразделы PerfOptions,
; остальные параметры в разделах 1cv8c.exe и 1cv8.exe не трогает.
[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\1cv8c.exe\PerfOptions]
[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\1cv8.exe\PerfOptions]
Когда повышение вредно:
На выделенном RDS начните с 6 (выше среднего) и проверьте аудитом, что приоритет применился. Раздел Image File Execution Options отслеживают антивирусы и EDR — предупредите безопасников.
Из практики автора: чтобы на мониторе 4K в RDP не было мелко или слишком крупно, сервер перестаёт брать масштаб у клиента, а DPI задаётся каждому пользователю отдельно. Шаг 1 — на сервере, затем перезагрузка; в документации Microsoft параметра IgnoreClientDesktopScaleFactor нет, он известен из практики:
Windows Registry Editor Version 5.00
; rdp-ignore-client-scale.reg - сервер не берёт масштаб, который присылает RDP-клиент (из практики).
; После импорта - перезагрузка. Откат: значение 0 или удалить параметр.
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations]
"IgnoreClientDesktopScaleFactor"=dword:00000001
Шаг 2 — пользователь запускает в своём сеансе переработанный батник автора: LogPixels выбирается из четырёх значений (96 — 100%, 120 — 125%, 144 — 150%, 192 — 200%), затем выход из сеанса. По документации Microsoft LogPixels — общий масштаб для всех экранов и действует при Win8DpiScaling = 1, поэтому батник ставит и его.
@echo off
rem dpi-user.cmd - масштаб Windows для текущего пользователя RDS (переработанный батник автора).
rem Запускает сам пользователь в своём сеансе; на сервере должен стоять IgnoreClientDesktopScaleFactor=1.
rem Скрипт завершает сеанс: перед запуском сохраните документы и закройте 1С.
echo 1 = 100%% 2 = 125%% 3 = 150%% 4 = 200%%
choice /c 1234 /n /m "Scale (1-4): "
rem "if errorlevel N" срабатывает при коде N и больше, поэтому проверки идут по возрастанию
set dpi=96
if errorlevel 2 set dpi=120
if errorlevel 3 set dpi=144
if errorlevel 4 set dpi=192
reg add "HKCU\Control Panel\Desktop" /v LogPixels /t REG_DWORD /d %dpi% /f
rem LogPixels действует в режиме одного масштаба для всех экранов: Win8DpiScaling=1
reg add "HKCU\Control Panel\Desktop" /v Win8DpiScaling /t REG_DWORD /d 1 /f
echo LogPixels=%dpi%. The session will be closed to apply the new scale.
pause
logoff
Масштаб применится только после выхода из сеанса, а не после закрытия окна RDP крестиком. По сообщениям администраторов, в Windows Server 2022 IgnoreClientDesktopScaleFactor не действует — тогда масштаб задают на клиенте, например строкой desktopscalefactor:i:125 в .rdp-файле подключения.
Есть и масштаб самой 1С: в интерфейсе «Такси» команда «Изменить масштаб» в меню формы (от 50 до 400%, кнопка «Установить для всех»), с 8.3.15 — фраза «изменить масштаб» в поле глобального поиска. В компактном режиме и в режиме «Формы в закладках» команды нет.
Симптом: в сеансе третья раскладка вроде «РУС — США», в окне входа или в поиске 1С вместо латиницы печатается кириллица. RDP-клиент передаёт серверу свою раскладку, и несовпадающая комбинация попадает в сеанс. Параметр IgnoreRemoteKeyboardLayout это запрещает — сеанс берёт раскладку из профиля пользователя. Microsoft описывала его только для Windows Server 2003 (KB 924852), на новых версиях он применяется по практике:
Windows Registry Editor Version 5.00
; rds-ignore-client-layout.reg - сервер не берёт раскладку, которую присылает RDP-клиент.
; Пользователю с лишней раскладкой - выйти из сеанса и войти снова. Откат: значение 0.
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"IgnoreRemoteKeyboardLayout"=dword:00000001
По практике перезагрузка не нужна, пользователю достаточно перезайти. Уже прописавшуюся раскладку убирают в «Параметры → Время и язык» или командой в сеансе пользователя:
# В сеансе пользователя: оставить русский и английский (США) со стандартными раскладками.
# Команда заменяет весь список языков пользователя - другие языки тоже пропадут.
$list = New-WinUserLanguageList -Language 'ru-RU'
$list.Add('en-US')
Set-WinUserLanguageList -LanguageList $list -Force
Get-WinUserLanguageList | Select-Object LanguageTag, InputMethodTips
У каждого пользователя RDS свой кэш каждой базы в %LOCALAPPDATA%\1C\1cv8\<ID базы>, а настройки, шаблоны (tmplts) и внешние компоненты — в %APPDATA%\1C\1cv8. Двадцать пользователей и три базы — шестьдесят копий кэша на системном диске. Из практики:
# 1c-profile-cache.ps1 - сколько места занимают кэш и настройки 1С в профилях RDS. Только чтение.
# Профили на дисках UPD/FSLogix видны, только пока пользователь в системе.
function Get-FolderMB([string]$Path) {
if (-not (Test-Path $Path)) { return 0 }
$sum = (Get-ChildItem $Path -Recurse -File -Force -ErrorAction SilentlyContinue |
Measure-Object Length -Sum).Sum
return [math]::Round($sum / 1MB)
}
# Папки кэша называются по ID базы (GUID) из списка баз
$guid = '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$'
$rows = foreach ($userHome in Get-ChildItem (Split-Path $env:USERPROFILE) -Directory) {
$local = Join-Path $userHome.FullName 'AppData\Local\1C\1cv8'
$roaming = Join-Path $userHome.FullName 'AppData\Roaming\1C\1cv8'
if (-not (Test-Path $local) -and -not (Test-Path $roaming)) { continue }
[pscustomobject]@{
'Профиль' = $userHome.Name
'Баз в кэше' = @(Get-ChildItem $local -Directory -ErrorAction SilentlyContinue |
Where-Object { $_.Name -match $guid }).Count
'Кэш, МБ' = Get-FolderMB $local
'Настройки, МБ' = Get-FolderMB $roaming
}
}
$rows | Sort-Object 'Кэш, МБ' -Descending | Format-Table -AutoSize
'Всего кэша: {0:N0} МБ' -f ($rows | Measure-Object 'Кэш, МБ' -Sum).Sum
Чистить кэш во всех профилях — скриптом с ключом -AllUsers из статьи про кэш 1С, когда пользователи вышли.
Копировать ibases.v8i в каждый профиль не нужно: программа запуска объединяет личные настройки с общим файлом C:\ProgramData\1C\1CEStart\1CEStart.cfg. Допишите в его конец строки ниже Блокнотом от имени администратора, не трогая InstalledLocation и InstallComponents от установщика; по справке платформы файл в UTF-16LE, Блокнот кодировку сохранит.
CommonInfoBases=C:\1C\ibases.v8i
ConfigurationTemplatesLocation=D:\1C\tmplts
UseHWLicenses=0
Пути условные; C:\1C\ibases.v8i пользователи только читают. UseHWLicenses=0 отключает поиск локального ключа защиты — ставьте, если USB-ключа на сервере нет; по этому параметру личный 1CEStart.cfg главнее общего. Подробнее — про общий список баз.
При запуске клиент читает множество файлов кэша, и проверка «на лету» растягивает открытие базы. Исключайте каталоги, а не процесс 1cv8c.exe — иначе Defender перестанет проверять все файлы, которые открывает сам клиент 1С. %APPDATA%\1C\1cv8 оставьте под проверкой: там DLL внешних компонент. Выключать антивирус на RDS целиком нельзя — здесь работают с почтой и браузером. Для Microsoft Defender:
# defender-1c-rds.ps1 - исключения Microsoft Defender для клиентов 1С на RDS (от имени администратора).
# Исключаем каталоги, а не процессы. Пути условные; * в середине пути - одна папка (профиль).
# %LOCALAPPDATA% здесь не годится: Defender работает от SYSTEM и раскроет переменную по-своему.
$paths = @(
'C:\Users\*\AppData\Local\1C\1cv8' # кэш конфигураций всех пользователей
# 'D:\1C\Bases' # файловые базы, если они лежат на этом сервере
)
foreach ($p in $paths) {
Add-MpPreference -ExclusionPath $p
}
# Проверка: полный список исключений по каталогам
(Get-MpPreference).ExclusionPath
Win32_TerminalServiceSetting: EnableDFSS — процессор, EnableDiskFSS — диск, EnableNetworkFSS — сеть; без $ts.Put() изменения не сохранятся.…\1cv8c.exe\PerfOptions — раздел назван по имени exe без пути, поэтому действует на все версии платформы; минус перед разделом в .reg удаляет его.ExpandEnvironmentStrings("%CLIENTNAME%") — компьютер пользователя, а ИмяКомпьютера() в RDP вернёт имя сервера.ПолучитьИнформациюЭкрановКлиента() — экраны с DPI (8.3.2+); ЗамерЦикла с директивой &НаКлиентеНаСервереБезКонтекста выполняется на клиенте и, через обёртку, на сервере.netsh int tcp set global autotuninglevel=disabled и rss=disabled 1С не ускоряют, а без RSS входящий трафик обрабатывает одно ядро. Вернуть: netsh int tcp set global autotuninglevel=normal rss=enabled.По справке платформы одна терминальная сессия считается одним компьютером: лицензия на 5 пользователей на терминальном сервере — это клиенты 1С не более чем в 5 сеансах одновременно. Проверьте, где лежит файл программной лицензии: из C:\ProgramData\1C\licenses её видят все, а из %LOCALAPPDATA%\1C\1cv8\conf в профиле администратора — только он.
Тонкий (1cv8c.exe) — для конфигураций на управляемых формах: в клиент-серверном варианте он не выполняет серверный код и легче. Толстый — для обычных форм (УТ 10.3) и конфигуратора.
Клиент 1С в удаленном рабочем столе запущен на сервере, и для платформы компьютер клиента — RDS. Имя ПК пользователя — переменная CLIENTNAME; учитывайте это при привязке принтеров и торгового оборудования.
Для небольшого офиса можно, но всё делит один процессор и память: клиентам приоритет не поднимайте, SQL Server ограничьте параметром max server memory, с ростом числа пользователей разносите роли.
Если после аудита непонятно, где теряется время — в сеансах RDS, в сети или на сервере 1С, — опишите симптомы и приложите вывод скриптов. Разбор медленной работы — услуга «1С тормозит»; разместить задачу можно бесплатно, оценку пришлют в течение рабочего дня.
Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.