Разработка и Конфигурация · 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 и прочитайте файл заново
Проверьте наличие рядом файла DBT или FPT с тем же именем
Убедитесь, что файл не открыт другой программой, и проверьте его размер
Минимальный код чтения DBF
Базовый сценарий: создаём объект, задаём кодировку, открываем файл и перебираем записи. Кодировка задаётся через свойство Кодировка со значением перечисления КодировкаXBase.ANSI или КодировкаXBase.OEM.
ДБФ = Новый XBase;
ДБФ.Кодировка = КодировкаXBase.ANSI;
ДБФ.ОткрытьФайл("C:\Обмен\sprav.dbf");
Если ДБФ.Открыта() Тогда
ДБФ.Первая();
Пока Не ДБФ.ВКонце() Цикл
Наименование = ДБФ.NAME;
Цена = ДБФ.PRICE;
Сообщить(Наименование + " — " + Цена);
ДБФ.Следующая();
КонецЦикла;
ДБФ.ЗакрытьФайл();
Иначе
Сообщить("Не удалось открыть файл");
КонецЕсли;Обращение к полям возможно двумя способами: напрямую по имени (ДБФ.NAME) или через коллекцию ДБФ.Поля по индексу или имени (ДБФ.Поля.Получить(0).Имя). Первый вариант короче, второй безопаснее, когда имена полей заранее неизвестны или могут совпадать с зарезервированными словами.
Обратите внимание: после ОткрытьФайл() указатель стоит до первой записи, поэтому перед чтением вызывается Первая(). Метод ВКонце() возвращает признак достижения конца файла — это стандартный шаблон цикла обхода.
Работа с типами полей и пропущенными значениями
XBase сам приводит типы DBF к типам 1С: символьные поля возвращаются строкой, числовые — числом, даты — датой, логические — булево. Однако есть нюансы. Числовое поле с дробной частью возвращает число с тем количеством знаков, что задано в структуре файла; при переполнении ширины поля в файле могут лежать звёздочки — такое значение прочитается некорректно, и его стоит обрабатывать через попытку/исключение.
Дата в DBF может быть пустой — тогда читается дата '00010101'. Логическое поле может содержать неопределённое состояние. Удалённые записи (помеченные на удаление, но не сжатые) по умолчанию тоже читаются; проверить пометку удаления можно методом ЗаписьУдалена() и пропускать такие строки.
Пока Не ДБФ.ВКонце() Цикл
Если ДБФ.ЗаписьУдалена() Тогда
ДБФ.Следующая();
Продолжить;
КонецЕсли;
ДатаДок = ДБФ.DOCDATE;
Если Не ЗначениеЗаполнено(ДатаДок) Тогда
ДатаДок = ТекущаяДатаСеанса();
КонецЕсли;
ДБФ.Следующая();
КонецЦикла;Чтение файла с неизвестной структурой
Когда имена полей заранее неизвестны — например, вы пишете универсальную обработку загрузки — структуру можно получить программно через коллекцию Поля. У каждого элемента доступны свойства Имя, Тип, Длина, Точность. Это позволяет построить таблицу значений с колонками по структуре файла и выгрузить туда все записи.
- 1Откройте файл через XBase и проверьте ДБФ.Открыта()
- 2Переберите ДБФ.Поля и создайте колонки таблицы значений с соответствующими типами
- 3Пройдите по записям циклом Первая()/Следующая(), заполняя строки таблицы
- 4Закройте файл методом ЗакрытьФайл()
- 5Сверьте количество загруженных строк с количеством записей в файле (ДБФ.КоличествоЗаписей())
Такой подход удобен для разовых миграций: выгрузили всё в таблицу значений, показали пользователю, дали сопоставить поля с реквизитами справочника — и только потом записали в базу. Это снижает риск «мусорной» загрузки, когда данные пишутся напрямую без визуального контроля.
Тонкие места: кодировка, индексы, клиент-сервер
Если текст читается неправильно, попробуйте сменить кодировку и открыть файл заново — это самая частая причина проблем. Определить кодировку автоматически платформа не умеет, поэтому в серьёзных обменах её фиксируют в настройках обмена, а не угадывают.
Индексные файлы (CDX/MDX) нужны для поиска и сортировки, но для простого последовательного чтения они не требуются. Если при открытии с индексом файл «не видит» часть записей — читайте без индекса. Ещё одна типовая ловушка: в клиент-серверном режиме код, выполняемый на сервере, ищет файл на диске сервера, а не на компьютере пользователя. Файл нужно либо поместить в доступный серверу каталог, либо передать на сервер через временное хранилище.
Проверка результата и альтернативы XBase
После загрузки сверьте контрольные цифры: количество прочитанных записей (свойство КоличествоЗаписей()), количество созданных объектов в базе и выборочно несколько значений по ключевым записям. Расхождение числа записей чаще всего объясняется удалёнными записями или досрочным выходом из цикла из-за ошибки.
Если XBase по какой-то причине не подходит, есть альтернативы. ADO (через COM-объект ADODB.Connection с провайдером OLE DB для DBF) позволяет выполнять SQL-запросы поверх DBF, но работает только на Windows-клиенте и требует установленного провайдера. Внешние обработки и утилиты-конвертеры могут преобразовать DBF в CSV или Excel, после чего файл читается штатными средствами. Для регулярных обменов иногда проще договориться с источником о выгрузке в современном формате.
Сравнение вариантов чтения DBF
Встроенный объект платформы, работает везде, не требует установки. Ограничение: нет SQL, только последовательный перебор и простой поиск
Позволяет SQL-запросы с фильтрацией и соединениями таблиц. Ограничение: только Windows, нужен установленный OLE DB провайдер, работа через COM
Просто и наглядно, подходит для разовых загрузок. Ограничение: лишний ручной шаг, риск потери типов данных при конвертации
Как проверить результат
Совпадает с ДБФ.КоличествоЗаписей() за вычетом удалённых
Меньше ожидаемого без объяснимой причины
Читаемые символы
«Кракозябры» — неверная кодировка
Корректные значения в разумных диапазонах
Пустые даты там, где они обязательны, нули вместо чисел
Файл открывается другими программами
Файл заблокирован — не вызван ЗакрытьФайл()
Частые вопросы
Можно ли читать 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: задайте кодировку, откройте файл, переберите записи циклом Первая()/Следующая() и закройте файл. Главные источники проблем — неверная кодировка, удалённые записи и недоступность файла на сервере. Перед загрузкой в рабочую базу проверяйте результат на копии и сверяйте контрольные количества.