Разработка и Конфигурация · 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-файл");
Возврат;
КонецЕсли;
// ... чтение данных ...
ДБФ.ЗакрытьФайл();
Метод ОткрытьФайл() принимает путь к файлу и необязательный параметр — путь к индексному файлу, если он используется. Проверка свойства Открыта() обязательна: если файл не найден, заблокирован другой программой или поврежден, метод не вызовет исключение, а просто вернет управление, и дальнейшее чтение приведет к ошибкам или пустым данным.
После завершения работы вызывайте ЗакрытьФайл() — это снимает блокировку с файла и освобождает ресурсы. Хорошая практика — обернуть чтение в конструкцию Попытка...Исключение и закрывать файл в любом случае.
- 1Создайте объект: ДБФ = Новый XBase
- 2Укажите кодировку через свойство Кодировка (обычно OEM или ANSI)
- 3Откройте файл методом ОткрытьФайл() с полным путем
- 4Проверьте успешность открытия свойством Открыта()
- 5Переберите записи методами Первая(), Следующая() и проверкой ВКонце()
- 6Прочитайте значения полей через ДБФ.ИмяПоля или ДБФ.ПолучитьЗначениеПоля()
- 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
Штатный способ в 1С: работает везде без драйверов, подходит для загрузок и обменов. Ограничение — нет SQL-выборок, только последовательный перебор.
Подходит, чтобы вручную посмотреть содержимое и сверить данные. Не подходит для автоматической загрузки; при сохранении из Excel структура файла может измениться.
Позволяет выполнять SQL-запросы к DBF. Требует установленного провайдера нужной разрядности, что усложняет развертывание.
Хороший вариант для регулярного обмена, если источник умеет выгружать в другом формате. Убирает проблему кодировок и ограничения DBF.
Типичные ошибки и их решение
Первая группа ошибок связана с доступом к файлу: неверный путь, файл открыт в другой программе, у пользователя нет прав на каталог. Признак — Открыта() возвращает Ложь. Проверьте путь, закройте файл в других приложениях и убедитесь, что сервер 1С (при серверном вызове) имеет доступ к сетевому ресурсу.
Вторая группа — ошибки структуры: обращение к несуществующему полю вызывает исключение. Перед чтением по имени проверяйте наличие поля через ДБФ.Поля.Найти("ИМЯ"), особенно если формат файла от поставщика периодически меняется. Учитывайте, что имена полей в DBF исторически ограничены десятью символами и часто пишутся латиницей в верхнем регистре.
Третья группа — логические ошибки перебора: чтение полей до вызова Первая(), отсутствие Следующая() внутри цикла (бесконечный цикл), использование ВКонце() без начального позиционирования. Эти ошибки не повреждают данные, но приводят к пустой загрузке или зависанию обработки.
Проверка результата и ограничения формата
После загрузки сверьте контрольные цифры: количество обработанных записей должно совпадать с КоличествоЗаписей, а выборочные значения (несколько наименований, суммы, даты) — с данными в исходной программе. Удобно вывести первые и последние несколько записей в табличный документ для визуальной сверки.
Помните об ограничениях формата 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 имеет смысл оставлять только тогда, когда формат навязан внешней системой и изменить его нельзя.