К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как прочитать DBF-файл в 1С: инструкция с примерами кода

Как прочитать DBF-файл в 1С: объект XBase, пошаговый код чтения записей, работа с кодировками, типичные ошибки и проверка результата.

Формат DBF до сих пор встречается в обменах с банками, старыми складскими программами, кассовым оборудованием и государственными системами. Когда внешняя система отдаёт выгрузку именно в DBF, у разработчика 1С есть встроенный и надёжный инструмент — объект XBase, который позволяет читать такие файлы напрямую из встроенного языка без внешних компонентов.

Чтение DBF в 1С сводится к нескольким шагам: создать объект XBase, указать путь к файлу и кодировку, открыть файл, перебрать записи и прочитать значения полей. Сложности обычно возникают не с самим кодом, а с кодировкой, типами полей и индексными файлами — именно эти моменты разобраны ниже.

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

Что такое объект XBase и когда его использовать

XBase — встроенный объект платформы 1С:Предприятие 8, предназначенный для работы с файлами формата DBF (dBase, FoxPro). Он поддерживает чтение и запись записей, создание новых DBF-файлов, работу с индексами и навигацию по записям. Объект доступен во встроенном языке без установки дополнительных компонентов.

XBase подходит, когда нужно разово загрузить справочник из старой системы, настроить регулярный обмен с программой, отдающей данные в DBF, или прочитать выгрузку банка. Если же источник умеет отдавать CSV, XML или JSON — чаще рациональнее использовать их: DBF имеет ограничения на длину имён полей (обычно 10 символов) и устаревшие типы данных.

Подготовка: что проверить перед чтением файла

До написания кода полезно выяснить три вещи о конкретном файле. Первое — кодировку: старые DOS-приложения пишут в кодировке OEM (cp866), более новые — в ANSI (cp1251). Неправильно выбранная кодировка не вызовет ошибку, но русские буквы превратятся в «кракозябры», и это легко принять за битый файл.

Второе — типы и состав полей. Откройте файл любым DBF-просмотрщиком (например, офисными средствами или специализированными утилитами) и запишите имена полей и их типы: символьное (C), числовое (N), дата (D), логическое (L), мемо (M). Третье — наличие файла мемо-полей: если в структуре есть поле типа M, рядом с DBF должен лежать соответствующий DBT/FPT-файл, иначе мемо-данные не прочитаются.

Русский текст в виде «кракозябр»Неверная кодировка

Переключите КодировкуXBase: ANSI ↔ OEM и прочитайте файл заново

Поле типа M в структуреЕсть мемо-поля

Проверьте наличие рядом файла DBT или FPT с тем же именем

Файл не открываетсяФайл занят или повреждён

Убедитесь, что файл не открыт другой программой, и проверьте его размер

Минимальный код чтения DBF

Базовый сценарий: создаём объект, задаём кодировку, открываем файл и перебираем записи. Кодировка задаётся через свойство Кодировка со значением перечисления КодировкаXBase.ANSI или КодировкаXBase.OEM.

bsl
ДБФ = Новый XBase;
ДБФ.Кодировка = КодировкаXBase.ANSI;
ДБФ.ОткрытьФайл("C:\Обмен\sprav.dbf");

Если ДБФ.Открыта() Тогда
    ДБФ.Первая();
    Пока Не ДБФ.ВКонце() Цикл
        Наименование = ДБФ.NAME;
        Цена = ДБФ.PRICE;
        Сообщить(Наименование + " — " + Цена);
        ДБФ.Следующая();
    КонецЦикла;
    ДБФ.ЗакрытьФайл();
Иначе
    Сообщить("Не удалось открыть файл");
КонецЕсли;

Обращение к полям возможно двумя способами: напрямую по имени (ДБФ.NAME) или через коллекцию ДБФ.Поля по индексу или имени (ДБФ.Поля.Получить(0).Имя). Первый вариант короче, второй безопаснее, когда имена полей заранее неизвестны или могут совпадать с зарезервированными словами.

Обратите внимание: после ОткрытьФайл() указатель стоит до первой записи, поэтому перед чтением вызывается Первая(). Метод ВКонце() возвращает признак достижения конца файла — это стандартный шаблон цикла обхода.

Работа с типами полей и пропущенными значениями

XBase сам приводит типы DBF к типам 1С: символьные поля возвращаются строкой, числовые — числом, даты — датой, логические — булево. Однако есть нюансы. Числовое поле с дробной частью возвращает число с тем количеством знаков, что задано в структуре файла; при переполнении ширины поля в файле могут лежать звёздочки — такое значение прочитается некорректно, и его стоит обрабатывать через попытку/исключение.

Дата в DBF может быть пустой — тогда читается дата '00010101'. Логическое поле может содержать неопределённое состояние. Удалённые записи (помеченные на удаление, но не сжатые) по умолчанию тоже читаются; проверить пометку удаления можно методом ЗаписьУдалена() и пропускать такие строки.

bsl
Пока Не ДБФ.ВКонце() Цикл
    Если ДБФ.ЗаписьУдалена() Тогда
        ДБФ.Следующая();
        Продолжить;
    КонецЕсли;
    ДатаДок = ДБФ.DOCDATE;
    Если Не ЗначениеЗаполнено(ДатаДок) Тогда
        ДатаДок = ТекущаяДатаСеанса();
    КонецЕсли;
    ДБФ.Следующая();
КонецЦикла;

Чтение файла с неизвестной структурой

Когда имена полей заранее неизвестны — например, вы пишете универсальную обработку загрузки — структуру можно получить программно через коллекцию Поля. У каждого элемента доступны свойства Имя, Тип, Длина, Точность. Это позволяет построить таблицу значений с колонками по структуре файла и выгрузить туда все записи.

Порядок действий для универсальной загрузки
  1. 1
    Откройте файл через XBase и проверьте ДБФ.Открыта()
  2. 2
    Переберите ДБФ.Поля и создайте колонки таблицы значений с соответствующими типами
  3. 3
    Пройдите по записям циклом Первая()/Следующая(), заполняя строки таблицы
  4. 4
    Закройте файл методом ЗакрытьФайл()
  5. 5
    Сверьте количество загруженных строк с количеством записей в файле (ДБФ.КоличествоЗаписей())

Такой подход удобен для разовых миграций: выгрузили всё в таблицу значений, показали пользователю, дали сопоставить поля с реквизитами справочника — и только потом записали в базу. Это снижает риск «мусорной» загрузки, когда данные пишутся напрямую без визуального контроля.

Тонкие места: кодировка, индексы, клиент-сервер

Если текст читается неправильно, попробуйте сменить кодировку и открыть файл заново — это самая частая причина проблем. Определить кодировку автоматически платформа не умеет, поэтому в серьёзных обменах её фиксируют в настройках обмена, а не угадывают.

Индексные файлы (CDX/MDX) нужны для поиска и сортировки, но для простого последовательного чтения они не требуются. Если при открытии с индексом файл «не видит» часть записей — читайте без индекса. Ещё одна типовая ловушка: в клиент-серверном режиме код, выполняемый на сервере, ищет файл на диске сервера, а не на компьютере пользователя. Файл нужно либо поместить в доступный серверу каталог, либо передать на сервер через временное хранилище.

Типичные ошибки
01
Чтение с кодировкой ANSI файла, записанного в OEM, — русский текст превращается в мусор, и его ошибочно загружают в базу
02
Обращение к полю по имени, которого нет в файле, — возникает ошибка «Поле не найдено»; проверяйте структуру через ДБФ.Поля
03
Забытый ЗакрытьФайл() — файл остаётся заблокированным, и следующая попытка открытия завершается ошибкой
04
Чтение на сервере файла с локального диска клиента — файл не находится, потому что сервер не видит диск C пользователя
05
Игнорирование помеченных на удаление записей — в базу попадают данные, которые источник считал удалёнными

Проверка результата и альтернативы XBase

После загрузки сверьте контрольные цифры: количество прочитанных записей (свойство КоличествоЗаписей()), количество созданных объектов в базе и выборочно несколько значений по ключевым записям. Расхождение числа записей чаще всего объясняется удалёнными записями или досрочным выходом из цикла из-за ошибки.

Если XBase по какой-то причине не подходит, есть альтернативы. ADO (через COM-объект ADODB.Connection с провайдером OLE DB для DBF) позволяет выполнять SQL-запросы поверх DBF, но работает только на Windows-клиенте и требует установленного провайдера. Внешние обработки и утилиты-конвертеры могут преобразовать DBF в CSV или Excel, после чего файл читается штатными средствами. Для регулярных обменов иногда проще договориться с источником о выгрузке в современном формате.

Сравнение вариантов чтения DBF

XBase

Встроенный объект платформы, работает везде, не требует установки. Ограничение: нет SQL, только последовательный перебор и простой поиск

ADO (ADODB)

Позволяет SQL-запросы с фильтрацией и соединениями таблиц. Ограничение: только Windows, нужен установленный OLE DB провайдер, работа через COM

Конвертация в CSV/Excel

Просто и наглядно, подходит для разовых загрузок. Ограничение: лишний ручной шаг, риск потери типов данных при конвертации

Контрольные точки

Как проверить результат

Количество загруженных записей
Норма

Совпадает с ДБФ.КоличествоЗаписей() за вычетом удалённых

Тревожный признак

Меньше ожидаемого без объяснимой причины

Русский текст в полях
Норма

Читаемые символы

Тревожный признак

«Кракозябры» — неверная кодировка

Даты и числа
Норма

Корректные значения в разумных диапазонах

Тревожный признак

Пустые даты там, где они обязательны, нули вместо чисел

Доступность файла после работы
Норма

Файл открывается другими программами

Тревожный признак

Файл заблокирован — не вызван ЗакрытьФайл()

Частые вопросы

Можно ли читать DBF в 1С без XBase?

Да, через ADO (COM-объект ADODB.Connection) с OLE DB провайдером для DBF — это даёт возможность выполнять SQL-запросы. Однако способ работает только под Windows и требует установленного провайдера, поэтому XBase остаётся основным и самым переносимым вариантом.

Почему русские буквы из DBF читаются как «кракозябры»?

Причина — несовпадение кодировки: файл записан в DOS-кодировке (OEM, cp866), а читается как Windows (ANSI, cp1251), или наоборот. Установите свойство Кодировка в другое значение (КодировкаXBase.OEM или КодировкаXBase.ANSI) и откройте файл заново.

Как узнать структуру полей DBF программно?

Откройте файл через XBase и переберите коллекцию ДБФ.Поля. У каждого поля доступны свойства Имя, Тип, Длина и Точность. Это позволяет строить универсальные загрузчики, не зная структуру заранее.

Файл открывается, но записей меньше, чем ожидалось. В чём причина?

Наиболее вероятные причины: часть записей помечена на удаление (проверяйте ЗаписьУдалена()), либо файл открыт с устаревшим индексом, который скрывает часть данных. Попробуйте читать файл без индекса и посчитайте записи через КоличествоЗаписей().

Работает ли чтение DBF на сервере 1С и в веб-клиенте?

XBase работает на сервере, но файл должен быть физически доступен серверу — локальный диск пользователя сервер не видит. Передайте файл на сервер через временное хранилище (ПоместитьВоВременноеХранилище) и сохраните его во временный файл на стороне сервера. В веб-клиенте прямая работа с локальной файловой системой ограничена, поэтому загрузку тоже выполняют через передачу файла на сервер.

Можно ли через XBase не только читать, но и записывать DBF?

Да, XBase поддерживает создание новых файлов (методы создания структуры полей и СоздатьФайл), добавление и изменение записей. Это используется для обратных выгрузок — например, передачи справочника товаров в кассовую программу, принимающую DBF.

Итог

Что важно запомнить

DBF в 1С читается объектом XBase: задайте кодировку, откройте файл, переберите записи циклом Первая()/Следующая() и закройте файл. Главные источники проблем — неверная кодировка, удалённые записи и недоступность файла на сервере. Перед загрузкой в рабочую базу проверяйте результат на копии и сверяйте контрольные количества.