Ситуация, когда стабильно работающая связка 1С и SQL Server внезапно начинает выдавать ошибки спустя несколько месяцев эксплуатации, — довольно распространенная проблема. Особенно часто это проявляется при использовании MS SQL Server 2019 и платформ 1С версии 8.3.18. Ошибки могут возникать хаотично: при входе в систему, формировании тяжелых отчетов или просто в процессе простоя сессий. Перезапуск служб временно решает проблему, но корень беды кроется в настройках СУБД и особенностях управления ресурсами ОС. Давайте подробно разберем, как привести систему в стабильное состояние.
Одной из главных "новинок" SQL Server 2019 стала функция автоматического встраивания скалярных пользовательских функций (Scalar UDF Inlining). Несмотря на благие намерения разработчиков Microsoft ускорить выполнение запросов, в реальности 1С генерирует крайне сложные конструкции, которые при попытке встраивания вызывают либо критические ошибки SQL, либо аварийное завершение процесса sqlservr.exe.
Проанализируем ситуацию: если ошибки начались "вдруг" на платформе 2019, в первую очередь попробуем отключить этот механизм для базы данных 1С. Для этого выполним следующую команду в SQL Server Management Studio (SSMS):
ALTER DATABASE SCOPED CONFIGURATION SET TSQL_SCALAR_UDF_INLINING = OFF;
Это не повлияет на общую производительность негативно, но исключит целый класс ошибок, связанных с оптимизатором запросов.
Рассмотрим распределение ресурсов на сервере с 64 ГБ ОЗУ. По умолчанию SQL Server настроен на потребление практически всей доступной памяти. Со временем он "раздувается", не оставляя места для операционной системы и процессов сервера приложений 1С (таких как rphost). Это приводит к тому, что 1С не может получить ответ от SQL или сама падает из-за нехватки ресурсов.
Выясним причину нестабильности и установим жесткий лимит для SQL Server. На сервере с 64 ГБ памяти рекомендуется оставить системе и 1С около 10-12 ГБ. Выполним настройку:
Maximum server memory (in MB) в значение порядка 51200 (что соответствует 50 ГБ).Это гарантирует, что у rphost всегда будет пространство для маневра при выполнении тяжелых операций.
Поскольку сервер часто является удаленным, критически важно исключить сетевые задержки и разрывы соединений. Проанализируем настройки сетевых адаптеров. Существуют механизмы оптимизации трафика Windows, которые конфликтуют с SQL Server.
Попробуем отключить TCP Chimney Offload и RSS. Это делается через командную строку от имени администратора:
netsh int tcp set global chimney=disabled
netsh int tcp set global rss=disabled
Также проверим SQL Server Configuration Manager. Если сервер 1С и SQL стоят на одной машине, убедитесь, что протокол Shared Memory включен и стоит первым в списке приоритетов. Это позволит процессам общаться напрямую через память, минуя сетевой стек.
Для баз данных 1С крайне важна правильная настройка уровня параллелизма. Если оставить параметр Max Degree of Parallelism в значении 0 (по умолчанию), один тяжелый запрос пользователя (например, закрытие месяца или сложный отчет) может занять все 8 ядер процессора, заблокировав работу остальных 20 пользователей.
Рассмотрим рекомендации для 8-ядерного процессора: установите значение MAXDOP равным 1, 2 или 4. Для большинства конфигураций 1С значение 1 или 2 является наиболее стабильным, так как предотвращает избыточное дробление простых запросов на потоки.
Если база работает 7-8 месяцев без должного ухода, скорее всего, статистика распределения данных устарела, а индексы сильно фрагментированы. SQL начинает строить неверные планы запросов, что ведет к ошибкам тайм-аута.
Разберем шаги по обслуживанию:
tempdb. Желательно разделить её на несколько файлов (по количеству ядер, в нашем случае — 8 файлов одинакового размера). Это снизит конкуренцию за ресурсы во временной базе.Обновление статистики (Update Statistics).Реорганизацию или Перестройку индексов (Index Rebuild).Если проблема сохраняется и требует периодического перезапуска служб, важно правильно написать скрипт (батник), чтобы он не требовал ручного подтверждения. Обычная команда net stop часто запрашивает подтверждение остановки зависимых служб (например, SQL Agent).
Используем правильный синтаксис для CMD:
net stop MSSQLSERVER /y
net start MSSQLSERVER
net start SQLSERVERAGENT
Или воспользуемся более современным способом через PowerShell, который работает гораздо надежнее:
Restart-Service -Name "MSSQLSERVER" -Force
Параметр -Force принудительно перезапустит SQL Server вместе со всеми зависимыми компонентами без лишних вопросов.
Не стоит забывать и про саму платформу. Версия 8.3.18.1959 имеет известные проблемы с утечками памяти в сессиях. Если есть возможность, проанализируем целесообразность перехода на более свежие ветки, например 8.3.21 или последние сборки 8.3.22. В них исправлено множество ошибок взаимодействия с современными версиями MS SQL Server, включая обработку блокировок и управление пулом соединений.