Работа с форматом XBase (включающим DBF, CDX, FPT) в среде 1С:Предприятие остаётся актуальной задачей несмотря на появление современных СУБД. Эти файлы широко используются в устаревших системах автоматизации, бухгалтерских программах (например, 1С:Бухгалтерия 7.7) и специализированном оборудовании (кассовые аппараты, сканеры штрихкодов). Внедрение таких данных в актуальные версии 1С:8.3 требует знания нюансов подключения, чтения и записи, а также обработки ошибок совместимости.

В этой статье вы найдёте практические инструкции по интеграции XBase в , включая:

  • 🔌 Способы подключения DBF-файлов к конфигурации (внешние обработки, COM-объекты, ADO).
  • 📝 Чтение и запись данных с примерами кода на встроенном языке.
  • ⚠️ Типичные ошибки (кодировки, блокировки файлов, несовпадение типов полей).
  • Оптимизация производительности при работе с большими файлами (индексы, пакетная обработка).

Особое внимание уделено совместимости с 64-битными версиями 1С, где стандартные методы работы с DBF могут не функционировать без дополнительных библиотек.

1. Что такое XBase и почему он важен для 1С

XBase — семейство форматов баз данных, разработанных для систем управления реляционными базами (СУБД) типа dBASE, FoxPro, Clipper. В контексте наиболее востребован формат DBF (таблица данных) и CDX (индексные файлы). Эти форматы сохраняют актуальность по трём причинам:

  • 📊 Наследие устаревших систем: Многие предприятия до сих пор используют 1С 7.7 или сторонние программы на Clipper, данные из которых нужно переносить в современные конфигурации.
  • 🖨️ Оборудование: Кассовые аппараты (Атол, Штрих-М), сканеры штрихкодов, весы часто экспортируют данные именно в DBF.
  • 🔄 Обмен данными: Некоторые государственные системы (например, для отчётности в Росстат) требуют файлы в формате DBF.

В 1С:Предприятие 8 нет встроенной поддержки XBase, но есть несколько способов интеграции:

Метод Преимущества Недостатки Поддержка 64-bit
Внешняя компонента (например, V82.DBF) Высокая скорость, прямой доступ к файлам Требует регистрации DLL, проблемы с 64-битными системами ❌ (только 32-bit)
COM-объект ADODB Гибкость, поддержка SQL-запросов Низкая производительность при больших объёмах
Библиотека OleDB (Microsoft Jet/ACE) Стабильность, поддержка транзакций Зависимость от установленных драйверов ✅ (с ограничениями)
Конвертация в промежуточный формат (CSV, XML, JSON) Универсальность, отсутствие зависимостей Дополнительные шаги, потеря метаданных
⚠️ Внимание: В 64-битных версиях 1С:Предприятие 8.3.20+ стандартные внешние компоненты для работы с DBF (V82.DBF.dll) не работают. Используйте альтернативные методы (ADO, OleDB) или 32-битный режим запуска.

2. Подключение DBF-файлов к 1С: пошаговые инструкции

Выбор метода подключения зависит от версии 1С, разрядности системы и объёма данных. Рассмотрим два наиболее надёжных способа: через ADODB (универсально) и внешнюю компоненту (для высокой производительности).

2.1. Метод 1: Использование ADODB (рекомендуется для 64-bit)

Этот способ работает в обеих разрядностях и не требует дополнительных библиотек, кроме стандартных компонентов Windows.

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

    Подключение.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Путь\К\Папке\;Extended Properties=dBASE IV;";

    Подключение.Open();

    Для файлов с кодировкой CP866 (DOS) добавьте параметр Extended Properties="dBASE IV;CharacterSet=OEM".

  2. Выполните запрос:
    Запрос = Новый COMОбъект("ADODB.Recordset");
    

    Запрос.Open("SELECT * FROM клиенты.dbf", Подключение);

  3. Обработайте данные:
    Пока Не Запрос.EOF() Цикл
    

    Сообщить(Запрос.Fields("Наименование").Value);

    Запрос.MoveNext();

    КонецЦикла;

Важно: Для работы с Microsoft.Jet.OLEDB.4.0 на 64-битной системе потребуется включить поддержку 32-битных приложений в Панель управления → Администрирование → Источники данных ODBC.

Установить драйвер Microsoft Jet 4.0 (входит в состав Windows)|Проверить разрядность 1С (32-bit или 64-bit)|Скопировать DBF-файлы в папку с правами на чтение/запись|Проверьте кодировку файла (CP866 или Windows-1251)

-->

2.2. Метод 2: Внешняя компонента V82.DBF (только 32-bit)

Этот способ обеспечивает максимальную скорость, но работает только в 32-битном режиме. Для его использования:

  1. Скачайте файл V82.DBF.dll (доступен на сайтах поддержки или в старых дистрибутивах).
  2. Зарегистрируйте библиотеку:
    regsvr32 C:\Путь\V82.DBF.dll

    (выполняется от имени администратора в командной строке).

  3. Подключите компоненту в :
    DBF = Новый COMОбъект("V82.DBF.DBFDocument");
  4. Откройте файл и читайте данные:
    DBF.Open("C:\data\клиенты.dbf");
    

    Пока DBF.EOF() = 0 Цикл

    Сообщить(DBF.Наименование);

    DBF.Next();

    КонецЦикла;

⚠️ Внимание: При работе с V82.DBF.dll файлы DBF блокируются на время чтения. Если файл используется другой программой (например, 1С 7.7), возникнет ошибка "Файл занят". Используйте механизм копирования файла перед обработкой.

ADODB (через OleDB)|V82.DBF (внешняя компонента)|Конвертация в CSV/XML|Другой способ|Не работаю с DBF-->

3. Чтение и запись данных: практические примеры

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

3.1. Чтение данных с обработкой типов

Формат DBF имеет жёсткие ограничения на типы полей (например, отсутствует тип ДатаВремя в привычном виде). При чтении данных через ADODB значения преобразуются автоматически, но иногда требуется ручная корректировка:

Запрос = Новый COMОбъект("ADODB.Recordset");

Запрос.Open("SELECT * FROM документы.dbf", Подключение);

// Пример обработки даты (в DBF хранится как строка "YYYYMMDD")

Пока Не Запрос.EOF() Цикл

ДатаСтрокой = Запрос.Fields("ДАТА_D").Value;

Дата = Дата(Число(Лев(ДатаСтрокой, 4)), Число(Сред(ДатаСтрокой, 5, 2)), Число(Прав(ДатаСтрокой, 2)));

Сообщить(Дата);

Запрос.MoveNext();

КонецЦикла;

Для полей типа Logical (булево значение) в DBF используются символы "T"/"F" или "Y"/"N". Их нужно явным образом преобразовывать:

ЛогическоеЗначение = Запрос.Fields("АКТИВЕН").Value = "T";

3.2. Запись данных в DBF

При записи данных в DBF через ADODB учитывайте:

  • 📌 Ограничение на длину строк: Поля типа Character обрезаются до размера, заданного в структуре DBF.
  • 📅 Формат даты: Даты должны передаваться в виде строки "YYYYMMDD".
  • 🔢 Числовые поля: Дробные числа округляются до количества знаков, указанных в метаданных DBF.

Пример добавления записи:

НоваяЗапись = Запрос.AddNew();

НоваяЗапись.Fields("КОД").Value = 1001;

НоваяЗапись.Fields("НАИМЕНОВ").Value = "Товар тестовый";

НоваяЗапись.Fields("ДАТА_D").Value = Формат(ТекущаяДата(), "ДФ=yyyyMMdd");

НоваяЗапись.Update();

💡

Перед записью данных в DBF всегда проверяйте структуру файла с помощью утилиты DBF Viewer (например, DBF Commander). Это поможет избежать ошибок несовпадения типов полей.

3.3. Работа с мемо-полями (FPT)

Поля типа Memo в DBF хранятся в отдельном файле с расширением FPT. При чтении через ADODB они возвращаются как строки, но при записи требуют особого подхода:

// Чтение мемо-поля

ТекстПримечания = Запрос.Fields("ПРИМЕЧАНИЕ").Value;

// Запись мемо-поля (ограничение ~64 КБ на запись)

НоваяЗапись.Fields("ПРИМЕЧАНИЕ").Value = Лев(БольшойТекст, 65535);

⚠️ Внимание: При работе с мемо-полями через V82.DBF.dll файлы FPT могут повреждаться, если не закрывать соединение корректно. Всегда используйте DBF.Close() после завершения операций.

4. Типичные ошибки и их решения

Работа с XBase в часто сопровождается ошибками, связанными с несовместимостью форматов, блокировками файлов или кодировками. Рассмотрим наиболее распространённые проблемы и способы их устранения.

4.1. Ошибка "Файл занят другим пользователем"

Эта ошибка возникает, когда:

  • 🔒 Файл DBF открыт в другой программе (например, Excel или 1С 7.7).
  • 📁 Папка с файлом находится на сетевом диске с ограниченными правами.
  • 🔄 Внешняя компонента V82.DBF.dll не освободила ресурсы.

Решения:

  1. Скопируйте файл в временную папку перед обработкой:
    КопироватьФайл("C:\data\исходный.dbf", "C:\temp\копия.dbf");
  2. Используйте механизм FileStream для проверки блокировки:
    Попытка
    

    Файл = Новый ЧтениеТекста("C:\data\файл.dbf", КодировкаТекста.ANSI);

    Файл.Закрыть();

    Исключение

    Сообщить("Файл заблокирован: " + ОписаниеОшибки());

    КонецПопытки;

4.2. Проблемы с кодировкой (CP866 vs Windows-1251)

Файлы DBF, созданные в DOS-системах (например, 1С 7.7), часто используют кодировку CP866, тогда как 1С:Предприятие 8 работает с UTF-8 или Windows-1251. Это приводит к кракозябрам при чтении текста.

Способы решения:

  • 🔤 Укажите кодировку при подключении через ADODB:
    Подключение.ConnectionString = "...;Extended Properties=""dBASE IV;CharacterSet=OEM"";";
  • 📋 Преобразуйте текст вручную:
    Текст = СтрЗаменить(Запрос.Fields("НАИМЕНОВ").Value, "_x000D__x000A_", Символы.ПС);
    

    Текст = ?(КодировкаТекста(Текст) = КодировкаТекста.ANSI, Текст, ПреобразоватьКодировку(Текст, КодировкаТекста.OEM, КодировкаТекста.ANSI));

Как определить кодировку DBF-файла?

Откройте файл в шестнадцатеричном редакторе (например, HxD). Если в тексте встречаются символы с кодами 0x80–0xFF (например, русские буквы в диапазоне 0xC0–0xEF), это CP866. Если буквы в диапазоне 0xD0–0xDF — скорее всего Windows-1251.

4.3. Несовпадение типов полей

Ошибка "Тип значения не совпадает с типом поля" возникает, когда:

  • 📏 В DBF поле имеет тип Numeric(10,2), а вы пытаетесь записать строку.
  • 🗓️ Поле Date в DBF ожидает строку "YYYYMMDD", а передаётся объект Дата.

Решение: Всегда проверяйте структуру DBF перед записью. Например, так:

Схема = Подключение.OpenSchema(20); // 20 = adSchemaColumns

Пока Не Схема.EOF() Цикл

Если Схема.Fields("COLUMN_NAME").Value = "ДАТА_D" Тогда

ТипПоля = Схема.Fields("DATA_TYPE").Value; // 8 = дата (DBDATE)

КонецЕсли;

Схема.MoveNext();

КонецЦикла;

💡

Перед массовой записью данных в DBF всегда тестируйте операцию на копии файла. Ошибки типов могут привести к повреждению исходных данных.

5. Оптимизация производительности

Работа с большими файлами DBF (более 100 тыс. записей) может значительно замедлять выполнение кода в . Ниже — рекомендации по ускорению обработки.

5.1. Использование индексов (CDX)

Файлы CDX содержат индексы для ускорения поиска в DBF. При подключении через ADODB индексы используются автоматически, если:

  • 🔍 Имя индексного файла совпадает с именем DBF (например, клиенты.dbf и клиенты.cdx).
  • 📌 Индекс создан по полю, используемому в запросе WHERE.

Пример запроса с использованием индекса:

Запрос.Open("SELECT * FROM клиенты.dbf WHERE КОД = 1001", Подключение);

5.2. Пакетная обработка данных

При записи большого количества строк избегайте построчной вставки. Вместо этого:

  1. Соберите данные в ТаблицуЗначений.
  2. Откройте транзакцию:
    Подключение.BeginTrans();
  3. Выполните массовую вставку:
    Для Каждого Строка Из ТаблицаДанных Цикл
    

    НоваяЗапись = Запрос.AddNew();

    НоваяЗапись.Fields("КОД").Value = Строка.Код;

    НоваяЗапись.Fields("НАИМЕНОВ").Value = Строка.Наименование;

    НоваяЗапись.Update();

    КонецЦикла;

  4. Закройте транзакцию:
    Подключение.CommitTrans();

5.3. Альтернативные форматы для больших объёмов

Если файл DBF превышает 2 ГБ или содержит миллионы записей, рассмотрите конвертацию в промежуточный формат:

  • 📑 CSV: Простота обработки, но потеря типов данных.
  • 📄 XML/JSON: Сохранение структуры, но увеличение размера файла.
  • 🗃️ SQLite: Встроенная поддержка в через внешние компоненты.

Пример конвертации DBF → CSV:

ТекстCSV = "";

Запрос = Новый COMОбъект("ADODB.Recordset");

Запрос.Open("SELECT * FROM большой_файл.dbf", Подключение);

// Формируем заголовок

Для Инд = 0 По Запрос.Fields.Count - 1 Цикл

ТекстCSV = ТекстCSV + Запрос.Fields(Инд).Name + ";";

КонецЦикла;

ТекстCSV = Лев(ТекстCSV, СтрДлина(ТекстCSV) - 1) + Символы.ПС;

// Формируем данные

Пока Не Запрос.EOF() Цикл

Для Инд = 0 По Запрос.Fields.Count - 1 Цикл

ТекстCSV = ТекстCSV + """" + Запрос.Fields(Инд).Value + """;";

КонецЦикла;

ТекстCSV = Лев(ТекстCSV, СтрДлина(ТекстCSV) - 1) + Символы.ПС;

Запрос.MoveNext();

КонецЦикла;

// Сохраняем в файл

ЗаписьТекста = Новый ЗаписьТекста("C:\data\выгрузка.csv", КодировкаТекста.UTF8);

ЗаписьТекста.ЗаписатьСтроку(ТекстCSV);

ЗаписьТекста.Закрыть();

6. Работа с XBase в 64-битной 1С

Начиная с версии 8.3.20, 1С:Предприятие активно переходит на 64-битную архитектуру, где стандартные методы работы с DBF (например, V82.DBF.dll) перестают функционировать. В этом разделе — актуальные решения для 64-bit.

6.1. Использование 32-битного режима

Самый простой способ — запустить в 32-битном режиме:

  1. Создайте ярлык для 1cv8.exe.
  2. В свойствах ярлыка добавьте ключ /RunModeOrdinaryApplication.
  3. Укажите путь к 32-битной версии платформы (например, C:\Program Files (x86)\1cv8\8.3.20.1500\bin\1cv8.exe).

Ограничение: этот метод не подходит для серверных задач (фоновые задания, HTTP-сервисы).

6.2. Альтернативные библиотеки для 64-bit

Для работы в 64-битном режиме используйте:

  • 📖 ADODB + Microsoft ACE OLEDB 12.0:
    Подключение.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Путь\;Extended Properties=dBASE IV;";

    (требует установки Microsoft Access Database Engine 2016).

  • 🛠️ Внешняя компонента NativeDBF: Бесплатная библиотека с поддержкой 64-bit (доступна на GitHub).
  • 🗂️ Конвертация через Python: Запуск скрипта из с использованием библиотеки dbfread.

Пример вызова Python-скрипта из :

Команда = "python C:\scripts\convert_dbf.py C:\data\input.dbf C:\data\output.json";

ВыполнитьКомандуСистемы(Команда, Истина);

⚠️ Внимание: При использовании Microsoft.ACE.OLEDB.12.0 на сервере убедитесь, что драйвер установлен в системе под тем же пользователем, под которым работает служба 1С:Предприятие.

7. Примеры реальных задач

В этом разделе — готовые решения для типовых задач интеграции XBase и .

7.1. Выгрузка справочника номенклатуры в DBF

Задача: экспортировать справочник Номенклатура из 1С:УТ 11 в DBF для загрузки в старую систему.

// 1. Создаём структуру DBF

СоздатьDBF("C:\export\nomenklatura.dbf", "КОД C(10), НАИМЕНОВ C(100), ЦЕНА N(10,2)");

// 2. Подключаемся к файлу

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

Подключение.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\export\;Extended Properties=dBASE IV;");

// 3. Выгружаем данные

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ

Номенклатура.Ссылка КАК Ссылка,

Номенклатура.Наименование КАК Наименование,

Номенклатура.ЦенаПродажи КАК Цена

ИЗ

Справочник.Номенклатура КАК Номенклатура";

Результат = Запрос.Выполнить();

Выборка = Результат.Выбрать();

Пока Выборка.Следующий() Цикл

НоваяЗапись = ЗапросDBF.AddNew();

НоваяЗапись.Fields("КОД").Value = Формат(Выборка.Ссылка.УникальныйИдентификатор(), "ЧГ=0");

НоваяЗапись.Fields("НАИМЕНОВ").Value = Выборка.Наименование;

НоваяЗапись.Fields("ЦЕНА").Value = Выборка.Цена;

НоваяЗапись.Update();

КонецЦикла;

7.2. Загрузка данных из кассового аппарата (Штрих-М)

Многие кассовые аппараты (Атол, Штрих-М) экспортируют данные продаж в DBF. Пример загрузки чеков:

// 1. Подключаем файл выгрузки

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

Подключение.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\KKM\;Extended Properties=dBASE IV;CharacterSet=OEM;";

Подключение.Open();

Запрос = Новый COMОбъект("ADODB.Recordset");

Запрос.Open("SELECT * FROM cheques.dbf", Подключение);

// 2. Создаём документ "Чек ККМ" в 1С

Пока Не Запрос.EOF() Цикл

Чек = Документы.ЧекККМ.СоздатьДокумент();

Чек.Дата = СтрокуВДату(Запрос.Fields("ДАТА_ЧЕКА").Value, "ДФ=yyyyMMdd");

Чек.Сумма = Запрос.Fields("СУММА").Value;

Чек.Записать();

Запрос.MoveNext();

КонецЦикла;

7.3. Обмен данными с 1С 7.7

Для переноса данных между 1С 7.7 и 1С 8.3 часто используют DBF как промежуточный формат. Пример выгрузки документов:

// Выгрузка из 1С 8.3 в DBF для 1С 7.7

Процедура ВыгрузитьДокументы()

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

Подключение.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Обмен\;Extended Properties=dBASE IV;");

// Создаём файл с структурой, совместимой с 1С 7.7

ЗапросDBF = Подключение.Execute("CREATE TABLE докум (ТИПДОК C(3), НОМЕР C(10), ДАТА_D C(8), СУММА N(15,2))");

// Заполняем данными

Запрос = Новый Запрос;

Запрос.Текст = "