Как исправить ошибку SQLState HY000 «Подключение занято до получения результатов для другого hstmt» при реорганизации данных в 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

Симптомы выглядят следующим образом: конфигуратор успешно начинает реструктуризацию таблиц, счетчик обработанных элементов доходит до определенного значения (чаще всего в районе 900–1000 элементов), после чего на экране появляется пустое модальное окно с красной пиктограммой ошибки. После нажатия на кнопку «ОК» система выдает диагностическое сообщение следующего вида:


SQL State: HY000
Native: 0
Message: [Microsoft][ODBC SQL Server Driver] Подключение занято до получения результатов для другого hstmt

В этой статье мы подробно разберем, почему возникает эта ошибка, проанализируем её техническую природу и рассмотрим несколько надежных практических способов устранения проблемы, начиная от простых временных обходных путей до тонкой настройки системных библиотек.

Почему возникает ошибка SQLState HY000?

Давайте разберем техническую суть происходящего. Сообщение Connection is busy with results for another hstmt («Подключение занято...») генерируется стандартным драйвером ODBC SQL Server. Ошибка возникает тогда, когда клиентское приложение (в данном случае ядро 1С 7.7) пытается отправить новый SQL-запрос или команду через то же самое сетевое подключение, по которому в данный момент еще продолжается выборка результатов предыдущего запроса (активен открытый курсор или дескриптор инструкции — hstmt).

Разработка платформы 1С 7.7 завершилась задолго до появления современных стандартов СУБД. В те времена актуальным был SQL Server 2000, и механизмы платформы не проектировались под технологию MARS (Multiple Active Result Sets), которая позволяет выполнять несколько активных запросов параллельно в рамках одного соединения. Платформа 1С 7.7 ожидает, что драйвер ODBC самостоятельно решит эту проблему на уровне операционной системы, либо жестко требует завершения текущей операции выборки перед началом следующей.

При реструктуризации таблиц конфигуратор считывает данные порциями (пакетами). На границе считывания очередной порции (как раз в районе 900–1000 элементов) платформа пытается обновить служебные таблицы БД или записать измененные данные, не закрыв при этом курсор чтения основной таблицы. Это моментально приводит к блокировке соединения и аварийному завершению транзакции драйвером ODBC.

Почему проблема проявляется именно на новых операционных системах?

Давайте проанализируем влияние операционной системы на поведение драйверов. В устаревших ОС, таких как Windows XP и Windows Server 2003, использовался старый набор компонентов доступа к данным (MDAC 2.8). Драйвер sqlsrv32.dll тех версий работал более «лояльно» к архитектурным недостаткам 1С 7.7, автоматически открывая дополнительные скрытые соединения под капотом для обработки параллельных запросов.

Начиная с Windows Vista, Windows 7, 10, 11 и семейств Windows Server 2008 / 2012 / 2016+, Microsoft перешла на компоненты WDAC (Windows Data Access Components). Современные версии драйвера ODBC строго следуют спецификациям безопасности и производительности: если приложение пытается выполнить второй запрос на занятом соединении, драйвер незамедлительно пресекает это действие ошибкой HY000.

Ниже мы подробно рассмотрим проверенные практические методы решения этой проблемы.

---

Решение 1. Использование клиентской машины с Windows XP / Server 2003 (Временный обходной путь)

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

  1. Найдите или разверните на виртуальной машине ОС Windows XP или Windows Server 2003.
  2. Установите локально платформу 1С 7.7.
  3. Пропишите путь к вашей SQL-базе данных (или к ее копии).
  4. Запустите Конфигуратор с этой машины и выполните необходимую реорганизацию метаданных. В среде старых операционных систем драйвер отработает процедуру без ошибок.

Этот способ отлично подходит для разовых обновлений конфигурации, но крайне неудобен, если разработка ведется ежедневно и требует постоянной отладки структуры таблиц.

---

Решение 2. Метод локальной подмены библиотек (.local / DLL Redirection) — Рекомендуемый способ

Чтобы заставить Конфигуратор 1С 7.7 работать на современных операционных системах (Windows 7/10/11) без вылетов, мы можем принудительно заставить программу использовать старые совместимые версии библиотек ODBC от Windows XP. При этом заменять системные файлы в папках System32 или SysWOW64 крайне не рекомендуется, чтобы не нарушить работу других приложений (например, 1С 8.x или MS SQL Server).

Мы применим безопасный механизм перенаправления библиотек DotLocal. Разберем этот процесс по шагам:

  1. Найдите компьютер с установленной Windows XP или Windows Server 2003 (или скачайте оригинальные файлы из проверенных источников) и скопируйте три библиотеки:
    • sqlsrv32.dll
    • sqlsrv32.rll
    • odbcbcp.dll
  2. Перейдите в каталог установленной платформы 1С 7.7 на вашем рабочем компьютере (обычно это путь C:\Program Files (x86)\1Cv77\BIN\).
  3. Скопируйте подготовленные файлы sqlsrv32.dll, sqlsrv32.rll и odbcbcp.dll непосредственно в эту папку BIN.
  4. В этой же папке BIN (где находится исполняемый файл 1cv7s.exe) создайте абсолютно пустую папку и назовите ее 1cv7s.exe.local.

Давайте посмотрим, как теперь выглядит структура каталога BIN:


C:\Program Files (x86)\1Cv77\BIN\
├── 1cv7s.exe
├── 1cv7s.exe.local\
├── sqlsrv32.dll
├── sqlsrv32.rll
└── odbcbcp.dll

Как это работает: Наличие папки с расширением .local сигнализирует операционной системе Windows, что для процесса 1cv7s.exe приоритетными являются динамические библиотеки, расположенные непосредственно в его каталоге запуска, а не в системных директориях Windows. Теперь при запуске конфигуратора будут задействованы старые библиотеки ODBC, стабильно переносящие пакетную реструктуризацию данных, а вся остальная система продолжит работать с новыми оригинальными файлами WDAC.

---

Решение 3. Тонкая настройка SQL Server на время реструктуризации

Если ошибка продолжает возникать или вы хотите минимизировать риски сбоев СУБД при обновлении очень крупных таблиц (например, справочника «Номенклатура» с миллионами записей), имеет смысл временно перенастроить параметры обслуживания базы данных в MS SQL Server Management Studio (SSMS).

Шаг 1. Перевод базы данных в режим простой модели восстановления (Simple Recovery Model)

При реструктуризации таблиц SQL Server производит колоссальный объем дисковых операций записи в лог транзакций (файл .ldf). Если база данных находится в режиме Full, лог моментально разрастается, транзакции могут начать «подвисать», вызывая таймаут соединения. Перед запуском реструктуризации выполните следующий запрос:

ALTER DATABASE [ИмяВашейБазы] SET RECOVERY SIMPLE;

После успешного завершения реструктуризации вы сможете вернуть исходную модель восстановления:

ALTER DATABASE [ИмяВашейБазы] SET RECOVERY FULL;

Шаг 2. Ограничение параллелизма (MAXDOP)

На многопроцессорных серверах СУБД пытается распределить тяжелые запросы реорганизации на несколько процессорных ядер. Это часто приводит к взаимным блокировкам потоков внутри одного соединения 1С. На время реструктуризации рекомендуется временно ограничить максимальную степень параллелизма до 1:


EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'max degree of parallelism', 1;
RECONFIGURE;

После завершения процедуры изменения структуры метаданных верните исходное значение параллелизма (обычно 0 или количество физических ядер процессора).

Шаг 3. Временное отключение SQL-триггеров

Если у вас настроены кастомные триггеры на таблицах справочников или документов (например, для систем интеграции или логирования изменений), они могут мешать пакетной записи конфигуратора. Если триггер возвращает промежуточные результаты СУБД, драйвер расценит это как занятость соединения. Рекомендуется временно отключить триггеры на изменяемой таблице:

DISABLE TRIGGER ALL ON [ИмяТаблицыСправочника];

По завершении процедуры не забудьте включить триггеры обратно:

ENABLE TRIGGER ALL ON [ИмяТаблицыСправочника]; ---

Решение 4. Метод ручной подготовки файлов метаданных (MD и DD)

Для опытных разработчиков существует еще один альтернативный «сухой» способ проведения изменений, позволяющий полностью обойти падение конфигуратора на живой базе:

  1. Создайте пустую файловую базу (DBF-вариант) с аналогичной конфигурацией (используя ваш файл 1cv7.md).
  2. В этой пустой базе внесите все необходимые изменения метаданных в конфигураторе (добавьте реквизиты, измените их порядок). Сохраните изменения. Процедура пройдет мгновенно и без ошибок.
  3. Запустите утилиту для конвертации или регенерации словаря данных (файла 1cv7.dd) под формат SQL.
  4. Перенесите полученный измененный файл 1cv7.md и новый файл словаря 1cv7.dd в каталог рабочей SQL-базы, предварительно сделав архивную копию старых файлов.
  5. Запустите конфигуратор SQL-базы в монопольном режиме. Программа обнаружит несовпадение структуры файлов метаданных и таблиц СУБД и предложит выполнить реструктуризацию. За счет того, что конфигурационный файл уже изменен «на стороне», процесс реструктуризации на SQL пойдет по более простому и стабильному сценарию.

Подведем итоги

Мы подробно проанализировали системную ошибку SQLState: HY000 в 1С 7.7 и выяснили, что её первопричиной является несовместимость устаревшего движка платформы с жесткими стандартами современных драйверов ODBC в новых операционных системах Windows.

Наиболее надежным, долгосрочным и удобным решением для программиста является настройка локального перенаправления библиотек (метод .local), описанная в Решении 2. Она позволяет комфортно продолжать разработку и администрирование систем 1С 7.7 непосредственно на современных рабочих станциях под управлением Windows 7, 10 или 11 без необходимости прибегать к виртуальным машинам с устаревшими ОС.

← На главную