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

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

Как прочитать DBF-файл в 1С

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

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

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

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

Что такое объект XBase и когда он нужен

XBase — встроенный объект платформы 1С:Предприятие 8, предназначенный для работы с файлами формата DBF (dBase III/IV). Он доступен и на клиенте, и на сервере, не требует дополнительных компонентов, драйверов ODBC или установленного Microsoft Office. Это делает его основным инструментом, когда нужно прочитать DBF в 1С без сторонних программ.

Объект умеет читать структуру файла (список полей, их типы и длины), перемещаться по записям, получать значения полей по имени или индексу, а также создавать новые DBF-файлы и записывать в них данные. Для задачи загрузки данных достаточно читающей части функциональности.

Типовые сценарии применения: загрузка банковских выписок и реестров, импорт справочников из устаревших систем, чтение классификаторов (КЛАДР/ФИАС в старых поставках, перечни ОКВЭД), разбор прайсов поставщиков, которые выгружают данные в DBF.

Как открыть DBF-файл: минимальный код

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

ДБФ = Новый XBase;

ДБФ.Кодировка = КодировкаXBase.OEM;

ДБФ.ОткрытьФайл("C:\Обмен\sprav.dbf");

Если Не ДБФ.Открыта() Тогда

Сообщить("Не удалось открыть DBF-файл");

Возврат;

КонецЕсли;

// ... чтение данных ...

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

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

После завершения работы вызывайте ЗакрытьФайл() — это снимает блокировку с файла и освобождает ресурсы. Хорошая практика — обернуть чтение в конструкцию Попытка...Исключение и закрывать файл в любом случае.

Порядок чтения DBF-файла
  1. 1
    Создайте объект: ДБФ = Новый XBase
  2. 2
    Укажите кодировку через свойство Кодировка (обычно OEM или ANSI)
  3. 3
    Откройте файл методом ОткрытьФайл() с полным путем
  4. 4
    Проверьте успешность открытия свойством Открыта()
  5. 5
    Переберите записи методами Первая(), Следующая() и проверкой ВКонце()
  6. 6
    Прочитайте значения полей через ДБФ.ИмяПоля или ДБФ.ПолучитьЗначениеПоля()
  7. 7
    Закройте файл методом ЗакрытьФайл()

Как определить структуру файла и прочитать поля

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

Для Каждого Поле Из ДБФ.Поля Цикл

Сообщить(Поле.Имя + " | " + Поле.Тип + " | длина: " + Поле.Длина);

КонецЦикла;

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

Обратите внимание на типы данных: даты из DBF приходят как значения типа «Дата», числа — как «Число», логические поля — как «Булево». Пустые даты и числа в DBF могут возвращаться как пустые значения соответствующего типа, поэтому перед использованием в сравнениях и расчетах стоит проверять их на заполненность.

Перебор записей и позиционирование

Навигация по записям выполняется методами Первая(), Следующая(), Предыдущая(), Последняя() и Перейти(НомерЗаписи). Признак достижения конца данных — функция ВКонце(), начала — ВНачале(). Текущий номер записи доступен через свойство НомерЗаписи, общее количество — через КоличествоЗаписей.

ДБФ.Первая();

Пока Не ДБФ.ВКонце() Цикл

КодТовара = СокрЛП(ДБФ.CODE);

Наименование = СокрЛП(ДБФ.NAME);

Цена = ДБФ.PRICE;

// здесь — поиск или создание элемента справочника в 1С

ДБФ.Следующая();

КонецЦикла;

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

Для больших файлов (сотни тысяч записей) перебор работает быстро, узким местом обычно становится не чтение DBF, а запись данных в информационную базу. Если загружаете данные в справочники или документы, выполняйте запись пачками внутри транзакции и по возможности ищите существующие элементы по индексированным реквизитам.

Кодировка: почему вместо текста «кракозябры»

Самая частая проблема при чтении DBF — неправильная кодировка. Формат не хранит информацию о ней, а исторически файлы создавались либо в DOS-кодировке (OEM, CP866), либо в Windows-кодировке (ANSI, CP1251). Если кодировку не указать, 1С использует значение по умолчанию, и русский текст может отобразиться нечитаемыми символами.

Кодировка задается свойством Кодировка до открытия файла. Доступны значения перечисления КодировкаXBase: ANSI и OEM. Практическое правило: файлы из старых DOS-программ и многих бухгалтерских систем — чаще OEM, выгрузки из Windows-приложений — чаще ANSI.

ДБФ = Новый XBase;

ДБФ.Кодировка = КодировкаXBase.ANSI; // если OEM дает нечитаемый текст

ДБФ.ОткрытьФайл("C:\Обмен\price.dbf");

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

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

Как проверить, что чтение прошло правильно

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

Слова читаются, буквы на месте

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

Нечитаемые символы — смените кодировку OEM/ANSI

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

Совпадает с КоличествоЗаписей и с числом строк в исходной программе

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

Меньше ожидаемого — возможно, цикл прерывается раньше времени

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

Соответствуют значениям в источнике

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

Пустые или сдвинутые значения — проверьте типы полей и имена

Загрузка данных из DBF в справочник 1С

Типовая задача — перенести содержимое DBF в справочник, например «Номенклатура». Логика такая: для каждой записи ищем существующий элемент по коду или наименованию, если не нашли — создаем новый, затем заполняем реквизиты значениями полей и записываем.

ДБФ = Новый XBase;

ДБФ.Кодировка = КодировкаXBase.OEM;

ДБФ.ОткрытьФайл("C:\Обмен\goods.dbf");

Если ДБФ.Открыта() Тогда

ДБФ.Первая();

Пока Не ДБФ.ВКонце() Цикл

КодТовара = СокрЛП(ДБФ.CODE);

Элемент = Справочники.Номенклатура.НайтиПоКоду(КодТовара);

Если Элемент.Пустая() Тогда

НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();

НовыйЭлемент.Код = КодТовара;

Иначе

НовыйЭлемент = Элемент.ПолучитьОбъект();

КонецЕсли;

НовыйЭлемент.Наименование = СокрЛП(ДБФ.NAME);

НовыйЭлемент.Записать();

ДБФ.Следующая();

КонецЦикла;

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

КонецЕсли;

При загрузке больших объемов оберните цикл в транзакцию (НачатьТранзакцию() / ЗафиксироватьТранзакцию()) или фиксируйте порциями — это ускорит запись и защитит базу от частично загруженных данных при сбое. Также полезно считать количество созданных и обновленных элементов и выводить итог пользователю — это простейший контроль полноты загрузки.

Альтернативные способы прочитать DBF

Объект XBase — не единственный вариант. Если файл нужно просто посмотреть глазами, его откроют Excel, LibreOffice Calc или специализированные просмотрщики DBF. Для разовой ручной загрузки в типовых конфигурациях часто есть встроенные обработки загрузки (например, загрузка курсов валют, банковских выписок, адресного классификатора), которые уже используют XBase внутри.

Еще один программный путь — подключение через ADODB/OLE DB с провайдером, поддерживающим dBase. Этот способ позволяет выполнять SQL-запросы к DBF (фильтрацию, группировку), но требует установленного провайдера на машине и корректной разрядности, поэтому в современных конфигурациях применяется редко.

Если источник данных под вашим контролем, лучший вариант — договориться о другом формате обмена: CSV, XML или JSON. Они не имеют проблем с кодировкой (при явном указании UTF-8), поддерживают данные переменной длины и лучше подходят для регулярной интеграции.

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

Объект XBase

Штатный способ в 1С: работает везде без драйверов, подходит для загрузок и обменов. Ограничение — нет SQL-выборок, только последовательный перебор.

Excel / просмотрщик

Подходит, чтобы вручную посмотреть содержимое и сверить данные. Не подходит для автоматической загрузки; при сохранении из Excel структура файла может измениться.

ADODB / OLE DB

Позволяет выполнять SQL-запросы к DBF. Требует установленного провайдера нужной разрядности, что усложняет развертывание.

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

Хороший вариант для регулярного обмена, если источник умеет выгружать в другом формате. Убирает проблему кодировок и ограничения DBF.

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

Первая группа ошибок связана с доступом к файлу: неверный путь, файл открыт в другой программе, у пользователя нет прав на каталог. Признак — Открыта() возвращает Ложь. Проверьте путь, закройте файл в других приложениях и убедитесь, что сервер 1С (при серверном вызове) имеет доступ к сетевому ресурсу.

Вторая группа — ошибки структуры: обращение к несуществующему полю вызывает исключение. Перед чтением по имени проверяйте наличие поля через ДБФ.Поля.Найти("ИМЯ"), особенно если формат файла от поставщика периодически меняется. Учитывайте, что имена полей в DBF исторически ограничены десятью символами и часто пишутся латиницей в верхнем регистре.

Третья группа — логические ошибки перебора: чтение полей до вызова Первая(), отсутствие Следующая() внутри цикла (бесконечный цикл), использование ВКонце() без начального позиционирования. Эти ошибки не повреждают данные, но приводят к пустой загрузке или зависанию обработки.

Типичные ошибки при работе с DBF в 1С
01
Не указана кодировка — русский текст читается нечитаемыми символами; задайте КодировкаXBase.OEM или ANSI до открытия файла
02
Чтение полей до вызова Первая() — данные пустые или ошибочные; всегда позиционируйтесь на первую запись
03
Нет проверки Открыта() — при недоступном файле обработка молча ничего не загружает; проверяйте результат открытия
04
Обращение к полю по имени без проверки — при изменении структуры файла возникает исключение; ищите поле через ДБФ.Поля.Найти()
05
Файл заблокирован другой программой — открытие не выполняется; закройте файл в Excel или просмотрщике перед загрузкой

Проверка результата и ограничения формата

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

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

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

Итог

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

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

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

Можно ли прочитать DBF в 1С без программирования?

Частично. Для просмотра содержимого файл можно открыть в Excel или LibreOffice Calc. В типовых конфигурациях есть встроенные загрузчики для конкретных форматов (банковские выписки, курсы валют, классификаторы). Универсальной кнопки «загрузить любой DBF» в типовых решениях обычно нет — для произвольного файла понадобится обработка с кодом на XBase.

Что делать, если русский текст читается нечитаемыми символами?

Смените кодировку: закройте файл, установите ДБФ.Кодировка = КодировкаXBase.ANSI вместо OEM (или наоборот) и откройте заново. Автоматически кодировка не определяется — только перебором с визуальной проверкой строковых полей.

Как узнать, какие поля есть в DBF-файле?

Откройте файл через XBase и переберите коллекцию ДБФ.Поля — у каждого поля доступны имя, тип и длина. Либо откройте файл в Excel: первая строка покажет заголовки столбцов, соответствующие именам полей.

Почему ОткрытьФайл() не открывает файл, хотя путь правильный?

Частые причины: файл занят другой программой (закройте его в Excel или просмотрщике), у учетной записи, под которой работает сервер 1С, нет доступа к сетевому каталогу, либо путь указан относительно клиента, а код выполняется на сервере. Всегда проверяйте свойство Открыта() и выводите диагностическое сообщение.

Можно ли через XBase не только читать, но и изменять DBF?

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

Что лучше для регулярного обмена — DBF или другой формат?

Если источник позволяет, выбирайте CSV, XML или JSON с явной кодировкой UTF-8: они избавляют от проблем с кодировкой, не обрезают длинные строки и проще сопровождаются. DBF имеет смысл оставлять только тогда, когда формат навязан внешней системой и изменить его нельзя.