Файлы DBF из базы 1С: как прочитать, исправить и перенести данные
Содержание
Быстрее всего DBF из 1С открывает LibreOffice Calc: он спрашивает кодировку и сразу показывает таблицу. Для правки и ремонта удобнее отдельный DBF-редактор (DBF Commander, Sdbf, CDBF), для массовой обработки — объект XBase во встроенном языке 1С 8.3 или скрипт на Python. Excel тоже читает DBF, но сохранять в этот формат не умеет с версии 2007.
Откуда вообще берутся DBF в 1С. Файловая база 1С:Предприятия 7.7 хранит все таблицы в DBF с индексами CDX. В 1С 8.3 своих DBF нет, но формат живёт в обменах: выгрузки для банков и фондов, старые классификаторы (КЛАДР), обмен со сторонними учётными программами. Для архива 7.7 и для обменных файлов 8.3 подходы разные, но инструменты общие.
Какой способ выбрать: сравнение по задачам
Сначала определите, что нужно: посмотреть, исправить или перенести.
| Задача | Чем открыть | Плюсы | Ограничения |
|---|---|---|---|
| Быстро посмотреть данные | LibreOffice Calc | Бесплатно, выбор кодировки | Сохранение в DBF может поменять типы полей |
| Посмотреть в Excel | Excel (Файл → Открыть, тип dBASE) | Привычный интерфейс | Только чтение, кодировку не спрашивает |
| Править записи, структуру | DBF Commander, Sdbf, CDBF, DBF Viewer 2000 | Видны удалённые записи, правка полей | Платные версии для части функций |
| Загрузить в 1С 8.3 | Объект XBase | Прямо в базу, без промежуточных файлов | Нужен программист или обработка |
| Пакетная конвертация | Python (dbfread), PowerShell | Сотни файлов за минуту | Нужен скрипт |
| Перенос учёта из 7.7 в 8.3 | Правила конвертации 7.7 → 8 | Переносит связи, а не таблицы | Нужна рабочая платформа 7.7 |
Если цель — перенести учёт из 7.7 в новую конфигурацию, открывать DBF вручную не нужно. Таблицы 7.7 без словаря данных бесполезны: поля в них называются SP101, SP2345, а ссылки хранятся как внутренние коды.
Как устроены DBF-файлы базы 1С 7.7
В каталоге файловой базы 7.7 вы увидите десятки файлов. Их назначение читается по префиксу:
- 📁
SC*.DBF— справочники (одна таблица на справочник); - 📄
DH*.DBF— шапки документов,DT*.DBF— табличные части; - 📒
1SJOURN.DBF— общий журнал документов (дата, номер, вид); - ⚙️
1SCONST.DBF— история периодических значений и констант; - 📊
RA*.DBF,RG*.DBF— движения и итоги регистров; - 🧾
1SBKTTL*.DBFи подобные — бухгалтерские итоги и проводки (в бухгалтерской компоненте); - 🗂
*.CDX— индексы к таблицам.
Расшифровка имён таблиц и полей лежит в текстовом файле 1Cv7.DD в том же каталоге. Откройте его Блокнотом: там строки вида «таблица — описание», «поле — идентификатор реквизита в конфигурации». Без этого файла SP1234 ничего не скажет.
Ещё одна особенность: ссылки на справочники и документы хранятся не как наименования, а как внутренние коды фиксированной длины. Чтобы увидеть «ООО Ромашка» вместо кода, нужно связать таблицу документа с таблицей справочника по полю ID. Табличный редактор этого сам не сделает.
Копируйте каталог базы и работайте только с копией. Открытие DBF в редакторе в режиме записи может поменять заголовок, и 7.7 потом откажется открывать базу.
Как открыть DBF в табличном редакторе
LibreOffice Calc
- Запустите Calc и выберите
Файл → Открыть, укажите файл.dbf. - В окне импорта выберите кодировку: для 1С 7.7 обычно «Кириллица (DOS/OS2-866)» или «Кириллица (Windows-1251)».
- Если вместо букв «кракозябры» — закройте без сохранения и откройте снова с другой кодировкой.
- Для анализа сохраните результат в
.odsили.xlsx, а не поверх DBF.
Microsoft Excel
Файл → Открыть, в списке типов выберите «Файлы dBASE (*.dbf)».- Excel откроет файл в кодировке, которую считает по заголовку. Если русский текст сломан, используйте импорт из текста или LibreOffice.
- Сохраняйте в
.xlsx. Обратно в DBF Excel не пишет.
Access и ODBC
Access импортирует DBF через «Внешние данные» как таблицу dBASE. Это удобно, когда нужно связать несколько таблиц 7.7 запросом: например, DH с SC по коду контрагента. Связи строятся быстрее, чем формулами в Excel.
Табличные редакторы обрезают длинные числа и меняют тип поля при сохранении. Если DBF потом пойдёт обратно в программу (банк-клиент, 7.7), правьте его только DBF-редактором.
Чтение и запись DBF из 1С 8.3: объект XBase
Во встроенном языке 1С 8.3 есть объект XBase. Он открывает DBF, перебирает записи, создаёт новые файлы. Так работают обработки загрузки банковских выписок и классификаторов в старом формате.
Минимальный пример чтения файла в таблицу значений:
База = Новый XBase;
База.Кодировка = КодировкаXBase.OEM; // для DOS-866; для 1251 — КодировкаXBase.ANSI
База.ОткрытьФайл("C:\Обмен\clients.dbf", , Истина); // только чтение
Результат = Новый ТаблицаЗначений;
Для Каждого Поле Из База.Поля Цикл
Результат.Колонки.Добавить(Поле.Имя);
КонецЦикла;
База.Первая();
Пока Не База.ВКонце() Цикл
Строка = Результат.Добавить();
Для Каждого Поле Из База.Поля Цикл
Строка[Поле.Имя] = База[Поле.Имя];
КонецЦикла;
База.Следующая();
КонецЦикла;
База.Закрыть();
Что нужно знать про XBase:
- 🔤 Свойство
Кодировказадайте до открытия файла. Иначе строки придут в неверной кодировке. - 👁 Удалённые записи по умолчанию скрыты. Чтобы их увидеть, установите
ПоказыватьУдаленные = Истина. - 📝 Для выгрузки используйте
СоздатьФайл()после описания полей, затемДобавить()иЗаписать()для каждой строки. - 🖥 Путь к файлу должен быть доступен там, где выполняется код. В клиент-серверной базе серверный код ищет файл на сервере 1С, а не на компьютере пользователя.
Для разовой загрузки в справочник не обязательно писать код. В БП 3.0 и УТ 11 есть загрузка из табличного документа (Загрузить в форме списка или обработка «Загрузка данных из табличного документа»). Порядок простой: DBF → LibreOffice → .xlsx → загрузка в 1С.
Перенос данных из DBF 7.7 в конфигурации 8.3
Если вы переходите с 1С 7.7 на 8.3, не перегоняйте таблицы вручную. Работает другая схема:
- В базе 7.7 запускается обработка выгрузки из комплекта правил конвертации. Она читает данные через объекты 7.7, а не через DBF напрямую, и пишет XML.
- В базе 8.3 этот XML загружается обработкой «Универсальный обмен данными в формате XML» или встроенным помощником переноса, если он есть в вашей конфигурации.
- После загрузки сверяются остатки по счетам и взаиморасчётам на дату переноса.
Для этого нужна работающая платформа 7.7 и рабочая база. Если платформы нет, а остались только DBF, вариантов два:
- 🧩 восстановить запуск 7.7 на отдельной машине и сделать перенос штатно;
- 🛠 собрать данные вручную: справочники контрагентов и номенклатуры через
XBaseили Python, остатки — вводом начальных остатков.
Второй путь годится для справочников. Историю документов так переносят редко: слишком много связей.
Ремонт структуры и восстановление повреждённых DBF
Чаще всего DBF ломается при сбое питания или копировании недописанного файла. Типичные симптомы:
- ❌ программа пишет «неверный формат» или «файл повреждён»;
- 🔢 открывается меньше записей, чем было;
- 🌀 в конце таблицы мусорные строки.
Что внутри заголовка. Первые 32 байта DBF описывают файл: в байтах 4–7 хранится число записей, в байтах 8–9 — длина заголовка, в 10–11 — длина одной записи. Если число записей в заголовке не совпадает с размером файла, редактор либо обрезает таблицу, либо отказывается её открыть.
Порядок действий:
- Сделайте копию файла и всех CDX рядом с ним.
- Откройте копию в DBF-редакторе с функцией проверки (в DBF Commander и CDBF она есть). Редактор пересчитает число записей по размеру файла.
- Посмотрите удалённые записи. В DBF удаление — это пометка: первый байт записи
*вместо пробела. Данные остаются в файле, пока таблицу не упакуют (PACK). - Снимите пометку с нужных строк, если их удалили по ошибке.
- Для базы 7.7 после ремонта перестройте индексы: в конфигураторе 7.7 запустите тестирование и исправление информационной базы с реиндексацией.
Не упаковывайте таблицу (PACK), пока не проверили удалённые записи. После упаковки помеченные строки исчезают физически.
Если повреждён только индекс, а сам DBF цел, данные читаются любым редактором. Индекс 7.7 перестроит сама при тестировании базы.
Кодировки и спецсимволы: почему вместо русских букв мусор
Это самая частая проблема с DBF из 1С. Текст в файле хранится в однобайтовой кодировке, и программа должна знать, в какой.
| Кодировка | Где встречается | Признак ошибки |
|---|---|---|
| CP866 (DOS, OEM) | Базы 7.7 и старые банковские форматы | В Windows-1251 видно «ЏаЁўҐв» |
| Windows-1251 (ANSI) | Базы 7.7 с настройкой ANSI, выгрузки 1С 8 | В 866 видно «╧ЁштхЄ» |
| UTF-8 | Современные выгрузки, редко в DBF | Двойные символы вида «РџСЂ» |
Как определить кодировку по самому файлу. Байт 29 заголовка (метка языкового драйвера) часто подсказывает: 0x65 означает DOS-866, 0xC9 — Windows-1251. Но многие программы пишут туда ноль, поэтому надёжнее открыть файл в двух кодировках и сравнить.
Другие подводные камни:
- 📏 Длина строковых полей. Поле в DBF ограничено 254 символами. Длинное наименование при выгрузке из 1С 8.3 обрезается молча.
- 🔣 Спецсимволы. «Ёлочки», длинное тире, символ № есть не во всех кодировках. В CP866 нет «ёлочек», они превращаются в вопросительные знаки.
- 🔢 Числа. Десятичный разделитель в DBF — точка. При обмене через Excel с русской локалью числа иногда становятся датами или текстом.
- 📅 Пустые даты. Пустая дата в DBF — восемь пробелов. В 1С это должно превращаться в пустую дату, а не в ошибку преобразования.
Если файл уже выгружен в CSV в неверной кодировке, перекодируйте его утилитой iconv:
iconv -f CP866 -t UTF-8 clients.csv > clients_utf8.csv
Пакетная обработка DBF скриптами и из консоли
Когда файлов десятки, ручное открытие не подходит. Удобнее всего Python с библиотекой dbfread: она читает DBF, учитывает кодировку и пропускает удалённые записи.
# pip install dbfread
import csv, glob
from dbfread import DBF
for path in glob.glob(r"C:\Base77\SC*.DBF"):
table = DBF(path, encoding="cp866", ignore_missing_memofile=True)
out = path[:-4] + ".csv"
with open(out, "w", newline="", encoding="utf-8-sig") as f:
w = csv.writer(f, delimiter=";")
w.writerow(table.field_names)
for rec in table:
w.writerow([rec[n] for n in table.field_names])
print(path, "->", out, len(table), "записей")
Скрипт превратит все справочники 7.7 в CSV в UTF-8 с BOM. Такие файлы Excel открывает без проблем с кириллицей. Для записи в DBF есть библиотека dbf — ей пользуются, когда банк или сервис требует файл именно в этом формате.
В Windows без Python можно читать DBF через провайдер OLE DB. В PowerShell подключение выглядит так:
$conn = New-Object System.Data.OleDb.OleDbConnection(
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Base77;Extended Properties=dBASE IV;")
$conn.Open()
$cmd = $conn.CreateCommand()
$cmd.CommandText = "SELECT * FROM SC123"
$t = New-Object System.Data.DataTable
$t.Load($cmd.ExecuteReader())
$t | Export-Csv C:\Base77\SC123.csv -Encoding UTF8 -NoTypeInformation
$conn.Close()
Провайдер ACE ставится вместе с Access или отдельным пакетом Access Database Engine. Его разрядность должна совпадать с разрядностью PowerShell. Источником данных здесь служит каталог, а таблицей — имя файла без расширения.
Имена файлов длиннее восьми символов провайдер dBASE иногда не видит. Если запрос падает с ошибкой «таблица не найдена», переименуйте копию файла в короткое имя.