Как устранить периодические ошибки SQL в работе 1С 8.3 на MS SQL Server 2019

Системный администратор 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Ситуация, когда стабильно работающая связка 1С и SQL Server внезапно начинает выдавать ошибки спустя несколько месяцев эксплуатации, — довольно распространенная проблема. Особенно часто это проявляется при использовании MS SQL Server 2019 и платформ 1С версии 8.3.18. Ошибки могут возникать хаотично: при входе в систему, формировании тяжелых отчетов или просто в процессе простоя сессий. Перезапуск служб временно решает проблему, но корень беды кроется в настройках СУБД и особенностях управления ресурсами ОС. Давайте подробно разберем, как привести систему в стабильное состояние.

Настройка механизма Scalar UDF Inlining (SQL Server 2019)

Одной из главных "новинок" 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;

Это не повлияет на общую производительность негативно, но исключит целый класс ошибок, связанных с оптимизатором запросов.

Управление оперативной памятью (Max Server Memory)

Рассмотрим распределение ресурсов на сервере с 64 ГБ ОЗУ. По умолчанию SQL Server настроен на потребление практически всей доступной памяти. Со временем он "раздувается", не оставляя места для операционной системы и процессов сервера приложений 1С (таких как rphost). Это приводит к тому, что 1С не может получить ответ от SQL или сама падает из-за нехватки ресурсов.

Выясним причину нестабильности и установим жесткий лимит для SQL Server. На сервере с 64 ГБ памяти рекомендуется оставить системе и 1С около 10-12 ГБ. Выполним настройку:

  1. Откройте свойства сервера в SSMS.
  2. Перейдите в раздел Memory (Память).
  3. Установите параметр 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 включен и стоит первым в списке приоритетов. Это позволит процессам общаться напрямую через память, минуя сетевой стек.

Настройка параллелизма (MAXDOP)

Для баз данных 1С крайне важна правильная настройка уровня параллелизма. Если оставить параметр Max Degree of Parallelism в значении 0 (по умолчанию), один тяжелый запрос пользователя (например, закрытие месяца или сложный отчет) может занять все 8 ядер процессора, заблокировав работу остальных 20 пользователей.

Рассмотрим рекомендации для 8-ядерного процессора: установите значение MAXDOP равным 1, 2 или 4. Для большинства конфигураций 1С значение 1 или 2 является наиболее стабильным, так как предотвращает избыточное дробление простых запросов на потоки.

Обслуживание TempDB и регламенты

Если база работает 7-8 месяцев без должного ухода, скорее всего, статистика распределения данных устарела, а индексы сильно фрагментированы. SQL начинает строить неверные планы запросов, что ведет к ошибкам тайм-аута.

Разберем шаги по обслуживанию:

Автоматизация перезапуска служб (Скрипты)

Если проблема сохраняется и требует периодического перезапуска служб, важно правильно написать скрипт (батник), чтобы он не требовал ручного подтверждения. Обычная команда net stop часто запрашивает подтверждение остановки зависимых служб (например, SQL Agent).

Используем правильный синтаксис для CMD:


net stop MSSQLSERVER /y
net start MSSQLSERVER
net start SQLSERVERAGENT

Или воспользуемся более современным способом через PowerShell, который работает гораздо надежнее:


Restart-Service -Name "MSSQLSERVER" -Force

Параметр -Force принудительно перезапустит SQL Server вместе со всеми зависимыми компонентами без лишних вопросов.

Обновление платформы 1С

Не стоит забывать и про саму платформу. Версия 8.3.18.1959 имеет известные проблемы с утечками памяти в сессиях. Если есть возможность, проанализируем целесообразность перехода на более свежие ветки, например 8.3.21 или последние сборки 8.3.22. В них исправлено множество ошибок взаимодействия с современными версиями MS SQL Server, включая обработку блокировок и управление пулом соединений.

← На главную