Как организовать загрузку данных в базу Paradox (.db) из 1С?

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

Работа с устаревшими форматами баз данных, такими как Paradox, часто ставит перед разработчиком 1С нестандартные задачи. Основная сложность заключается в том, что современные операционные системы и механизмы ADO не всегда корректно взаимодействуют со структурой файлов .db, особенно если они содержат поля типа AutoInc (автоинкремент) или не имеют первичных ключей. Давайте разберем, как мы можем решить эту задачу поэтапно.

Этап 1: Подготовка структуры базы данных

Прежде чем приступать к написанию кода, мы должны убедиться, что структура базы позволяет производить запись. Одной из частых проблем является отсутствие первичного ключа. Paradox требует наличия файла с расширением .PX для индексации и корректной работы операций INSERT и UPDATE.

  1. Откройте файл базы данных с помощью специализированного редактора (например, Paradox Data Editor).
  2. Удалите ненужные записи, если это необходимо для очистки данных.
  3. Создайте Primary Key (первичный ключ) по ключевому полю, например, Cikl. Это приведет к созданию вспомогательного файла .PX, без которого ADO будет выдавать ошибку о невозможности выполнения операции.

Этап 2: Подключение через COM-объект ADODB

Для взаимодействия с базой из среды 1С мы будем использовать COMОбъект класса ADODB.Connection. Этот метод позволяет выполнять SQL-запросы к таблицам напрямую. Рассмотрим пример чтения данных из базы:


Conn = Новый COMОбъект("ADODB.Connection");
Conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\PROGRAMS\PDE;Persist Security Info=False;Extended properties='Paradox 7.x;HDR=YES'";
Попытка
    Conn.Open();
Исключение
    Сообщить("Не удалось подключиться к базе");
КонецПопытки;

ТекстЗапроса = "select Cikl, MyCikl, Name, Account from Debtors1.db";
cmdSQL = Новый COMОбъект("ADODB.Command");
cmdSQL.ActiveConnection = Conn;
cmdSQL.prepared = 1;
cmdSQL.CommandText = ТекстЗапроса;
Zapros = cmdSQL.Execute();

Пока Zapros.EOF = 0 Цикл
    Сообщить(Zapros.Fields("Cikl").Value);
    Zapros.MoveNext();
КонецЦикла;
Conn.Close();

Этап 3: Решение проблем с полями ReadOnly и AutoInc

Иногда мы сталкиваемся с ошибкой: поле, например Cikl, нельзя изменить, так как оно имеет тип AutoInc и защищено от записи. Если стандартные методы импорта не справляются, нам приходится прибегать к низкоуровневой модификации файла базы данных.

Один из рабочих методов — временное изменение типа поля через HEX-редактор:

  1. Мы определяем смещение байта, отвечающего за тип поля в структуре .db файла. Например, по смещению 78h (120 десятичное) значение 16h может указывать на защищенное поле.
  2. В процессе интеграции мы программно меняем этот байт на 04h, что делает поле доступным для записи.
  3. После внесения данных через ADO или импорта CSV, мы возвращаем исходное значение байта 16h, чтобы восстановить целостность структуры.

Этап 4: Автоматизация процесса

Чтобы не делать это вручную, мы можем реализовать алгоритм «костыля» непосредственно в 1С:

  1. Используем объект ЧтениеДвоичныхДанных и ЗаписьДвоичныхДанных для открытия файла .db.
  2. Программно модифицируем байт по нужному смещению (патчим файл).
  3. Выполняем SQL-запрос на вставку данных через ADODB.Command.
  4. После завершения операции возвращаем исходный байт на место и закрываем файл.

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

Таким образом, комбинируя ADODB для SQL-запросов и методы работы с двоичными данными для обхода ограничений структуры, мы получаем надежный инструмент для обмена данными между современной 1С и устаревшей базой данных Paradox.

← На главную