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

Системный администратор 1С v7.7 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

При переносе файловой базы данных 1С:Предприятие 7.7 (DBF) в клиент-серверный вариант на Microsoft SQL Server администраторы часто сталкиваются со сбоем на этапе «загрузка системной информации». Процесс аварийно прерывается сообщением: «подключение занято до получения результатов для другого hstmt» (ODBC State HY000). Разберем причины возникновения этой неполадки и пошаговые методы её решения.

Причины возникновения ошибки

Проанализируем механику взаимодействия платформы 1С 7.7 с сервером баз данных:

  1. Особенности ODBC-интерфейса и дескрипторов команд: Ошибка возникает, когда через одно физическое соединение платформа пытается выполнить новую SQL-инструкцию (или DDL-команду создания системных таблиц), не дождавшись полного завершения обработки результирующего набора от предыдущей команды дескриптора hstmt.
  2. Протокол Shared Memory при локальном запуске: При выполнении загрузки в конфигураторе непосредственно на сервере СУБД клиент по умолчанию подключается через протокол разделяемой памяти (Shared Memory). Из-за специфических таймингов и отсутствия сетевой буферизации пакеты ответа поступают быстрее, чем устаревший сетевой стек 1С 7.7 успевает освободить дескрипторы.
  3. Отсутствие поддержки MARS: Платформа 7.7 разрабатывалась под классический драйвер SQLSRV32.DLL и не поддерживает режим Multiple Active Result Sets (MARS), который используется в современных версиях SQL Native Client.

Способ 1. Выполнение загрузки с клиентской рабочей станции

Самый простой и надежный практический прием — перенести процесс импорта на клиентский компьютер:

  1. Установим платформу 1С 7.7 с необходимыми модификациями для поддержки современных версий MS SQL («секретный релиз» / пропатченный BkEnd.dll) на клиентскую машину под управлением Windows 7 или Windows 10.
  2. Настроим подключение к целевому SQL-серверу по сети.
  3. Запустим конфигуратор 1С 7.7 на клиентском ПК, укажем параметры подключения к базе на SQL-сервере и выполним операцию «Администрирование — Загрузить данные».
  4. При сетевом подключении стек TCP/IP обеспечивает корректную задержку и синхронизацию пакетов, что исключает коллизию дескрипторов hstmt.

Способ 2. Принудительное переключение протокола на TCP/IP на сервере

Если загрузку необходимо выполнить непременно на самом сервере, отключим протокол Shared Memory для клиента 1С:

  1. Откроем 32-разрядную утилиту настройки клиента SQL — cliconfg.exe (расположена в каталоге C:\Windows\SysWOW64\cliconfg.exe на 64-битных ОС).
  2. Перейдем на вкладку «Псевдонимы» (Alias) и нажмем «Добавить».
  3. Укажем сетевое имя SQL-сервера, выберем сетевую библиотеку TCP/IP, укажем адрес 127.0.0.1 и порт (по умолчанию 1433).
  4. При настройке параметров базы данных в конфигураторе 1С 7.7 укажем созданный псевдоним либо строку вида 127.0.0.1,1433 вместо локального имени (local) или ., чтобы исключить использование разделяемой памяти.

Способ 3. Проверка метаданных и структуры базы перед выгрузкой

Рассмотрим подготовительные действия в исходной файловой базе данных (DBF), которые предотвратят системные ошибки при конвертации метаданных в SQL-формат:

  1. В файловой базе выполним полное «Тестирование и исправление ИБ» (меню «Администрирование — Тестирование и исправление ИБ») с проверкой физической целостности и логической структуры.
  2. Проверим структуру конфигурации: реквизиты документов и справочников неограниченной длины в дереве метаданных должны находиться в самом конце списка реквизитов объекта, так как на уровне SQL такие поля размещаются в отдельных типах данных (TEXT/IMAGE).
  3. Убедимся в отсутствии пустых некорректных дат (например, дат вида 00.00.0000), которые не поддерживаются форматом DATETIME в Microsoft SQL Server.
  4. Убедимся, что для целевой базы данных на сервере установлена модель восстановления Simple (простая), предотвращающая переполнение журнала транзакций во время массовой вставки данных.
← На главную