При интеграции 1С со сторонними системами (например, ресторанными комплексами R-Keeper) часто возникает задача прямого чтения таблиц формата Paradox (файлы с расширением .db). Для этого традиционно используется технология ADO и механизм ODBC. Однако разработчики нередко сталкиваются с каскадом ошибок: от «Источник данных не найден и не указан драйвер, используемый по умолчанию» и сообщений о несовместимости архитектур до ошибки «Внешняя таблица не имеет предполагаемый формат» и некорректного отображения кириллицы («кракозябры»).
Разберем по шагам причины возникновения этих проблем и рассмотрим практические способы их решения.
Проанализируем первую частую ошибку: [Microsoft][Диспетчер драйверов ODBC] В указанном DSN архитектура драйвера и архитектура приложения не соответствуют друг другу или отсутствие драйвера в списке источников данных.
Дело в том, что системный драйвер для работы с Paradox (библиотека odbcjt32.dll) существует только в 32-разрядной версии (x86). В 64-разрядных версиях Windows и пакетах Microsoft Access Database Engine поддержка формата Paradox ISAM была исключена. Соответственно:
Как решить проблему с разрядностью:
Новый COMОбъект("ADODB.Connection") должны выполняться в контексте клиента, а не на сервере x64.C:\Windows\SysWOW64\odbcad32.exe (в стандартной панели управления открывается 64-битная оснастка из System32, где этот драйвер не виден).Когда соответствие разрядностей настроено, при вызове метода открытия набора записей rs.Open() может возникнуть ошибка формата. Выясним ее ключевые причины:
PARADOX.LCK, PDOXUSRS.LCK и сетевой управляющий файл PDOXUSRS.NET. Драйвер Jet не может получить доступ к занятым файлам. Чтобы исключить эту проблему, скопируем таблицы .db, а также соответствующие индексные файлы .px во временную локальную папку и будем подключаться уже к копии..px в том же каталоге.Рассмотрим рабочий вариант формирования строки подключения без необходимости предварительного создания 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();
После успешного получения данных из таблицы часто обнаруживается, что весь русский текст отображается нечитаемыми символами. Системы R-Keeper и схожие комплексы сохраняют строки в кодировке CP866 (DOS / OEM), тогда как драйвер Microsoft Jet по умолчанию интерпретирует байты как кодировку Windows-1251 (ANSI).
Разберем пути устранения этой проблемы:
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Jet\4.0\Engines\ParadoxDataCodePage со значением OEM (или 866).CollatingSequence со значением Russian (или International).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();
Возврат Результат;
КонецФункции
Посмотрим на альтернативный способ соединения без использования прослойки 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.