Как создать файл DBF формата dBase IV в 1С?

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

При интеграции 1С со сторонними информационными системами, банками или государственными реестрами часто возникает требование формировать файлы выгрузки в формате DBF определенной спецификации — например, dBase IV. Разберем, почему штатные средства не всегда позволяют получить нужный формат и какими способами можно сформировать файл dBase IV программно.

Почему изменение фильтра в диалоге выбора файла не решает задачу?

Проанализируем частую ошибку разработчиков: попытку изменить строку фильтра в объекте ДиалогВыбораФайла.

Свойство Фильтр объекта ДиалогВыбораФайла управляет исключительно маской отображения файлов в графическом интерфейсе операционной системы для пользователя. Строка "Файлы DBASE IV (*.dbf)|*.dbf" не передает никаких параметров низкоуровневым процедурам записи и не способна изменить внутреннюю структуру генерируемого файла.

Ограничение встроенного объекта XBase в платформе 1С

Выясним причину, по которой штатный механизм платформы формирует файлы устаревшей версии. Встроенный объект XBase ориентирован исключительно на спецификацию dBase III (или dBase III+ при наличии memo-полей). При создании новой таблицы методом СоздатьФайл() платформа 1С автоматически записывает в нулевой байт заголовка сигнатуру 0x03 (или 0x83). Встроенный язык 1С не содержит штатных свойств или методов в объекте XBase для переключения версии формата на dBase IV, FoxPro или Clipper.

Как проверить версию созданного DBF-файла?

Версия структуры таблицы DBF всегда жестко зафиксирована в самом первом байте файла (смещение 0 в заголовке):

  1. 0x03 (3 в десятичной системе) — dBase III / FoxBase+ (без memo-полей);
  2. 0x83 — dBase III+ с memo-полями (.DBT);
  3. 0x04 (а также 0x43 или 0x8B) — различные спецификации dBase IV (в зависимости от наличия memo и SQL-таблиц);
  4. 0x30 — Visual FoxPro.

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


Функция ПолучитьКодВерсииDBF(ПутьКФайлу)
    Файл = Новый Файл(ПутьКФайлу);
    Если Не Файл.Существует() Тогда
        Возврат Неопределено;
    КонецЕсли;

    Чтение = Новый ЧтениеДанных(ПутьКФайлу);
    БайтВерсии = Чтение.ПрочитатьБайт();
    Чтение.Закрыть();

    Возврат БайтВерсии;
КонецФункции

Способ 1. Создание и заполнение файла через COM-объект ADODB (OLE DB / ODBC)

Рассмотрим основной и наиболее корректный способ создания файла dBase IV на платформе Windows — использование провайдера OLE DB через объект ADODB.Connection. В строке подключения явно передается параметр Extended Properties="dBASE IV;".

Разберем реализацию по шагам:


Процедура СоздатьИЗаполнитьDBF4(КаталогФайла, ИмяТаблицы)
    // Создаем COM-объект соединения с базой данных
    Соединение = Новый COMОбъект("ADODB.Connection");
    
    // Формируем строку подключения к каталогу с указанием драйвера dBASE IV
    СтрокаПодключения = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + КаталогФайла + ";Extended Properties=""dBASE IV;"";";
    
    Попытка
        Соединение.Open(СтрокаПодключения);
    Исключение
        // При работе на 64-разрядном сервере может потребоваться провайдер ACE
        СтрокаПодключения = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + КаталогФайла + ";Extended Properties=""dBASE IV;"";";
        Соединение.Open(СтрокаПодключения);
    КонецПопытки;

    // Создаем структуру таблицы SQL-запросом
    ТекстСоздания = "CREATE TABLE " + ИмяТаблицы + " (
                    | CODE CHAR(10),
                    | NAME CHAR(50),
                    | SUMMA NUMERIC(15, 2)
                    |)";
    Соединение.Execute(ТекстСоздания);

    // Добавляем запись в созданную таблицу
    ТекстВставки = "INSERT INTO " + ИмяТаблицы + " (CODE, NAME, SUMMA) VALUES ('001', 'Тестовая строка', 1500.50)";
    Соединение.Execute(ТекстВставки);

    Соединение.Close();
КонецПроцедуры

Способ 2. Бинарная модификация сигнатуры заголовка (патчинг байта)

Если принимающая программа не требует специфических типов полей dBase IV, а лишь валидирует сигнатуру формата в заголовке файла, можно сформировать файл через штатный XBase, а затем изменить сигнатурный байт с 0x03 на 0x04.

Посмотрим на пример реализации данного алгоритма:

  1. Создаем и полностью заполняем файл через штатный объект XBase.
  2. Обязательно закрываем файл методом ЗакрытьФайл(), чтобы освободить дескриптор.
  3. Открываем файл потоком записи и перезаписываем нулевой байт.

Процедура ИсправитьСигнатуруНаDBase4(ПутьКФайлу)
    // Читаем все двоичные данные файла
    Двоичные = Новый ДвоичныеДанные(ПутьКФайлу);
    Размер = Двоичные.Размер();

    Чтение = Новый ЧтениеДанных(Двоичные);
    // Пропускаем первый байт (версию dBase III)
    Чтение.ПрочитатьБайт();
    // Считываем оставшуюся часть файла
    ОстатокДанных = Чтение.Прочитать();
    Чтение.Закрыть();

    // Записываем обновленные данные обратно
    Запись = Новый ЗаписьДанных(ПутьКФайлу);
    // Пишем байт 0x04 (dBase IV без memo)
    Запись.ЗаписатьБайт(4);
    // Дописываем исходное тело файла
    Запись.Записать(ОстатокДанных);
    Запись.Закрыть();
КонецПроцедуры

Способ 3. Использование файла-шаблона

Рассмотрим еще один практичный подход, исключающий необходимость генерации DDL-скриптов на стороне 1С:

  1. Создаем пустой файл с необходимой структурой полей в формате dBase IV один раз во внешней программе.
  2. Помещаем этот файл в конфигурацию или обработку в качестве макета с типом Двоичные данные.
  3. В момент выгрузки извлекаем файл-макет из конфигурации на диск.
  4. Наполняем файл данными через OLE DB / ADO (командами INSERT INTO) либо через сторонние консольные утилиты.
← На главную