1С на терминальном сервере: настройка Windows и RDP

Дата: 08.10.2026 17:16:03
Терминальный сервер
RDP
Производительность
Администрирование 1С
Windows Server
Комментарий:
0
Платформа:
8.3
Конфигурация:
Любая
Формы:
Любые

1С на терминальном сервере — обычная схема для офиса с удалёнными сотрудниками: платформа стоит на Windows Server с ролью узла сеансов RDS, пользователи подключаются по RDP, а тонкий клиент 1cv8c.exe работает в их сеансах на сервере. Жалобы типовые: на ПК база открывается быстро, а 1С медленно работает на Windows Server; на экране 4K всё мелко; появляется лишняя раскладка; диск забит профилями. Ниже — настройки Windows и RDP по заметкам автора сайта, с поправками и готовыми скриптами.

Если тормозит у всех, а не только в RDP, ищите причину на сервере 1С и в СУБД: поиск причины тормозов, настройки MS SQL. Изменения — от администратора, в окно обслуживания, с копией реестра.

Настройка терминального сервера для 1С: начните с аудита

Скрипт только читает: 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С на терминальном сервере из кода

Второй замер — изнутри 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;
	КонецЦикла;
	Возврат ТекущаяУниверсальнаяДатаВМиллисекундах() - Начало;

КонецФункции

&НаСервереБезКонтекста
Функция ЗамерЦиклаНаСервере(Итераций)

	Возврат ЗамерЦикла(Итераций);

КонецФункции

&НаСервереБезКонтекста
Процедура ПустойВызовСервера()

	// Пусто: замеряем только дорогу клиент - сервер - клиент

КонецПроцедуры

&НаСервереБезКонтекста
Функция ИмяКомпьютераСервера()

	// В файловом варианте серверный код выполняется в процессе клиента,
	// и здесь будет то же имя, что и у клиента
	Возврат ИмяКомпьютера();

КонецФункции

Как читать:

  • цикл на клиенте в RDP заметно медленнее, чем на ПК, — не хватает процессора или его режут Fair Share и схема питания;
  • цикл быстрый, а серверный вызов с RDS дольше, чем с ПК, — смотрите сеть между RDS и сервером 1С;
  • медленно на сервере у всех — это замер производительности и сервер 1С, а не RDP.

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

1С тормозит на терминальном сервере: Fair Share (DFSS)

Технологии 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. На виртуальной машине важнее питание хоста: схема внутри гостя частотой процессора не управляет.

Приоритет 1cv8c.exe через Image File Execution Options

Из практики автора: 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]

Когда повышение вредно:

  • рядом с rphost и SQL Server — клиенты отберут процессор у серверной части, которую сами ждут (про sqlservr.exe — в статье о настройках SQL для 1С);
  • при зацикливании клиентского кода — процесс займёт ядро, и у соседей по серверу замрёт ввод;
  • когда приоритет поднят всем — друг перед другом пользователи не выигрывают, проигрывают службы Windows.

На выделенном RDS начните с 6 (выше среднего) и проверьте аудитом, что приоритет применился. Раздел Image File Execution Options отслеживают антивирусы и EDR — предупредите безопасников.

Мелкий шрифт 1С в RDP: масштаб Windows и 1С

Из практики автора: чтобы на мониторе 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 — фраза «изменить масштаб» в поле глобального поиска. В компактном режиме и в режиме «Формы в закладках» команды нет.

Лишняя раскладка клавиатуры на RDS

Симптом: в сеансе третья раскладка вроде «РУС — США», в окне входа или в поиске 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

Кэш 1С в профилях пользователей

У каждого пользователя RDS свой кэш каждой базы в %LOCALAPPDATA%\1C\1cv8\<ID базы>, а настройки, шаблоны (tmplts) и внешние компоненты — в %APPDATA%\1C\1cv8. Двадцать пользователей и три базы — шестьдесят копий кэша на системном диске. Из практики:

  • перемещаемые профили и перенаправление AppData в сеть замедляют вход и клиент — держите AppData локально;
  • на ферме RDS кэш собирается на каждом узле заново; с дисками профилей UPD и FSLogix он едет с профилем, но раздувает его;
  • шаблоны обновлений ставьте в общий каталог и указывайте его параметром ConfigurationTemplatesLocation.
# 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+); ЗамерЦикла с директивой &НаКлиентеНаСервереБезКонтекста выполняется на клиенте и, через обёртку, на сервере.

Типичные ошибки

  • Приоритет подняли не тем процессам. 1cv8s.exe — лишь окно выбора базы, а высокий приоритет клиентов рядом с rphost и SQL Server оставляет серверной части процессор последней.
  • Fair Share выключили на перегруженном сервере. Теперь один тяжёлый сеанс тормозит всех.
  • .reg импортировали без прав администратора. Редактор реестра отвечает: «Не удается импортировать …: не все данные были успешно записаны в реестр. Некоторые разделы открыты системой или другими процессами, либо у вас недостаточно привилегий для этой операции». Импортируйте из консоли администратора; если ошибка осталась, проверьте, не блокирует ли запись антивирус или EDR.
  • Сетевые «оптимизации» времён 2008. netsh int tcp set global autotuninglevel=disabled и rss=disabled 1С не ускоряют, а без RSS входящий трафик обрабатывает одно ядро. Вернуть: netsh int tcp set global autotuninglevel=normal rss=enabled.

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

Сколько лицензий 1С нужно для терминального сервера?

По справке платформы одна терминальная сессия считается одним компьютером: лицензия на 5 пользователей на терминальном сервере — это клиенты 1С не более чем в 5 сеансах одновременно. Проверьте, где лежит файл программной лицензии: из C:\ProgramData\1C\licenses её видят все, а из %LOCALAPPDATA%\1C\1cv8\conf в профиле администратора — только он.

Тонкий или толстый клиент запускать на RDS?

Тонкий (1cv8c.exe) — для конфигураций на управляемых формах: в клиент-серверном варианте он не выполняет серверный код и легче. Толстый — для обычных форм (УТ 10.3) и конфигуратора.

Почему ИмяКомпьютера() на терминале возвращает имя сервера?

Клиент 1С в удаленном рабочем столе запущен на сервере, и для платформы компьютер клиента — RDS. Имя ПК пользователя — переменная CLIENTNAME; учитывайте это при привязке принтеров и торгового оборудования.

Можно ли совместить RDS, сервер 1С и SQL Server на одной машине?

Для небольшого офиса можно, но всё делит один процессор и память: клиентам приоритет не поднимайте, SQL Server ограничьте параметром max server memory, с ростом числа пользователей разносите роли.

Когда проще заказать

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

По теме

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.


1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.