Работа с форматом XBase (включающим DBF, CDX, FPT) в среде 1С:Предприятие остаётся актуальной задачей несмотря на появление современных СУБД. Эти файлы широко используются в устаревших системах автоматизации, бухгалтерских программах (например, 1С:Бухгалтерия 7.7) и специализированном оборудовании (кассовые аппараты, сканеры штрихкодов). Внедрение таких данных в актуальные версии 1С:8.3 требует знания нюансов подключения, чтения и записи, а также обработки ошибок совместимости.
В этой статье вы найдёте практические инструкции по интеграции XBase в 1С, включая:
- 🔌 Способы подключения DBF-файлов к конфигурации (внешние обработки, COM-объекты, ADO).
- 📝 Чтение и запись данных с примерами кода на встроенном языке.
- ⚠️ Типичные ошибки (кодировки, блокировки файлов, несовпадение типов полей).
- ⚡ Оптимизация производительности при работе с большими файлами (индексы, пакетная обработка).
Особое внимание уделено совместимости с 64-битными версиями 1С, где стандартные методы работы с DBF могут не функционировать без дополнительных библиотек.
1. Что такое XBase и почему он важен для 1С
XBase — семейство форматов баз данных, разработанных для систем управления реляционными базами (СУБД) типа dBASE, FoxPro, Clipper. В контексте 1С наиболее востребован формат 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.
- Создайте соединение:
Подключение = Новый 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". - Выполните запрос:
Запрос = Новый COMОбъект("ADODB.Recordset");Запрос.Open("SELECT * FROM клиенты.dbf", Подключение);
- Обработайте данные:
Пока Не Запрос.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-битном режиме. Для его использования:
- Скачайте файл
V82.DBF.dll(доступен на сайтах поддержки 1С или в старых дистрибутивах). - Зарегистрируйте библиотеку:
regsvr32 C:\Путь\V82.DBF.dll(выполняется от имени администратора в командной строке).
- Подключите компоненту в 1С:
DBF = Новый COMОбъект("V82.DBF.DBFDocument"); - Откройте файл и читайте данные:
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 в 1С часто сопровождается ошибками, связанными с несовместимостью форматов, блокировками файлов или кодировками. Рассмотрим наиболее распространённые проблемы и способы их устранения.
4.1. Ошибка "Файл занят другим пользователем"
Эта ошибка возникает, когда:
- 🔒 Файл DBF открыт в другой программе (например, Excel или 1С 7.7).
- 📁 Папка с файлом находится на сетевом диске с ограниченными правами.
- 🔄 Внешняя компонента
V82.DBF.dllне освободила ресурсы.
Решения:
- Скопируйте файл в временную папку перед обработкой:
КопироватьФайл("C:\data\исходный.dbf", "C:\temp\копия.dbf"); - Используйте механизм
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 тыс. записей) может значительно замедлять выполнение кода в 1С. Ниже — рекомендации по ускорению обработки.
5.1. Использование индексов (CDX)
Файлы CDX содержат индексы для ускорения поиска в DBF. При подключении через ADODB индексы используются автоматически, если:
- 🔍 Имя индексного файла совпадает с именем DBF (например,
клиенты.dbfиклиенты.cdx). - 📌 Индекс создан по полю, используемому в запросе
WHERE.
Пример запроса с использованием индекса:
Запрос.Open("SELECT * FROM клиенты.dbf WHERE КОД = 1001", Подключение);
5.2. Пакетная обработка данных
При записи большого количества строк избегайте построчной вставки. Вместо этого:
- Соберите данные в
ТаблицуЗначений. - Откройте транзакцию:
Подключение.BeginTrans(); - Выполните массовую вставку:
Для Каждого Строка Из ТаблицаДанных ЦиклНоваяЗапись = Запрос.AddNew();
НоваяЗапись.Fields("КОД").Value = Строка.Код;
НоваяЗапись.Fields("НАИМЕНОВ").Value = Строка.Наименование;
НоваяЗапись.Update();
КонецЦикла;
- Закройте транзакцию:
Подключение.CommitTrans();
5.3. Альтернативные форматы для больших объёмов
Если файл DBF превышает 2 ГБ или содержит миллионы записей, рассмотрите конвертацию в промежуточный формат:
- 📑 CSV: Простота обработки, но потеря типов данных.
- 📄 XML/JSON: Сохранение структуры, но увеличение размера файла.
- 🗃️ SQLite: Встроенная поддержка в 1С через внешние компоненты.
Пример конвертации 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-битного режима
Самый простой способ — запустить 1С в 32-битном режиме:
- Создайте ярлык для
1cv8.exe. - В свойствах ярлыка добавьте ключ
/RunModeOrdinaryApplication. - Укажите путь к 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: Запуск скрипта из 1С с использованием библиотеки
dbfread.
Пример вызова Python-скрипта из 1С:
Команда = "python C:\scripts\convert_dbf.py C:\data\input.dbf C:\data\output.json";
ВыполнитьКомандуСистемы(Команда, Истина);
⚠️ Внимание: При использовании Microsoft.ACE.OLEDB.12.0 на сервере 1С убедитесь, что драйвер установлен в системе под тем же пользователем, под которым работает служба 1С:Предприятие.
7. Примеры реальных задач
В этом разделе — готовые решения для типовых задач интеграции XBase и 1С.
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))");
// Заполняем данными
Запрос = Новый Запрос;
Запрос.Текст = "