Как устранить ошибки при подключении к базе данных Paradox через ADODB в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При интеграции 1С со сторонними системами (например, ресторанными комплексами R-Keeper) часто возникает задача прямого чтения таблиц формата Paradox (файлы с расширением .db). Для этого традиционно используется технология ADO и механизм ODBC. Однако разработчики нередко сталкиваются с каскадом ошибок: от «Источник данных не найден и не указан драйвер, используемый по умолчанию» и сообщений о несовместимости архитектур до ошибки «Внешняя таблица не имеет предполагаемый формат» и некорректного отображения кириллицы («кракозябры»).

Разберем по шагам причины возникновения этих проблем и рассмотрим практические способы их решения.

Причина 1. Несоответствие разрядности платформы 1С и драйвера ODBC

Проанализируем первую частую ошибку: [Microsoft][Диспетчер драйверов ODBC] В указанном DSN архитектура драйвера и архитектура приложения не соответствуют друг другу или отсутствие драйвера в списке источников данных.

Дело в том, что системный драйвер для работы с Paradox (библиотека odbcjt32.dll) существует только в 32-разрядной версии (x86). В 64-разрядных версиях Windows и пакетах Microsoft Access Database Engine поддержка формата Paradox ISAM была исключена. Соответственно:

  1. 64-разрядный клиент или 64-разрядный сервер 1С:Предприятия физически не могут загрузить 32-разрядную библиотеку драйвера ODBC.
  2. Если код выполняется в 64-битном процессе 1С, диспетчер ODBC просто не найдет нужный драйвер в 64-битной ветке системы.

Как решить проблему с разрядностью:

  1. Запуск кода на клиенте x86: Убедимся, что рабочее место или клиентское приложение 1С установлено и запущено именно в 32-разрядной версии платформы. Вызовы Новый COMОбъект("ADODB.Connection") должны выполняться в контексте клиента, а не на сервере x64.
  2. Использование 32-разрядной оснастки ODBC: На 64-битной Windows настраивать DSN для Paradox необходимо исключительно через 32-разрядный диспетчер источников данных, расположенный по пути: C:\Windows\SysWOW64\odbcad32.exe (в стандартной панели управления открывается 64-битная оснастка из System32, где этот драйвер не виден).

Причина 2. Ошибка «Внешняя таблица не имеет предполагаемый формат»

Когда соответствие разрядностей настроено, при вызове метода открытия набора записей rs.Open() может возникнуть ошибка формата. Выясним ее ключевые причины:

  1. Версия файла Paradox: Драйвер Microsoft ODBC/Jet поддерживает таблицы Paradox только до версии 5.x. Если внешняя программа сформировала таблицы версии Paradox 7–10 либо таблица содержит неподдерживаемые типы полей (автоинкремент, расширенные BLOB-поля), драйвер выдаст исключение о неверном формате.
  2. Файлы блокировок: Если приложение-источник запущено, в каталоге с базой данных создаются служебные файлы блокировок PARADOX.LCK, PDOXUSRS.LCK и сетевой управляющий файл PDOXUSRS.NET. Драйвер Jet не может получить доступ к занятым файлам. Чтобы исключить эту проблему, скопируем таблицы .db, а также соответствующие индексные файлы .px во временную локальную папку и будем подключаться уже к копии.
  3. Отсутствие файлов индексов: Если таблица имеет первичный ключ, драйвер требует обязательного наличия файла с тем же именем и расширением .px в том же каталоге.

Причина 3. Составление корректной строки подключения

Рассмотрим рабочий вариант формирования строки подключения без необходимости предварительного создания DSN в системе. Подключение выполняется напрямую с указанием системного драйвера:


КаталогБазы = "C:\Exchange\RKeeperData";
ИмяТаблицы = "Categ.db";

СтрокаПодключения = "Driver={Microsoft Paradox Driver (*.db )};" +
    "DriverID=538;" +
    "Fil=Paradox 5.X;" +
    "DefaultDir=" + КаталогБазы + ";" +
    "Dbq=" + КаталогБазы + ";" +
    "CollatingSequence=ASCII;";

Соединение = Новый COMОбъект("ADODB.Connection");
Попытка
    Соединение.Open(СтрокаПодключения);
Исключение
    ВызватьИсключение "Не удалось подключиться к Paradox: " + ОписаниеОшибки();
КонецПопытки;

НаборЗаписей = Новый COMОбъект("ADODB.Recordset");
ТекстЗапроса = "SELECT * FROM [" + ИмяТаблицы + "]";
НаборЗаписей.Open(ТекстЗапроса, Соединение);

Пока Не НаборЗаписей.EOF() Цикл
    // Чтение полей выборки
    ИмяПоля = НаборЗаписей.Fields("NAME").Value;
    НаборЗаписей.MoveNext();
КонецЦикла;

НаборЗаписей.Close();
Соединение.Close();

Причина 4. Неправильная кодировка кириллицы («кракозябры»)

После успешного получения данных из таблицы часто обнаруживается, что весь русский текст отображается нечитаемыми символами. Системы R-Keeper и схожие комплексы сохраняют строки в кодировке CP866 (DOS / OEM), тогда как драйвер Microsoft Jet по умолчанию интерпретирует байты как кодировку Windows-1251 (ANSI).

Разберем пути устранения этой проблемы:

  1. Настройка реестра Windows для 32-разрядных приложений:
    Для автоматического преобразования OEM-символов в ANSI драйвером Jet откроем ветку реестра:
    HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Jet\4.0\Engines\Paradox
    Установим следующие строковые параметры:
    • Параметр DataCodePage со значением OEM (или 866).
    • Параметр CollatingSequence со значением Russian (или International).
  2. Программная перекодировка в 1С с помощью ADODB.Stream:
    Если изменить системный реестр невозможно (например, отсутствуют права администратора), выполним обратное преобразование байтов через поток ADODB.Stream:
    
    Функция ПерекодироватьИзDOSвANSI(ИсходнаяСтрока)
        Если ПустаяСтрока(ИсходнаяСтрока) Тогда
            Возврат "";
        КонецЕсли;
    
        // Записываем строку как Windows-1251 и считываем как CP866
        Поток = Новый COMОбъект("ADODB.Stream");
        Поток.Type = 2; // adTypeText
        Поток.Mode = 3; // adModeReadWrite
        Поток.Open();
        
        Поток.Charset = "windows-1251";
        Поток.WriteText(ИсходнаяСтрока);
        
        Поток.Position = 0;
        Поток.Charset = "cp866";
        Результат = Поток.ReadText();
        Поток.Close();
        
        Возврат Результат;
    КонецФункции
    

Альтернативное прямое подключение через провайдер Jet OLE DB

Посмотрим на альтернативный способ соединения без использования прослойки ODBC. Напрямую через OLE DB драйвер Jet работает зачастую стабильнее:


КаталогБазы = "C:\Exchange\RKeeperData";

СтрокаПодключения = "Provider=Microsoft.Jet.OLEDB.4.0;" +
    "Data Source=" + КаталогБазы + ";" +
    "Extended Properties=""Paradox 5.x;"";";

Соединение = Новый COMОбъект("ADODB.Connection");
Соединение.Open(СтрокаПодключения);

Этот подход также требует выполнения исключительно в 32-разрядном клиенте 1С, однако избавляет от ряда внутренних ошибок диспетчера ODBC.

← На главную