# Microsoft Windows Server

# Создание и использование gMSA для запуска сервера 1С

### <span>Введение</span>

<span>Group Managed Service Account (gMSA) — это специальный тип сервисной учетной записи в Active Directory, который позволяет автоматически управлять паролем и использовать её для запуска служб без необходимости вручную вводить и обновлять пароль. Данная статья описывает процесс создания и настройки gMSA для запуска сервера 1С.</span>

---

### <span>Шаг 1. Создание корневого ключа KDS на контроллере домена</span>

<span>На контроллере домена создаём корневой ключ службы распространения ключей (Key Distribution Service, KDS):</span>

<div class="md-code-block md-code-block-dark" id="bkmrk-powershell"><div class="md-code-block-banner-wrap"><div class="md-code-block-banner md-code-block-banner-lite"><div class="_121d384"><div class="d2a24f03"><span class="d813de27">powershell</span></div></div></div></div></div>```
Add-KdsRootKey –EffectiveImmediately
```

<div class="md-code-block md-code-block-dark" id="bkmrk--1"></div>> **<span>Важно:</span>**<span> Ключ начинает работать через 10 часов. Для тестовых целей можно ускорить процесс:</span>
> 
> <div class="md-code-block md-code-block-dark"><div class="md-code-block-banner-wrap"><div class="md-code-block-banner md-code-block-banner-lite"><div class="_121d384"><div class="d2a24f03"><span class="d813de27">powershell</span></div></div></div></div></div>```
> # For single-DC test environments only
> Add-KdsRootKey -EffectiveTime (Get-Date).AddHours(-10)
> ```
> 
> <div class="md-code-block md-code-block-dark"></div>

---

### <span>Шаг 2. Проверка создания корневого ключа KDS</span>

<span>Проверяем, что корневой ключ KDS успешно создан:</span>

<div class="md-code-block md-code-block-dark" id="bkmrk-powershell-1"><div class="md-code-block-banner-wrap"><div class="md-code-block-banner md-code-block-banner-lite"><div class="_121d384"><div class="d2a24f03"><span class="d813de27">powershell</span></div></div></div></div></div>```
Get-KdsRootKey
Test-KdsRootKey -KeyId (Get-KdsRootKey).KeyId
```

<div class="md-code-block md-code-block-dark" id="bkmrk--3"></div>---

### <span>Шаг 3. Создание группы для серверов</span>

<span>Создаём глобальную группу безопасности, в которую будут входить серверы, имеющие право использовать gMSA:</span>

<div class="md-code-block md-code-block-dark" id="bkmrk-powershell-2"><div class="md-code-block-banner-wrap"><div class="md-code-block-banner md-code-block-banner-lite"><div class="_121d384"><div class="d2a24f03"><span class="d813de27">powershell</span></div></div></div></div></div>```
New-ADGroup MySQLServers -path 'OU=SQLServers,dc=example,DC=local' -GroupScope Global -PassThru –Verbose
```

<div class="md-code-block md-code-block-dark" id="bkmrk--5"></div>---

### <span>Шаг 4. Добавление серверов в группу</span>

<span>Добавляем в созданную группу серверы, которые смогут использовать gMSA:</span>

<div class="md-code-block md-code-block-dark" id="bkmrk-powershell-3"><div class="md-code-block-banner-wrap"><div class="md-code-block-banner md-code-block-banner-lite"><div class="_121d384"><div class="d2a24f03"><span class="d813de27">powershell</span></div></div></div></div></div>```
Add-AdGroupMember -Identity MySQLServers -Members SQLServ1$, SQLServ2$, SQLServ3$
```

<div class="md-code-block md-code-block-dark" id="bkmrk--7"></div>> **<span>Примечание:</span>**<span> Имена компьютеров указываются со знаком </span>`$`<span> на конце.</span>

---

### <span>Шаг 5. Создание групповой управляемой сервисной учетной записи (gMSA)</span>

<span>Создаём gMSA для группы </span>`MySQLServers`<span>:</span>

<div class="md-code-block md-code-block-dark" id="bkmrk-powershell-4"><div class="md-code-block-banner-wrap"><div class="md-code-block-banner md-code-block-banner-lite"><div class="_121d384"><div class="d2a24f03"><span class="d813de27">powershell</span></div></div></div></div></div>```
New-ADServiceAccount -name gmsaSrv1c -DNSHostName gmsaSrv1c.example.local -PrincipalsAllowedToRetrieveManagedPassword MySQLServers –verbose
```

<div class="md-code-block md-code-block-dark" id="bkmrk--9"></div>---

### <span>Шаг 6. Перезапуск серверов</span>

<span>Перезапускаем серверы, на которых планируется использовать gMSA. Это необходимо для того, чтобы серверы получили актуальный состав групп и членство в </span>`MySQLServers`<span>.</span>

---

### <span>Шаг 7. Установка модуля PowerShell для Active Directory</span>

<span>На каждом сервере, где будет использоваться gMSA, устанавливаем модуль PowerShell для работы с Active Directory:</span>

<div class="md-code-block md-code-block-dark" id="bkmrk-powershell-5"><div class="md-code-block-banner-wrap"><div class="md-code-block-banner md-code-block-banner-lite"><div class="_121d384"><div class="d2a24f03"><span class="d813de27">powershell</span></div></div></div></div></div>```
Add-WindowsFeature RSAT-AD-PowerShell
```

<div class="md-code-block md-code-block-dark" id="bkmrk--12"></div>---

### <span>Шаг 8. Установка учетной записи gMSA на сервере</span>

<span>На каждом сервере устанавливаем учетную запись gMSA:</span>

<div class="md-code-block md-code-block-dark" id="bkmrk-powershell-6"><div class="md-code-block-banner-wrap"><div class="md-code-block-banner md-code-block-banner-lite"><div class="_121d384"><div class="d2a24f03"><span class="d813de27">powershell</span></div></div></div></div></div>```
Install-ADServiceAccount -Identity gmsaSrv1c
```

<div class="md-code-block md-code-block-dark" id="bkmrk--14"></div>---

### <span>Шаг 9. Проверка корректности установки gMSA</span>

<span>Проверяем, что gMSA успешно установлена и готова к использованию:</span>

<div class="md-code-block md-code-block-dark" id="bkmrk-powershell-7"><div class="md-code-block-banner-wrap"><div class="md-code-block-banner md-code-block-banner-lite"><div class="_121d384"><div class="d2a24f03"><span class="d813de27">powershell</span></div></div></div></div></div>```
Test-ADServiceAccount gmsaSrv1c
```

<div class="md-code-block md-code-block-dark" id="bkmrk--16"></div>---

### <span>Дополнительные команды</span>

#### <span>Изменение периодичности смены пароля</span>

<span>По умолчанию пароль gMSA меняется каждые 30 дней. Изменить интервал можно командой:</span>

<div class="md-code-block md-code-block-dark" id="bkmrk-powershell-8"><div class="md-code-block-banner-wrap"><div class="md-code-block-banner md-code-block-banner-lite"><div class="_121d384"><div class="d2a24f03"><span class="d813de27">powershell</span></div></div></div></div></div>```
Set-ADServiceAccount gmsaSrv1c -ManagedPasswordIntervalInDays 60
```

<div class="md-code-block md-code-block-dark" id="bkmrk--18"></div>#### <span>Получение времени последней смены пароля</span>

<div class="md-code-block md-code-block-dark" id="bkmrk-powershell-9"><div class="md-code-block-banner-wrap"><div class="md-code-block-banner md-code-block-banner-lite"><div class="_121d384"><div class="d2a24f03"><span class="d813de27">powershell</span></div></div></div></div></div>```
Get-ADServiceAccount -Identity gmsaSrv1c -Properties passwordlastset
```

<div class="md-code-block md-code-block-dark" id="bkmrk--19"></div>---

### <span>Настройка запуска службы 1С из-под gMSA</span>

<span>Для запуска службы из-под сервисной учетной записи gMSA необходимо:</span>

1. <span>Открыть свойства нужной службы.</span>
2. <span>Перейти на вкладку </span>**<span>Log on</span>**<span> (Вход в систему).</span>
3. <span>Выбрать пункт </span>**<span>This account</span>**<span> (С учетной записью).</span>
4. <span>Указать имя сервисной учетной записи </span>**<span>со знаком </span>`$`<span> на конце</span>**<span> (например, </span>`gmsaSrv1c$`<span>), </span>**<span>без указания пароля</span>**<span>.</span>
5. <span>Перезапустить службу.</span>

> **<span>Важно:</span>**<span> Для корректной работы сервера 1С необходимо предоставить полные права учетной записи gMSA на каталог </span>`SRVINFO`<span>.</span>

---

### <span>Примечание</span>

<span>Использовать gMSA напрямую, например, на NAS Synology, не получится. Однако можно включить учетную запись gMSA в глобальную группу безопасности и назначать разрешения на NAS уже для этой группы.</span>

# Настройка MS SQL Server для 1С: актуальный чек-лист на 2026 год

**<span>Обновлённая версия</span>**<span> на основе оригинального руководства 2016 года с учётом современных реалий</span>

> <span style="color:rgb(224,62,45);">**<span>Важно:</span>**<span> Приведённые рекомендации следует адаптировать под конкретную конфигурацию сервера и нагрузку. Это не универсальные правила, а базовая отправная точка для оптимизации.</span></span>

---

## <span>Что изменилось с 2016 года</span>

<span>За прошедшие годы ключевые изменения коснулись следующих областей:</span>

- **<span>Рекомендуемые версии SQL Server:</span>**<span> переход на SQL Server 2019/2022 (и 2025 для новых внедрений)</span>
- **<span>Настройка TempDB:</span>**<span> от простого переноса на отдельный диск к созданию множества файлов данных</span>
- **<span>Оптимизация параллелизма:</span>**<span> пересмотр значений MAXDOP и Cost Threshold for Parallelism</span>
- **<span>Сортировка баз данных:</span>**<span> рекомендации по использованию Latin1\_General\_100\_CI\_AS</span>

---

## <span>Часть 1. Базовые настройки сервера</span>

### <span>1.1. Включите мгновенную инициализацию файлов (Instant File Initialization)</span>

**<span>Что даёт:</span>**<span> Ускоряет создание базы данных, добавление файлов и журналов, увеличение размера файлов, восстановление базы данных.</span>

**<span>Как включить:</span>**

1. <span>Откройте </span>`secpol.msc`<span> (Local Security Policy).</span>
2. <span>Разверните </span>**<span>Локальные политики</span>**<span> → </span>**<span>Назначение прав пользователей</span>**<span>.</span>
3. <span>Дважды кликните </span>**<span>Выполнение задач по обслуживанию томов</span>**<span>.</span>
4. <span>Добавьте SID службы Database Engine (рекомендуется) или учётную запись службы.</span>
5. <span>Перезапустите службу SQL Server.</span>

> **<span>Новое в SQL Server 2022+:</span>**<span> Мгновенная инициализация теперь работает и для файлов журнала транзакций при авторасширении до 64 МБ </span><span>.</span>

**<span>Проверка:</span>**<span> В журнале ошибок SQL Server при запуске появится сообщение </span>`Using locked pages in the memory manager`<span>.</span>

---

### <span>1.2. Включите «Блокировка страниц в памяти» (Lock Pages in Memory)</span>

**<span>Что даёт:</span>**<span> Запрещает системе отправлять страницы данных SQL Server в виртуальную память на диске. Критически важно для серверов с большим объёмом RAM — без этой настройки возможны ошибки «non-yielding scheduler» </span><span>.</span>

**<span>Как включить:</span>**

1. <span>В меню </span>**<span>Пуск</span>**<span> → </span>**<span>Выполнить</span>**<span> введите </span>`gpedit.msc`<span>.</span>
2. <span>Разверните: </span>**<span>Конфигурация компьютера</span>**<span> → </span>**<span>Конфигурация Windows</span>**<span> → </span>**<span>Настройки безопасности</span>**<span> → </span>**<span>Локальные политики</span>**<span> → </span>**<span>Назначение прав пользователя</span>**<span>.</span>
3. <span>Дважды кликните </span>**<span>Блокировка страниц в памяти</span>**<span>.</span>
4. <span>Добавьте SID службы Database Engine </span><span>.</span>
5. <span>Перезапустите SQL Server.</span>

**<span>Проверка:</span>**

<div class="md-code-block md-code-block-dark" id="bkmrk-sql"><div class="md-code-block-banner-wrap"><div class="md-code-block-banner md-code-block-banner-lite"><div class="_121d384"><div class="d2a24f03"><span class="d813de27">sql</span></div></div></div></div></div>```
SELECT sql_memory_model_desc FROM sys.dm_os_sys_info;
-- Должно вернуть LOCK_PAGES
```

<div class="md-code-block md-code-block-dark" id="bkmrk--3"></div>---

### <span>1.3. Установите режим электропитания «Высокая производительность»</span>

**<span>Что даёт:</span>**<span> Предотвращает занижение частоты процессора ОС.</span>

**<span>Как включить:</span>**

1. **<span>Панель управления</span>**<span> → </span>**<span>Электропитание</span>**<span> → </span>**<span>Схемы управления электропитанием</span>**<span>.</span>
2. <span>Установите значение </span>**<span>Высокая производительность</span>**<span>.</span>

> **<span>Примечание:</span>**<span> Turbo Boost в BIOS — на современных серверных платформах обычно включён по умолчанию, отдельная настройка не требуется.</span>

---

### <span>1.4. Отключите ненужные службы SQL Server</span>

**<span>Что даёт:</span>**<span> Освобождает ресурсы для основной службы СУБД </span><span>.</span>

**<span>Оставьте только:</span>**

- <span>SQL Server (sqlservr.exe)</span>
- <span>SQL Server Agent (SQLAGENT.exe)</span>
- <span>SQL Writer (sqlwriter.exe)</span>

**<span>Отключите:</span>**

- <span>FullText Search (у 1С собственный механизм полнотекстового поиска)</span>
- <span>Integration Services</span>
- <span>Analysis Services (если не используются)</span>

---

## <span>Часть 2. Настройки памяти и параллелизма</span>

### <span>2.1. Ограничьте максимальный объём памяти (Max Server Memory)</span>

**<span>Что даёт:</span>**<span> Предотвращает потребление всей RAM сервером СУБД.</span>

**<span>Формула расчёта:</span>**

<div class="md-code-block md-code-block-dark" id="bkmrk-text"><div class="md-code-block-banner-wrap"><div class="md-code-block-banner md-code-block-banner-lite"><div class="_121d384"><div class="d2a24f03"><span class="d813de27">text</span></div></div></div></div></div>```
Память для SQL Server = Общая RAM – Память для ОС – Память для сервера 1С
```

<div class="md-code-block md-code-block-dark" id="bkmrk--7"></div>**<span>Современные рекомендации:</span>**

- <span>Для ОС: 4 ГБ (или 20–25% RAM, если сервер выделен только под SQL)</span>
- <span>Для сервера 1С: сумма потребления </span>`ragent`<span>, </span>`rmngr`<span>, </span>`rphost`<span> в пик нагрузки + 1–1,5 ГБ на каждый процесс rphost </span>

**<span>Как настроить:</span>**

1. <span>Management Studio → </span>**<span>Свойства сервера</span>**<span> → вкладка </span>**<span>Память</span>**<span>.</span>
2. <span>Укажите значение параметра </span>**<span>Максимальный размер памяти сервера</span>**<span>.</span>

---

### <span>2.2. Настройте Max Degree of Parallelism (MAXDOP)</span>

**<span>Что даёт:</span>**<span> Определяет, во сколько потоков может выполняться один запрос. Для баз с нагрузкой 1С рекомендуется MAXDOP = 1 </span><span>.</span>

**<span>Почему важно:</span>**<span> При высоких значениях MAXDOP возникают ожидания </span>`CXPACKET`<span> и </span>`CXCONSUMER`<span>, когда один сложный отчёт блокирует процессорные ядра и вытесняет оперативные транзакции </span><span>.</span>

**<span>Как настроить:</span>**

1. <span>Management Studio → </span>**<span>Свойства сервера</span>**<span> → вкладка </span>**<span>Дополнительно</span>**<span>.</span>
2. <span>Установите </span>**<span>Max Degree of Parallelism</span>**<span> = 1.</span>

---

### <span>2.3. Настройте Cost Threshold for Parallelism</span>

**<span>Что даёт:</span>**<span> Порог, при котором запрос распараллеливается. Значение по умолчанию (5) устарело </span><span>.</span>

**<span>Рекомендация:</span>**<span> Установите значение </span>**<span>50–100</span>**<span>, чтобы избежать распараллеливания простых запросов.</span>

**<span>Как настроить:</span>**

<div class="md-code-block md-code-block-dark" id="bkmrk-sql-1"><div class="md-code-block-banner-wrap"><div class="md-code-block-banner md-code-block-banner-lite"><div class="_121d384"><div class="d2a24f03"><span class="d813de27">sql</span></div></div></div></div></div>```
EXEC sp_configure 'cost threshold for parallelism', 50;
RECONFIGURE;
```

<div class="md-code-block md-code-block-dark" id="bkmrk--10"></div>---

### <span>2.4. Настройте Maximum Worker Threads</span>

**<span>Что даёт:</span>**<span> По умолчанию сервер не создаёт больше 255 потоков, чего может не хватать при высокой нагрузке.</span>

**<span>Рекомендация:</span>**<span> Установите значение </span>**<span>2048</span>**<span> </span><span>.</span>

---

## <span>Часть 3. Оптимизация TempDB</span>

### <span>3.1. Создайте несколько файлов данных TempDB</span>

**<span>Что даёт:</span>**<span> Устраняет контеншн на страницах PFS/GAM, который возникает при одновременном создании временных таблиц сотнями сессий 1С </span><span>.</span>

**<span>Правила конфигурирования:</span>**

<div class="ds-scroll-area ds-scroll-area--show-on-focus-within ds-scroll-area--enabled _1210dd7 c03cafe9" id="bkmrk-%D0%9A%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%BE-%D1%8F%D0%B4%D0%B5%D1%80-cpu-"><div class="ds-scroll-area__gutters"><div class="ds-scroll-area__horizontal-gutter">  
</div><div class="ds-scroll-area__vertical-gutter">  
</div></div><table><thead><tr><th><span>Количество ядер CPU</span></th><th><span>Количество файлов данных</span></th></tr></thead><tbody><tr><td><span>≤ 8</span></td><td><span>Ровно столько, сколько ядер</span></td></tr><tr><td><span>&gt; 8</span></td><td><span>Начните с 8, при сохранении ожиданий увеличивайте кратно 4 (12, 16...)</span></td></tr></tbody></table>

</div>**<span>Требования:</span>**

- <span>Все файлы должны иметь </span>**<span>одинаковый начальный размер</span>**<span> (например, 8 файлов по 10 ГБ)</span>
- **<span>Фиксированный шаг авторасширения</span>**<span> в мегабайтах (например, 1024 МБ), но не в процентах </span>

---

### <span>3.2. Разместите TempDB на быстром накопителе</span>

**<span>Что даёт:</span>**<span> TempDB используется всеми базами для временных таблиц, промежуточных расчётов, версий строк при RCSI </span><span>.</span>

**<span>Рекомендации:</span>**

- <span>Отдельный RAID 10 из NVMe PCIe 4.0/5.0 накопителей</span>
- <span>Форматирование тома NTFS/ReFS с размером кластера 64 КБ </span>

**<span>Скрипт для переноса:</span>**

<div class="md-code-block md-code-block-dark" id="bkmrk-sql-2"><div class="md-code-block-banner-wrap"><div class="md-code-block-banner md-code-block-banner-lite"><div class="_121d384"><div class="d2a24f03"><span class="d813de27">sql</span></div></div></div></div></div>```
USE master
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = tempdev, FILENAME = 'Новый_Диск:\Новый_Каталог\tempdb.mdf')
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = templog, FILENAME = 'Новый_Диск:\Новый_Каталог\templog.ldf')
GO
```

<div class="md-code-block md-code-block-dark" id="bkmrk--14"></div>---

### <span>3.3. Диагностика контеншна TempDB</span>

**<span>Скрипт для выявления проблемных сессий:</span>**

<div class="md-code-block md-code-block-dark" id="bkmrk-sql-3"><div class="md-code-block-banner-wrap"><div class="md-code-block-banner md-code-block-banner-lite"><div class="_121d384"><div class="d2a24f03"><span class="d813de27">sql</span></div></div></div></div></div>```
-- Диагностика ожиданий на страницах аллокации tempdb
SELECT 
    session_id,
    wait_type,
    wait_duration_ms,
    resource_description,
    blocking_session_id
FROM sys.dm_os_waiting_tasks
WHERE wait_type LIKE 'PAGELATCH_%'
  AND resource_description LIKE '2:%'; -- База данных 2 = tempdb
```

<div class="md-code-block md-code-block-dark" id="bkmrk--16"></div><span>Если ожидания </span>`PAGELATCH_UP`<span> или </span>`PAGELATCH_EX`<span> сохраняются — увеличьте количество файлов данных </span><span>.</span>

---

## <span>Часть 4. Настройки рабочих баз данных</span>

### <span>4.1. Настройте автовыращивание файлов</span>

**<span>Что даёт:</span>**<span> Слишком маленький шаг авторасширения приводит к частому расширению файлов и потере времени </span><span>.</span>

**<span>Рекомендации:</span>**

- <span>Для файлов данных: </span>**<span>200–512 МБ</span>**<span> или </span>**<span>512 МБ – 5 ГБ</span>**<span> для крупных баз</span>
- <span>Для файлов логов: </span>**<span>50–200 МБ</span>**
- **<span>Не используйте процентное автовыращивание!</span>**

**<span>Как настроить:</span>**

1. <span>Management Studio → </span>**<span>Свойства базы</span>**<span> → вкладка </span>**<span>Файлы</span>**<span>.</span>
2. <span>Напротив каждого файла в колонке </span>**<span>Автовувеличение</span>**<span> укажите значение в МБ.</span>

> <span>Для применения ко всем новым базам настройте служебную базу </span>**<span>model</span>**<span>.</span>

---

### <span>4.2. Разнесите файлы данных (.mdf) и логов (.ldf) на разные диски</span>

**<span>Что даёт:</span>**<span> Параллельная работа с файлами повышает скорость дисковых операций. Лучше всего подходят SSD </span><span>.</span>

---

### <span>4.3. Используйте правильную сортировку (Collation)</span>

**<span>Что даёт:</span>**<span> Устаревшие настройки сортировки могут приводить к ошибкам при сравнении строк и индексации.</span>

**<span>Рекомендация для новых баз 1С:</span>**

- `Latin1_General_100_CI_AS`<span> (современный стандарт)</span>
- `Cyrillic_General_100_CI_AS`<span> (альтернатива)</span>

---

### <span>4.4. Рассмотрите включение RCSI (READ\_COMMITTED\_SNAPSHOT)</span>

**<span>Что даёт:</span>**<span> Снижает количество блокировок при чтении, что особенно актуально для многопользовательских систем на 1С </span><span>.</span>

**<span>Как включить:</span>**

<div class="md-code-block md-code-block-dark" id="bkmrk-sql-4"><div class="md-code-block-banner-wrap"><div class="md-code-block-banner md-code-block-banner-lite"><div class="_121d384"><div class="d2a24f03"><span class="d813de27">sql</span></div></div></div></div></div>```
ALTER DATABASE [ИмяБазы] SET READ_COMMITTED_SNAPSHOT ON;
```

<div class="md-code-block md-code-block-dark" id="bkmrk--21"></div>> **<span>Внимание:</span>**<span> Требует хорошо оптимизированной TempDB.</span>

---

## <span>Часть 5. Обслуживание и мониторинг</span>

### <span>5.1. Регламентное обслуживание индексов</span>

**<span>Что даёт:</span>**<span> Фрагментация индексов &gt; 25% резко снижает производительность </span><span>.</span>

**<span>Рекомендации:</span>**

- **<span>Ежедневно:</span>**<span> Дефрагментация индексов и обновление статистики (не требует отключения пользователей)</span>
- **<span>Еженедельно:</span>**<span> Полная переиндексация с блокировкой БД (в нерабочее время) </span>

---

### <span>5.2. Мониторинг TempDB при закрытии месяца</span>

**<span>Что даёт:</span>**<span> Закрытие месяца часто замедляется из-за переполнения TempDB неоптимальными запросами </span><span>.</span>

**<span>Диагностический скрипт:</span>**

<div class="md-code-block md-code-block-dark" id="bkmrk-sql-5"><div class="md-code-block-banner-wrap"><div class="md-code-block-banner md-code-block-banner-lite"><div class="_121d384"><div class="d2a24f03"><span class="d813de27">sql</span></div></div></div></div></div>```
SELECT 
    session_id,
    SUM(internal_objects_alloc_page_count) AS alloc_pages,
    SUM(internal_objects_dealloc_page_count) AS dealloc_pages,
    SUM(user_objects_alloc_page_count) AS user_alloc_pages
FROM sys.dm_db_session_space_usage
GROUP BY session_id
ORDER BY alloc_pages DESC;
```

<div class="md-code-block md-code-block-dark" id="bkmrk--24"></div><span>Если </span>`alloc_pages`<span> превышает 500 000 — требуется пересмотр плана запроса </span><span>.</span>

**<span>Признаки проблемы:</span>**

- <span>Размер TempDB растёт быстрее 1 ГБ в минуту</span>
- <span>Процессор загружен менее чем на 30%</span>

---

### <span>5.3. Настройте резервное копирование</span>

**<span>Что даёт:</span>**<span> Резервные копии необходимо делать средствами самой СУБД, а не сторонними системами </span><span>.</span>

---

## <span>Часть 6. Дополнительные рекомендации</span>

### <span>6.1. Исключите каталоги баз данных из антивирусного сканирования</span>

<span>Антивирусное сканирование файлов базы может сильно замедлить работу СУБД. В идеале антивирус на сервере СУБД вообще не устанавливать.</span>

---

### <span>6.2. Отключите сжатие данных для каталогов с файлами базы</span>

<span>При сжатии ОС дополнительно обрабатывает файлы при модификации, что замедляет запись.</span>

**<span>Как отключить:</span>**

1. **<span>Свойства</span>**<span> каталога → вкладка </span>**<span>Общие</span>**<span> → кнопка </span>**<span>Другие</span>**<span>.</span>
2. <span>Снимите флаг </span>**<span>Сжимать содержимое для экономии места на диске</span>**<span>.</span>

---

### <span>6.3. Включите Shared Memory (если сервер 1С на том же компьютере)</span>

**<span>Как включить:</span>**

1. **<span>Диспетчер конфигурации SQL Server</span>**<span> → </span>**<span>SQL Native Client</span>**<span> → </span>**<span>Клиентские протоколы</span>**<span> → </span>**<span>Общая память</span>**<span> → </span>**<span>Включено</span>**<span>.</span>
2. <span>Протокол </span>**<span>Именованные каналы</span>**<span> выключите.</span>

**<span>После всех настроек перезапустите службу MS SQL Server.</span>**

---

## <span>Сводная таблица ключевых параметров</span>

<div class="ds-scroll-area ds-scroll-area--show-on-focus-within ds-scroll-area--enabled _1210dd7 c03cafe9" id="bkmrk-%D0%9F%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80-%D0%A0%D0%B5%D0%BA%D0%BE%D0%BC%D0%B5%D0%BD%D0%B4%D1%83%D0%B5%D0%BC"><div class="ds-scroll-area__gutters"><div class="ds-scroll-area__horizontal-gutter">  
</div><div class="ds-scroll-area__vertical-gutter">  
</div></div><table><thead><tr><th><span>Параметр</span></th><th><span>Рекомендуемое значение</span></th></tr></thead><tbody><tr><td><span>Max Server Memory</span></td><td><span>Общая RAM – 4 ГБ (ОС) – память 1С</span></td></tr><tr><td><span>Max Degree of Parallelism</span></td><td><span>1</span></td></tr><tr><td><span>Cost Threshold for Parallelism</span></td><td><span>50–100</span></td></tr><tr><td><span>Maximum Worker Threads</span></td><td><span>2048</span></td></tr><tr><td><span>Файлы данных TempDB</span></td><td><span>По количеству ядер (мин. 8)</span></td></tr><tr><td><span>Автовыращивание данных</span></td><td><span>512 МБ – 5 ГБ</span></td></tr><tr><td><span>Автовыращивание логов</span></td><td><span>50–200 МБ</span></td></tr><tr><td><span>Сортировка</span></td><td><span>Latin1\_General\_100\_CI\_AS</span></td></tr></tbody></table>

</div>---

## <span>Рекомендуемые версии SQL Server на 2026 год</span>

<div class="ds-scroll-area ds-scroll-area--show-on-focus-within ds-scroll-area--enabled _1210dd7 c03cafe9" id="bkmrk-%D0%92%D0%B5%D1%80%D1%81%D0%B8%D1%8F-%D0%A1%D1%82%D0%B0%D1%82%D1%83%D1%81-sql-se"><div class="ds-scroll-area__gutters"><div class="ds-scroll-area__horizontal-gutter">  
</div><div class="ds-scroll-area__vertical-gutter">  
</div></div><table><thead><tr><th><span>Версия</span></th><th><span>Статус</span></th></tr></thead><tbody><tr><td><span>SQL Server 2019</span></td><td><span>Стабильная, проверенная</span></td></tr><tr><td><span>SQL Server 2022</span></td><td><span>Рекомендуемая</span></td></tr><tr><td><span>SQL Server 2025</span></td><td><span>Для новых внедрений</span></td></tr></tbody></table>

</div>> <span>Старые версии (2016 и ранее) приближаются к концу жизненного цикла и требуют расширенной поддержки.</span>

---

## <span>Заключение</span>

<span>Данный чек-лист представляет собой обновлённую версию рекомендаций 2016 года с учётом современных реалий. Ключевые изменения касаются используемых версий SQL Server, тонкой настройки TempDB, выбора правильной сортировки и порога параллелизма.</span>

<span>Для поддержания стабильной работы базы данных важно также не забывать о регулярном обслуживании: обновлении статистики и перестройке индексов.</span>

---

**<span>Источники и дополнительные материалы:</span>**

- <span>Оригинальное руководство: Насипов Фарит и Евгений Гилев, ООО «ОдинКурс», 2016</span>
- [<span>Microsoft Learn: Database Instant File Initialization</span>](https://learn.microsoft.com/ru-ru/sql/relational-databases/databases/database-instant-file-initialization)
- [<span>Microsoft Learn: Enable Lock Pages in Memory</span>](https://learn.microsoft.com/ru-ru/sql/database-engine/configure-windows/enable-the-lock-pages-in-memory-option-windows)
- [<span>Фирма 1С: Работа с базой данных TEMPDB</span>](https://its.1c.ru/db/content/metod8dev/src/admins/mssqlserver/i8102374.htm)

# Урезание логов и перевод баз 1С:Предприятие в модель SIMPLE

## <span>Назначение</span>

<span>Скрипт предназначен для </span>**<span>продуктивных (рабочих) баз 1С:Предприятие</span>**<span> на Microsoft SQL Server. Его задача — перевести все пользовательские базы в модель восстановления </span>`SIMPLE`<span> и освободить место, занимаемое файлами журналов транзакций (LDF).</span>

<span>Данный подход является стандартной практикой для продуктовых баз 1С, поскольку восстановление на момент времени (point-in-time recovery) в 1С связано с существенными сложностями и на практике применяется редко.</span>

> **<span>Внимание!</span>**<span> Риски применения описаны в сноске в конце статьи. Ознакомьтесь с ними перед запуском скрипта на продуктовом контуре.</span>

---

## <span>Скрипт</span>

<div class="md-code-block md-code-block-dark" id="bkmrk-sql"><div class="md-code-block-banner-wrap"><div class="md-code-block-banner md-code-block-banner-lite"><div class="_121d384"><div class="d2a24f03"><span class="d813de27">sql</span></div></div></div></div></div>```
----------------------------------------------------------
-- СЛУЖЕБНЫЕ ПЕРЕМЕННЫЕ
DECLARE @db_name      NVARCHAR(100); -- имя базы данных
DECLARE @db_name_q    NVARCHAR(300); -- экранированное имя базы
DECLARE @sql          NVARCHAR(MAX); -- текст динамического SQL

DECLARE cursor_size_srv CURSOR FOR

-- Выбираем все базы, кроме системных
SELECT name AS DBName
FROM sys.databases
WHERE name NOT IN ('master','msdb','model','tempdb')
ORDER BY name;

-- Цикл по всем базам, попавшим в выборку
OPEN cursor_size_srv;
FETCH NEXT FROM cursor_size_srv INTO @db_name;

WHILE (@@FETCH_STATUS = 0)
BEGIN
    -- Экранируем имя базы (оборачиваем в [ ] и удваиваем ])
    SET @db_name_q = QUOTENAME(@db_name);

    -- Формируем текст динамического SQL
    SET @sql = N'
        DECLARE @logname NVARCHAR(100);
        USE ' + @db_name_q + N';
        SELECT @logname = name FROM sys.database_files WHERE type = 1;
        ALTER DATABASE ' + @db_name_q + N' SET RECOVERY SIMPLE;
        DBCC SHRINKFILE (@logname, EMPTYFILE);';

    -- Выполняем
    EXEC (@sql);

    -- Следующая база данных
    FETCH NEXT FROM cursor_size_srv INTO @db_name;
END

CLOSE cursor_size_srv;
DEALLOCATE cursor_size_srv;
----------------------------------------------------------
```

<div class="md-code-block md-code-block-dark" id="bkmrk--1"></div>---

## <span>Разбор логики работы</span>

### <span>1. Объявление переменных и курсора</span>

<div class="md-code-block md-code-block-dark" id="bkmrk-sql-1"><div class="md-code-block-banner-wrap"><div class="md-code-block-banner md-code-block-banner-lite"><div class="_121d384"><div class="d2a24f03"><span class="d813de27">sql</span></div></div></div></div></div>```
DECLARE @db_name      NVARCHAR(100);
DECLARE @db_name_q    NVARCHAR(300);
DECLARE @sql          NVARCHAR(MAX);

DECLARE cursor_size_srv CURSOR FOR
SELECT name AS DBName
FROM sys.databases
WHERE name NOT IN ('master','msdb','model','tempdb')
ORDER BY name;
```

<div class="md-code-block md-code-block-dark" id="bkmrk--3"></div><span>Курсор проходит по всем базам на экземпляре, исключая системные (</span>`master`<span>, </span>`msdb`<span>, </span>`model`<span>, </span>`tempdb`<span>). Это защищает от случайного изменения настроек системных баз.</span>

<span>Переменные:</span>

- `@db_name`<span> — имя текущей базы из курсора.</span>
- `@db_name_q`<span> — экранированное имя (в квадратных скобках).</span>
- `@sql`<span> — текст динамического SQL для выполнения.</span>

### <span>2. Перебор баз в цикле</span>

<div class="md-code-block md-code-block-dark" id="bkmrk-sql-2"><div class="md-code-block-banner-wrap"><div class="md-code-block-banner md-code-block-banner-lite"><div class="_121d384"><div class="d2a24f03"><span class="d813de27">sql</span></div></div></div></div></div>```
OPEN cursor_size_srv;
FETCH NEXT FROM cursor_size_srv INTO @db_name;

WHILE (@@FETCH_STATUS = 0)
BEGIN
    ...
    FETCH NEXT FROM cursor_size_srv INTO @db_name;
END
```

<div class="md-code-block md-code-block-dark" id="bkmrk--4"></div><span>Стандартный паттерн работы с курсором: открыть, получить первую строку, обрабатывать в цикле, пока </span>`@@FETCH_STATUS = 0`<span>.</span>

### <span>3. Экранирование имени базы</span>

<div class="md-code-block md-code-block-dark" id="bkmrk-sql-3"><div class="md-code-block-banner-wrap"><div class="md-code-block-banner md-code-block-banner-lite"><div class="_121d384"><div class="d2a24f03"><span class="d813de27">sql</span></div></div></div></div></div>```
SET @db_name_q = QUOTENAME(@db_name);
```

<div class="md-code-block md-code-block-dark" id="bkmrk--5"></div><span>Функция </span>`QUOTENAME()`<span> оборачивает имя в квадратные скобки и удваивает встречающиеся внутри </span>`]`<span>. Это делает скрипт устойчивым к любым именам баз:</span>

- **<span>Имена, начинающиеся с цифры</span>**<span> (например, </span>`1C_Prod`<span>) — без экранирования вызывают синтаксическую ошибку, так как не являются допустимыми обычными идентификаторами SQL Server.</span>
- **<span>Имена с пробелами и спецсимволами</span>**<span> (например, </span>`База 1С Прод`<span>).</span>

<span>Важно: </span>`QUOTENAME()`<span> вызывается </span>**<span>на уровне внешнего скрипта</span>**<span>, а не внутри строки </span>`EXEC`<span>. В строку динамического SQL подставляется уже готовое значение </span>`@db_name_q`<span>.</span>

### <span>4. Формирование и выполнение динамического SQL</span>

<div class="md-code-block md-code-block-dark" id="bkmrk-sql-4"><div class="md-code-block-banner-wrap"><div class="md-code-block-banner md-code-block-banner-lite"><div class="_121d384"><div class="d2a24f03"><span class="d813de27">sql</span></div></div></div></div></div>```
SET @sql = N'
    DECLARE @logname NVARCHAR(100);
    USE ' + @db_name_q + N';
    SELECT @logname = name FROM sys.database_files WHERE type = 1;
    ALTER DATABASE ' + @db_name_q + N' SET RECOVERY SIMPLE;
    DBCC SHRINKFILE (@logname, EMPTYFILE);';

EXEC (@sql);
```

<div class="md-code-block md-code-block-dark" id="bkmrk--6"></div><span>Ключевые шаги внутри динамического SQL:</span>

- **`USE [db_name]`**<span> — переключение контекста на текущую базу (нужно для </span>`sys.database_files`<span>).</span>
- **`SELECT @logname = name FROM sys.database_files WHERE type = 1`**<span> — получаем логическое имя файла журнала (</span>`type = 1`<span>).</span>
- **`ALTER DATABASE [db_name] SET RECOVERY SIMPLE`**<span> — переводим базу в простую модель восстановления.</span>
- **`DBCC SHRINKFILE (@logname, EMPTYFILE)`**<span> — очищаем файл журнала, перемещая все страницы в другой файл той же файловой группы.</span>

### <span>5. Особенность объявления </span>`@logname`

<span>Переменная </span>`@logname`<span> объявлена </span>**<span>внутри динамического SQL</span>**<span>, а не снаружи. Это сделано намеренно: при смене контекста через </span>`USE`<span> переменная из внешнего блока была бы недоступна для </span>`DBCC SHRINKFILE`<span>.</span>

### <span>6. Типы переменных</span>

- `@db_name_q NVARCHAR(300)`<span> — с запасом под скобки и удвоение символов </span>`]`<span>.</span>
- `@sql NVARCHAR(MAX)`<span> — снимает ограничение в 4000 символов, если имя базы длинное или добавляются дополнительные команды.</span>
- <span>Строковые литералы помечены префиксом </span>`N`<span> для корректной работы с Unicode (кириллица в именах баз).</span>

---

## <span>Рекомендации по применению</span>

### <span>Перед запуском</span>

1. **<span>Сделайте полный бэкап</span>**<span> всех целевых баз. Это обязательное условие.</span>
2. **<span>Убедитесь, что модель SIMPLE допустима</span>**<span> для всех баз, попадающих в выборку.</span>
3. **<span>Запускайте в окно обслуживания</span>**<span> — </span>`SHRINKFILE`<span> может блокировать операции записи.</span>
4. **<span>Проверьте initial size</span>**<span> файла журнала. Если задано большое значение (например, 100 ГБ), шринк не уменьшит файл ниже этой отметки.</span>

### <span>После перевода в SIMPLE</span>

<span>Если требуется физически уменьшить файл журнала до разумного размера, добавьте после </span>`EMPTYFILE`<span> команду:</span>

<div class="md-code-block md-code-block-dark" id="bkmrk-sql-5"><div class="md-code-block-banner-wrap"><div class="md-code-block-banner md-code-block-banner-lite"><div class="_121d384"><div class="d2a24f03"><span class="d813de27">sql</span></div></div></div></div></div>```
DBCC SHRINKFILE (@logname, 512); -- 512 МБ, подберите под задачу
```

<div class="md-code-block md-code-block-dark" id="bkmrk--8"></div>### <span>Компенсация отсутствия PITR</span>

<span>После перевода в </span>`SIMPLE`<span> восстановление возможно только на момент последнего полного или дифференциального бэкапа. Необходимо:</span>

- **<span>Делать полные бэкапы часто</span>**<span> — с учётом допустимого окна потери данных.</span>
- **<span>Использовать дифференциальные бэкапы</span>**<span> каждые несколько часов для активных баз.</span>
- **<span>Регулярно проверять бэкапы восстановлением</span>**<span> в тестовую базу.</span>

### <span>Проверка результата</span>

<div class="md-code-block md-code-block-dark" id="bkmrk-sql-6"><div class="md-code-block-banner-wrap"><div class="md-code-block-banner md-code-block-banner-lite"><div class="_121d384"><div class="d2a24f03"><span class="d813de27">sql</span></div></div></div></div></div>```
SELECT
    d.name AS DatabaseName,
    d.recovery_model_desc,
    f.name AS FileName,
    f.type_desc,
    f.size * 8 / 1024 AS SizeMB
FROM sys.databases d
JOIN sys.master_files f ON f.database_id = d.database_id
ORDER BY d.name, f.type_desc;
```

<div class="md-code-block md-code-block-dark" id="bkmrk--9"></div>### <span>Особенность 1С: журнал может не урезаться до минимума</span>

<span>Даже в модели </span>`SIMPLE`<span> размер журнала транзакций определяется </span>**<span>максимальным размером одной транзакции</span>**<span>. В 1С это особенно заметно при массивных операциях: перепроведение документов, закрытие месяца, реструктуризация базы. Если типичная операция занимает несколько гигабайт в логе, минимальный размер LDF не будет меньше этой величины.</span>

<span>Если журнал снова быстро растёт после урезания — проверьте, нет ли аномально длительных операций в 1С.</span>

---

## <span>Сноска: риски применения</span>

> **<span>Внимание! Перед запуском скрипта на продуктовом контуре ознакомьтесь с рисками.</span>**

**<span>1. Потеря возможности восстановления на момент времени (PITR).</span>**

<span>Перевод базы в модель </span>`SIMPLE`<span> делает невозможным восстановление на произвольный момент между полными бэкапами. При сбое вы сможете восстановиться только на момент последнего полного или дифференциального бэкапа. Вся работа, выполненная после него, будет потеряна.</span>

**<span>2. Несовместимость с технологиями репликации.</span>**

<span>Модель </span>`SIMPLE`<span> не поддерживается для групп доступности Always On (AG), лог-шиппинга (Log Shipping) и репликации транзакций. Если эти технологии настроены, их работа будет нарушена.</span>

**<span>3. Невозможность точечного отката ошибок пользователей.</span>**

<span>При ошибочных действиях пользователя (массовое удаление, некорректное перепроведение документов, закрытие смены ККМ) откатить изменения до нужного момента без PITR невозможно — придётся восстанавливать базу из последнего бэкапа и повторно вводить данные.</span>

**<span>4. Блокировка операций во время SHRINKFILE.</span>**

`DBCC SHRINKFILE (... , EMPTYFILE)`<span> может длительное время ожидать завершения активных транзакций. На продуктовой базе это приведёт к блокировкам и замедлению работы пользователей.</span>

**<span>5. Журнал может не уменьшиться.</span>**

<span>Даже после перевода в </span>`SIMPLE`<span> и шринка файл журнала не станет меньше максимального размера одной транзакции. Для 1С характерны крупные транзакции (закрытие месяца, перепроведение, реструктуризация), поэтому ожидания «лога в 100 МБ» могут не оправдаться.</span>

**<span>6. Ограничение по initial size.</span>**

<span>Если в свойствах базы задан большой начальный размер файла журнала, шринк не уменьшит файл ниже этой отметки. Требуется предварительная корректировка начального размера.</span>

**<span>7. Необходимость частых бэкапов.</span>**

<span>После перехода в </span>`SIMPLE`<span> критически важно обеспечить регулярные полные и дифференциальные бэкапы. Без них при сбое возможна потеря существенного объёма данных.</span>

**<span>8. Требования аудита и регуляторов.</span>**

<span>Некоторые отрасли и внутренние регламенты требуют возможности восстановления на произвольный момент времени. Перевод в </span>`SIMPLE`<span> может нарушить эти требования.</span>

**<span>Рекомендация.</span>**<span> Перед запуском скрипта на продуктовом контуре согласуйте решение с ответственными за сохранность данных и убедитесь, что выбранная стратегия резервного копирования компенсирует отсутствие PITR.</span>

---

## <span>Итог</span>

<span>Скрипт предназначен для продуктовых баз 1С:Предприятие и решает задачу перевода баз в модель </span>`SIMPLE`<span> с освобождением журналов транзакций. Благодаря </span>`QUOTENAME()`<span> он корректно работает с любыми именами баз, включая начинающиеся с цифры и содержащие пробелы. Перед запуском на рабочем контуре обязательно ознакомьтесь со сноской о рисках и обеспечьте регулярное резервное копирование.</span>