В процессе эксплуатации современных версий платформы 1С:Предприятие (начиная с 8.3.25 и выше) технические специалисты часто сталкиваются с критической ошибкой СУБД: «Microsoft SQL Server Native Client 11.0: Внутренняя ошибка: был достигнут предел размера стека на сервере. Проверьте возможное наличие глубокой вложенности в запросе...». Эта проблема парализует работу системы, не позволяя завершить обновление конфигурации или блокируя вход пользователям.
В рамках данной статьи мы подробно разберем природу возникновения этой ошибки, проанализируем механизмы взаимодействия 1С с Microsoft SQL Server и выработаем пошаговый алгоритм решения проблемы.
Рассмотрим техническую сторону вопроса. Ошибка с кодом 8631 (native 8631) в SQL Server означает, что оптимизатор запросов при попытке построить план выполнения столкнулся с настолько сложной структурой, что выделенная память под стек была исчерпана. В контексте 1С это практически никогда не связано с ошибками в коде программиста напрямую, а является следствием работы механизмов платформы.
Проанализируем две основные ситуации, когда это происходит:
Config от старых версий объектов. Для этого она формирует гигантский запрос типа DELETE FROM Config WHERE FileName NOT IN (...). В крупных конфигурациях (ERP, КА, ЗУП) список идентификаторов в условии IN может содержать десятки тысяч элементов. Текст такого запроса может достигать 9–10 мегабайт, что «схлопывает» стек SQL Server.@@NESTLEVEL (обычно 32 уровня).Зафиксируем важный факт: данная проблема официально признана разработчиками 1С (баг №60015505) и связана с некорректным формированием «тяжелых» запросов к служебным таблицам базы данных.
Если вы столкнулись с ошибкой во время обновления конфигурации, в первую очередь необходимо отказаться от механизмов динамического обновления, так как именно они провоцируют накопление «мусора» в таблице Config. Рассмотрим алгоритм действий:
snccntxt, reg_XXXX), если есть подозрение на кэширование некорректных состояний.Важное замечание: Если база данных находится в распределенной информационной базе (РИБ), динамическое обновление центрального узла на проблемных платформах может привести к рассинхронизации конфигураций в периферийных узлах. В этом случае поможет только полная выгрузка/загрузка конфигурации (файл .cf).
В ситуациях, когда база «зависла» в состоянии обновления и не дает зайти ни в режиме Предприятия, ни в Конфигуратор, нам потребуется вмешательство на уровне СУБД. Мы воспользуемся командами для удаления меток незавершенных транзакций обновления.
Рассмотрим последовательность действий в SQL Server Management Studio (SSMS):
-- Перед выполнением обязательно сделайте бэкап базы данных!
USE [Имя_Вашей_Базы];
GO
-- Удаляем метки динамического обновления, которые блокируют структуру
DELETE FROM Config WHERE FileName = 'commit';
DELETE FROM Config WHERE FileName = 'dynamicCommit';
DELETE FROM Config WHERE FileName = 'dbStruFinal';
После выполнения этих команд база данных должна позволить запустить Конфигуратор. После этого обязательно выполните «Тестирование и исправление» с установленной галочкой «Проверка логической целостности конфигурации».
Если ошибка возникает не при обновлении, а при работе конкретных пользователей (как в Сообщении 1), проанализируем настройки прав. Посмотрим на структуру ролей: если для одного документа прописано 10–15 разных ролей с RLS-условиями, платформа сформирует запрос невероятной вложенности.
Для решения попробуйте выполнить следующие шаги:
max stack size), однако это является крайней мерой и требует перезагрузки SQL-сервера.Поскольку корень проблемы лежит в баге платформы, наиболее надежным решением будет переход на исправленные релизы. Проанализируем версии, в которых ситуация была стабилизирована:
Также обратим внимание на драйвер подключения. В тексте ошибки часто упоминается Microsoft SQL Server Native Client 11.0. Этот компонент устарел. Для более стабильной работы современной платформы 1С с SQL Server 2017/2019/2022 рекомендуется установить и использовать Microsoft OLE DB Driver for SQL Server (msoledbsql).
Мы разобрали сложную техническую ошибку, связанную с ограничениями SQL Server. Основной вывод: ошибка stack size limit в 1С — это сигнал о том, что платформа сформировала чрезмерно объемный запрос. Для исправления ситуации используйте монопольное обновление, избегайте динамических обновлений на «тяжелых» базах и своевременно обновляйте платформу до релизов, где исправлен механизм очистки таблицы Config.
Соблюдение этих правил позволит вам избежать деградации производительности и обеспечит стабильную работу системы даже на высоконагруженных конфигурациях.