Рассмотрим одну из самых коварных ошибок, возникающих при работе 1С:Предприятие в связке с Microsoft SQL Server. Суть проблемы заключается в том, что система внезапно прерывает работу с сообщением: «Соединение с сервером баз данных непригодно для использования... SQL Server Native Client 11.0: Запрос COMMIT TRANSACTION не имеет соответствующей инструкции BEGIN TRANSACTION». Проанализируем причины этой ситуации и разберем по шагам методы её решения.
Данная ошибка (код 3902 в SQL Server) чаще всего указывает на «рассинхронизацию» между платформой 1С и СУБД. Проанализируем механизм: платформа инициирует транзакцию, но в процессе выполнения по какой-то причине (сетевой сбой, нехватка ресурсов, таймаут) SQL Server принудительно разрывает соединение или откатывает транзакцию на своей стороне. Когда 1С пытается выполнить завершающую команду COMMIT, транзакции в данном сеансе SQL уже не существует, что и вызывает исключение.
Особо отметим, что ошибка часто проявляется в общем модуле ПользователиСлужебный при попытке обращения к параметру сеанса ТекущийПользователь. Это происходит потому, что инициализация параметров сеанса — один из первых тяжелых запросов к базе при входе в систему.
Прежде чем переходить к глубоким настройкам сервера, выполним стандартные процедуры, которые помогают в 30% случаев. Выясним, не является ли проблема локальной (при работе с несколькими базами регулярное тестирование и создание резервных копий настраивается по расписанию с помощью программы для автоматического обслуживания и тестирования 1С):
/ClearCache в настройках информационной базы или вручную удалите папки из %AppData%\1C\1Cv8\.srvinfo могут содержать некорректные метаданные..dt и загрузку обратно. Это переиндексирует таблицы и устранит возможные логические несоответствия.Проанализируем ситуацию: если ошибка начала проявляться после обновлений Windows, велика вероятность, что включились механизмы «оптимизации» сетевого трафика, которые некорректно работают с длительными SQL-соединениями. Одной из таких функций является TCP Chimney Offload.
Разберем, как отключить эти функции на сервере 1С и сервере SQL. Запустите командную строку от имени администратора и выполните следующие команды:
netsh int tcp set global chimney=disabled
netsh int tcp set global rss=disabled
netsh int tcp set global netdma=disabled
После выполнения этих команд рекомендуется перезагрузить сетевые адаптеры или весь сервер. Это исключит ситуацию, когда сетевая карта самовольно сбрасывает «молчащие», но активные сессии 1С.
Посмотрим на настройки взаимодействия между сервером приложений 1С и SQL Server. Если они установлены на одном физическом сервере, крайне важно использовать протокол Shared Memory (Общая память).
SQL Server Network Configuration -> Protocols for MSSQLSERVER.Client Protocols проверьте порядок (Order) протоколов: Shared Memory должен стоять первым.Если серверы разнесены, убедитесь, что протокол TCP/IP настроен на использование статического порта (по умолчанию 1433) и отсутствуют динамические порты, которые могут блокироваться брандмауэром.
Как отмечалось в обсуждении, проблема часто возникает после установки обновлений безопасности Windows, которые затрагивают протоколы TLS 1.1/1.2. Если ваш SQL Server старой версии, а система требует TLS 1.2, старый SQL Server Native Client 11.0 может работать нестабильно.
Рассмотрим пути решения:
SQL Server Native Client до последней версии (доступно в пакетах Feature Pack для SQL Server).Error: 18056, Severity: 20, это явный признак проблем с пулом соединений или авторизацией через TLS.Выясним еще одну причину: тяжелый запрос от 1С может захватить все ядра процессора, из-за чего SQL Server не успеет вовремя ответить на системный запрос «проверки связи» (keep-alive), и соединение будет разорвано администратором (в данном случае — внутренним процессом SQL).
Для баз данных 1С настоятельно рекомендуется ограничить максимальную степень параллелизма. Выполните скрипт в SQL Management Studio:
EXEC sys.sp_configure N'show advanced options', N'1';
RECONFIGURE WITH OVERRIDE;
EXEC sys.sp_configure N'max degree of parallelism', N'1';
RECONFIGURE WITH OVERRIDE;
Значение MAXDOP = 1 является наиболее стабильным для 1С, так как предотвращает избыточное ветвление транзакций, которое часто приводит к взаимоблокировкам и разрывам соединений.
Проанализируем влияние защитного ПО. Антивирусы часто проверяют сетевые пакеты SQL (порт 1433). Если задержка при проверке пакета превышает время ожидания, транзакция прерывается.
Необходимо добавить в исключения:
rmngr.exe, rphost.exe, ragent.exe.sqlservr.exe.Ошибка COMMIT TRANSACTION — это почти всегда следствие «падения» сетевого или программного моста между 1С и СУБД. Начните с отключения TCP Chimney Offload и настройки MAXDOP, так как это наиболее вероятные причины в современных инфраструктурах после обновлений систем. Если ошибка сохраняется, обратите внимание на версию платформы 1С: переход на стабильные релизы (например, выше 8.3.22) часто содержит исправления для работы с новыми патчами безопасности Windows. Для комплексного аудита параметров СУБД и выявления проблемных настроек можно использовать обработку для чек-апа СУБД под 1С.