MAXDOP = 1 для 1С на SQL Server: как убрать зависания при закрытии месяца
Для 1С на Microsoft SQL Server ставьте MAXDOP = 1. По умолчанию стоит 0: SQL Server дробит один тяжёлый запрос на все ядра, а остальные пользователи ждут процессор. Нагрузку 1С и так создают десятки одновременных сеансов, дробить запросы незачем. Настройка меняется без перезапуска: в свойствах сервера или через sp_configure.
⚡ Почему возникает зависание 1С при значении MAXDOP по умолчанию
Девять утра. Сорок человек открывают 1С:ERP: бухгалтерия запускает закрытие месяца, менеджеры проводят реализации, склад печатает накладные. Через минуту проведение встаёт, у кладовщика крутится индикатор, машина у ворот ждёт документы. Диск не перегружен, память свободна, а процессор занят на все ядра.
Это классика SQL Server с MAXDOP = 0. Такое значение стоит по умолчанию и разрешает оптимизатору делить один запрос на потоки, вплоть до 64. Закрытие месяца строит тяжёлый запрос по регистрам, оптимизатор распараллеливает его и занимает все ядра. Запросы менеджеров короткие, но им нужен тот же процессор, поэтому они встают в очередь за чужой работой.
Есть и вторая причина. Параллельный запрос заканчивается, когда доработает самый медленный поток. Запросы 1С содержат много соединений и временных таблиц, оптимизатор ошибается в оценке числа строк, и потоки получают неравную работу. Одни заканчивают сразу и ждут остальных. В статистике ожиданий это выглядит как CXPACKET и CXCONSUMER.
Третья причина организационная. Мастер установки SQL Server 2019 и новее предлагает своё значение MAXDOP, исходя из числа ядер, и администратор принимает его кнопкой «Далее». Получается сервер, настроенный под хранилище данных, а не под учётную систему.
Ставка понятна. Пока запрос-«монополист» держит процессор, стоят проведение и отгрузка, закрытие периода уезжает на вечер, а в конце квартала под угрозой срок сдачи отчётности. Так повторяется каждый месяц, и каждый раз кто-то остаётся сверхурочно.
🛠 Как исправить: настройка MAXDOP в SQL Server для 1С
Параметр относится к экземпляру SQL Server, а не к конкретной базе 1С. Перезапускать службу не нужно. Но делайте изменение вне пика: после него кэш планов запросов сбрасывается, и первые минуты сервер компилирует их заново.
Через SSMS
- ✓Подключитесь к экземпляру под учётной записью с ролью sysadmin.
- ✓Щёлкните правой кнопкой по имени сервера и откройте «Свойства», затем вкладку «Дополнительно».
- ✓В разделе «Параллелизм» найдите «Максимальная степень параллелизма» и впишите 1.
- ✓Нажмите OK. Значение применяется сразу.
Через T-SQL
Под той же учётной записью выполните по очереди три команды:
- ✓EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
- ✓EXEC sp_configure 'max degree of parallelism', 1; RECONFIGURE;
- ✓SELECT name, value_in_use FROM sys.configurations WHERE name = 'max degree of parallelism';
В последнем запросе value_in_use должно показать 1.
Если на одном экземпляре живут несколько баз и не все из них 1С, единица на весь сервер помешает соседям. Начиная с SQL Server 2016 параметр можно задать для одной базы: ALTER DATABASE SCOPED CONFIGURATION SET MAXDOP = 1; команду выполняют в контексте нужной базы. Держать чужие базы рядом с 1С всё равно не стоит, к этому мы вернёмся ниже.
Как проверить, что стало лучше
Не доверяйте ощущениям, замеряйте. До изменения прогоните тест Гилёва и запишите результат. После изменения повторите его на той же базе в то же время суток.
Второй замер: топ ожиданий в sys.dm_os_wait_stats. Счётчики там накопительные с момента запуска службы, поэтому сравнивайте два снимка с интервалом, а не общий итог. После перехода на единицу CXPACKET и CXCONSUMER должны уйти из верхних строк. Третий, самый показательный тест: то самое закрытие месяца. Засеките время и посмотрите, проводят ли менеджеры документы, пока оно идёт.
📊 Какое значение MAXDOP выбрать, если единица не подходит
Единица подходит для оперативной работы. Но правило не универсально, и у каждого значения свой сценарий.
| Значение | Как выполняется запрос | Где применять | На что смотреть |
|---|---|---|---|
| 0 (по умолчанию) | SQL Server сам выбирает число потоков, до 64 | Хранилища данных, разовые выгрузки без пользователей | Один запрос занимает все ядра, остальные ждут процессор |
| 1 | Запрос идёт в одном потоке | Оперативная работа 1С: проведение, закрытие месяца, типовые отчёты | Одиночный тяжёлый запрос считается дольше, зато нагрузка на ядра ровная |
| 2–4 | Запрос делится на 2–4 потока | Отдельная база или копия под аналитику и выгрузки | Значение подбирают замерами, задают на уровне базы |
| Больше 4 | Запрос делится на 5 и более потоков | Ночные пакетные расчёты на сервере без пользователей | Днём в оперативной базе не оставлять |
Практическое правило: рабочую базу держите на единице, а тяжёлую аналитику выносите. Если отчёты для руководства строятся по копии базы на отдельном экземпляре, там можно поднять значение и не задеть пользователей основной базы. Для крупных систем вроде 1С:ERP такую схему закладывают на этапе проекта: проведение и закрытие месяца живут на одном экземпляре, аналитика на другом.
Что делать, если ошибка повторяется: MAXDOP стоит, а 1С всё равно тормозит
Значит, причина в другом. Идите по списку от дешёвого к дорогому.
- ✓Убедитесь, что единица действительно применена. Запрос к sys.configurations должен вернуть value_in_use = 1, а в sys.database_scoped_configurations у вашей базы не должно быть другого ненулевого значения MAXDOP: оно перекрывает настройку экземпляра.
- ✓Проверьте схему электропитания Windows Server. Нужна «Высокая производительность»: на «Сбалансированной» частота ядер плавает, а 1С чувствительна к скорости одного ядра.
- ✓Посмотрите на память. Если SQL Server и сервер приложений 1С делят одну виртуальную машину, а max server memory не задан, SQL Server забирает почти всю оперативную память, и система уходит в подкачку.
- ✓Проверьте tempdb. 1С активно использует временные таблицы, поэтому нужны несколько файлов одинакового размера на быстром диске. Обычно берут столько файлов, сколько ядер, но не больше восьми.
- ✓Убедитесь, что по расписанию обновляется статистика и обслуживаются индексы. Без этого оптимизатор строит планы по устаревшим данным, и вчерашний быстрый запрос сегодня тормозит. Особенно это заметно после массовой загрузки данных. Если тормоза начались сразу после обновления 1С, начните со статистики.
- ✓Сравните железо с системными требованиями 1С и результатом теста Гилёва у похожих конфигураций. 1С лучше работает на меньшем числе быстрых ядер, чем на большом числе медленных.
- ✓Если тормозит один конкретный отчёт или обработка, а остальное работает, сервер ни при чём. Причина в запросе, и его нужно переписывать: это задача для доработки 1С.
🔒 Как предотвратить возврат проблемы
- ✓Внесите параметры экземпляра в чек-лист любого переезда. MAXDOP хранится в самом SQL Server, а не в базе: бэкап и восстановление на новом сервере значение не переносят, и после переезда там снова стоит 0. Это самая частая причина «вернувшихся» тормозов.
- ✓Не селите чужие базы рядом с 1С. Единица на весь экземпляр вредит аналитике, а параметры, удобные аналитике, вредят учёту.
- ✓Прогоняйте тест Гилёва раз в квартал и после каждой смены железа или версии SQL Server. Падение результата видно раньше, чем жалобы пользователей.
- ✓Смотрите топ ожиданий после каждого закрытия месяца. Если CXPACKET снова вылез вверх, кто-то вернул параллелизм или поставил новый экземпляр с настройками по умолчанию.
- ✓Заведите задания обслуживания: обновление статистики, дефрагментация индексов, проверка целостности. Настройте их один раз и проверяйте, что они отработали.
Проще всего не запускать проблему. При внедрении 1С экземпляр SQL Server настраивают до загрузки данных, а не после первых жалоб на тормоза.
Как мы решаем это в ukved.ru и сколько стоит
Вариантов три, выбирайте по ситуации.
- ✓Если в штате есть администратор, сделайте всё по инструкции выше. Это бесплатно и занимает немного времени.
- ✓Если администратора нет, аудит и настройку выполнит наш сисадмин: 3800 руб/час, оплата по фактически потраченному времени. На выходе вы получаете настроенный экземпляр и два замера теста Гилёва, до и после, а не заверение «мы всё поправили».
- ✓Если надоело держать своё железо, база переезжает на наш сервер 1С: от 1 100 ₽/мес за пользователя. Параметры SQL Server проверяет специалист при запуске, они не остаются такими, какими их оставил мастер установки.
Отличие в том, что мы начинаем с измерения, а не с рецепта. Иногда MAXDOP оказывается не причиной: тормозит диск, память или один кривой отчёт. Тогда вы платите за диагностику и сразу узнаёте, куда деньги стоит вкладывать, а куда нет.
❓ Частые вопросы
Какое значение MAXDOP ставить для 1С на SQL Server?
Для оперативной работы 1С (проведение документов, закрытие периода, типовые отчёты) ставьте 1. Так каждый запрос выполняется в одном потоке, ядра остаются доступными всем пользователям, и один тяжёлый отчёт не занимает весь процессор. Для отдельной аналитической базы значение подбирают замерами, обычно в пределах 2–4.
Нужно ли перезагружать сервер после изменения MAXDOP?
Нет. Параметр применяется после команды RECONFIGURE или нажатия OK в свойствах сервера, службу SQL Server и сервер 1С перезапускать не требуется. Делайте изменение вне рабочего пика: кэш планов запросов сбрасывается, и первые минуты запросы компилируются заново. После этого сравните результат тестом Гилёва.
Почему после переноса базы 1С на новый сервер снова тормозит?
MAXDOP хранится на уровне экземпляра SQL Server, а не в самой базе. Бэкап и восстановление переносят данные, но не настройки сервера, поэтому на новом экземпляре снова стоит значение по умолчанию. Включите проверку MAXDOP, памяти и tempdb в чек-лист любого переезда.
Как понять, что 1С тормозит из-за параллелизма, а не из-за железа?
Посмотрите статистику ожиданий в sys.dm_os_wait_stats: CXPACKET и CXCONSUMER в верху списка при высокой загрузке процессора указывают на параллелизм. Счётчики накопительные, поэтому сравнивайте два снимка с интервалом. Ориентируйтесь на разницу, а не на абсолютные цифры. Окончательный вывод даёт замер: тест Гилёва до и после смены MAXDOP.
Сколько стоит настроить SQL Server под 1С?
Работа сисадмина стоит 3800 руб/час, оплата по фактически потраченному времени, без пакетов. Проверка и настройка MAXDOP, памяти, tempdb и заданий обслуживания идёт с замерами до и после. Если проще не держать своё железо, база переезжает на сервер 1С от 1 100 ₽/мес за пользователя.
Или позвоните: +7 906 045-28-27 — в рабочее время с 9:00 до 19:00
Остались вопросы? Нужна помощь?
Менеджеры компании с радостью ответят на ваши вопросы, произведут расчет стоимости услуг и подготовят индивидуальное коммерческое предложение.
Бесплатная консультация

