Как исправить ошибку 193 при использовании ADODB.Connection в 1С 8 и сохранить работоспособность 1С 7.7 на одном сервере?

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

В процессе эксплуатации смешанных инфраструктур, где одновременно сосуществуют старые решения на 1С:Предприятие 7.7 и современные базы на 1С:Предприятие 8, системные администраторы и программисты часто сталкиваются с трудноразрешимыми конфликтами системных библиотек. Один из самых коварных — ошибка 193 при попытке установить соединение через ADODB.Connection. В этой статье мы подробно разберем, почему возникает эта проблема, как она связана с файлами sqlsrv32.dll и odbcbcp.dll, и как настроить сервер так, чтобы "ничего не поломать".

Выясняем причину: что означает системная ошибка 193?

Проанализируем ситуацию. Ошибка «System Error 193» в операционных системах Windows практически всегда сигнализирует о несоответствии разрядности (Bitness Mismatch). Это происходит, когда 64-битный процесс пытается загрузить 32-битную динамическую библиотеку (DLL), или наоборот.

Рассмотрим механизм работы Windows Server 2008 R2 (и более новых 64-битных систем). В них реализована подсистема WoW64 (Windows on Windows 64-bit):

  1. Папка C:\Windows\System32 предназначена исключительно для 64-битных библиотек.
  2. Папка C:\Windows\SysWOW64 предназначена для 32-битных библиотек.

Для обеспечения работы 1С 7.7 с SQL Server 2005 на новых ОС часто применяют "костыль": заменяют оригинальные 64-битные файлы sqlsrv32.dll, sqlsrv32.rll и odbcbcp.dll в папке System32 на старые 32-битные версии от Windows XP или Windows 2000. Это позволяет 32-битной 1С 7.7 обходить проверку порядка сортировки данных (Order Sort Check), но полностью блокирует работу любых 64-битных приложений, использующих ODBC.

Когда ваш сервер 1С 8 (64-битный процесс rphost.exe) пытается выполнить код:


Соединение = Новый COMОбъект("ADODB.Connection");
Соединение.Open("Driver={SQL Server};Server=MY_SERVER;Database=MY_DB;...");

Система обращается к драйверу в System32. Видя там подмененную 32-битную библиотеку, 64-битный процесс 1С 8 выдает ошибку 193, так как не может ее инициализировать.

Решение №1: Использование SQL Server Native Client

Самый правильный и безопасный способ, который не требует "травли" операционной системы старыми файлами — это переход на использование Native Client в строках соединения 1С 8. Рассмотрим, как это реализовать.

Вместо стандартного провайдера ODBC (который по умолчанию использует тот самый конфликтный драйвер SQL Server), мы будем использовать SQLNCLI. Это отдельный набор драйверов, который устанавливается вместе с SQL сервером и имеет собственные независимые библиотеки.

Разберем пример кода для 1С 8:


// Вместо Driver={SQL Server} используем Provider=SQLNCLI10 (для SQL 2008) или SQLNCLI (для SQL 2005)
СтрокаСоединения = "Provider=SQLNCLI;Data Source=ИмяСервера;Initial Catalog=ИмяБазы;User ID=sa;Password=Пароль;";
Соединение = Новый COMОбъект("ADODB.Connection");

Попытка
    Соединение.Open(СтрокаСоединения);
    Сообщить("Соединение успешно установлено!");
Исключение
    Сообщить("Не удалось подключиться: " + ОписаниеОшибки());
КонецПопытки;

Использование Native Client позволяет 1С 8 работать через свои 64-битные драйверы, не обращая внимания на то, какие манипуляции вы проводили с sqlsrv32.dll для нужд старой "семерки".

Решение №2: Восстановление системных файлов и патч BkEnd.dll

Если вам необходимо, чтобы работали оба варианта (и стандартный ODBC в 1С 8, и 1С 7.7), мы рекомендуем рассмотреть стратегию отказа от подмены системных DLL. Давайте проанализируем, почему 1С 7.7 вообще требует эти старые библиотеки.

Проблема кроется в проверке кодировки и порядка сортировки в SQL. Вместо того чтобы ломать Windows, выполните следующие действия:

  1. Восстановите оригинальные файлы sqlsrv32.dll и odbcbcp.dll в папке System32 из дистрибутива Windows Server 2008 R2. Это вернет работоспособность 64-битным приложениям и ADODB.Connection.
  2. Для 1С 7.7 используйте специальный патч файла BkEnd.dll (существует широко известная в сообществе модификация, отключающая проверку OrdNoChk).
  3. В качестве альтернативы патчу, можно создать в папке с исполняемым файлом 1С 7.7 (обычно это C:\Program Files (x86)\1Cv77\BIN\) пустой файл с названием OrdNoChk.res. В некоторых релизах платформы это заставляет программу игнорировать различие в кодировках.

Важный нюанс: Если 1С 7.7 запускается только на клиентских машинах, как указано в вопросе автора, то восстановление оригинальных DLL на сервере никак не повлияет на работу пользователей 7.7. Клиентская часть 1С 7.7 использует библиотеки, установленные локально на компьютере пользователя, а не на сервере SQL.

Решение №3: Локальное размещение DLL для 1С 7.7

Если по каким-то причинам вы не можете пропатчить BkEnd.dll, рассмотрим метод "локальной изоляции". Вместо того чтобы подменять библиотеки в системных папках Windows, попробуем подложить их непосредственно 1С 7.7.

Разберем этот шаг по пунктам:

На что влияет замена файлов в SQL Server 2005?

Многие опасаются, что восстановление оригинальных библиотек может "уронить" сам SQL Server. Разберем этот момент подробнее. Сам SQL Server 2005 является серверным процессом (sqlservr.exe) и не использует драйверы клиентского доступа sqlsrv32.dll для своей внутренней работы. Эти библиотеки нужны клиентам, которые подключаются к серверу.

Однако, будьте осторожны: подмененные библиотеки в System32 могут нарушить работу следующих компонентов самого SQL сервера:

Поэтому восстановление оригинальных файлов (или использование Native Client) является не просто желательным, а необходимым условием стабильности современной системы.

Итоги и рекомендации

Подведем итог нашему анализу. Чтобы "ничего не поломать" и подружить 1С 7.7 с 1С 8 на Windows Server 2008 R2, следуйте этому алгоритму:

  1. Для 1С 8: Перепишите строки соединения в коде, заменив драйвер на Provider=SQLNCLI. Это самый чистый способ решения проблемы 193 ошибки без вмешательства в систему.
  2. Для стабильности системы: Верните оригинальные 64-битные DLL в System32. Если 1С 7.7 работает на клиентах, она этого даже не заметит.
  3. Для регламентных заданий 7.7 на сервере: Если вам все же нужно запускать 7.7 на самом сервере, используйте патч BkEnd.dll вместо подмены системных драйверов.

Помните, что архитектурная чистота сервера — залог отсутствия проблем при обновлениях и масштабировании системы. Использование 32-битных "заплаток" в 64-битной среде — это всегда риск, который рано или поздно приведет к сбоям в работе критически важных механизмов 1С.

← На главную