Файлы DBF из базы 1С: как прочитать, исправить и перенести данные

· 9 мин

Содержание

Быстрее всего 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 может поменять типы полей
Посмотреть в ExcelExcel (Файл → Открыть, тип 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

  1. Запустите Calc и выберите Файл → Открыть, укажите файл .dbf.
  2. В окне импорта выберите кодировку: для 1С 7.7 обычно «Кириллица (DOS/OS2-866)» или «Кириллица (Windows-1251)».
  3. Если вместо букв «кракозябры» — закройте без сохранения и откройте снова с другой кодировкой.
  4. Для анализа сохраните результат в .ods или .xlsx, а не поверх DBF.

Microsoft Excel

  1. Файл → Открыть, в списке типов выберите «Файлы dBASE (*.dbf)».
  2. Excel откроет файл в кодировке, которую считает по заголовку. Если русский текст сломан, используйте импорт из текста или LibreOffice.
  3. Сохраняйте в .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, не перегоняйте таблицы вручную. Работает другая схема:

  1. В базе 7.7 запускается обработка выгрузки из комплекта правил конвертации. Она читает данные через объекты 7.7, а не через DBF напрямую, и пишет XML.
  2. В базе 8.3 этот XML загружается обработкой «Универсальный обмен данными в формате XML» или встроенным помощником переноса, если он есть в вашей конфигурации.
  3. После загрузки сверяются остатки по счетам и взаиморасчётам на дату переноса.

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

  • 🧩 восстановить запуск 7.7 на отдельной машине и сделать перенос штатно;
  • 🛠 собрать данные вручную: справочники контрагентов и номенклатуры через XBase или Python, остатки — вводом начальных остатков.

Второй путь годится для справочников. Историю документов так переносят редко: слишком много связей.

Что у вас на руках?

Ремонт структуры и восстановление повреждённых DBF

Чаще всего DBF ломается при сбое питания или копировании недописанного файла. Типичные симптомы:

  • ❌ программа пишет «неверный формат» или «файл повреждён»;
  • 🔢 открывается меньше записей, чем было;
  • 🌀 в конце таблицы мусорные строки.

Что внутри заголовка. Первые 32 байта DBF описывают файл: в байтах 4–7 хранится число записей, в байтах 8–9 — длина заголовка, в 10–11 — длина одной записи. Если число записей в заголовке не совпадает с размером файла, редактор либо обрезает таблицу, либо отказывается её открыть.

Порядок действий:

  1. Сделайте копию файла и всех CDX рядом с ним.
  2. Откройте копию в DBF-редакторе с функцией проверки (в DBF Commander и CDBF она есть). Редактор пересчитает число записей по размеру файла.
  3. Посмотрите удалённые записи. В DBF удаление — это пометка: первый байт записи * вместо пробела. Данные остаются в файле, пока таблицу не упакуют (PACK).
  4. Снимите пометку с нужных строк, если их удалили по ошибке.
  5. Для базы 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 иногда не видит. Если запрос падает с ошибкой «таблица не найдена», переименуйте копию файла в короткое имя.

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

Можно ли открыть DBF прямо в 1С 8.3 без программиста?
Штатной команды «Открыть DBF» в типовых конфигурациях нет. Проще пересохранить файл в .xlsx через LibreOffice и загрузить через загрузку из табличного документа.
Почему в Excel видно меньше строк, чем в DBF-редакторе?
Excel не показывает записи с пометкой удаления, а редактор может их показывать. Сравните счётчик записей с выключенным показом удалённых.
Нужна ли лицензия 1С, чтобы читать DBF старой базы 7.7?
Нет. Файлы читаются любым DBF-редактором. Лицензия нужна, только чтобы запустить саму базу в 1С:Предприятии 7.7.
Что делать с файлами .CDX, если их нечем открыть?
Это индексы, данных в них нет. Редакторам они не нужны, а 7.7 восстанавливает их при тестировании базы.
Можно ли перенести базу 7.7 в 8.3, просто скопировав DBF?
Нет. Структура хранения в 8.3 другая, данные переносятся только через выгрузку и загрузку по правилам конвертации.