Формат DBF и 1С 8.3: чтение, выгрузка и обмен через объект XBase

· 11 мин

Содержание

DBF — это табличный файл формата dBase: одна таблица с фиксированным набором полей и записями одинаковой длины. В 1С 8.3 такой файл читают и создают встроенным объектом XBase, а для разового просмотра хватает LibreOffice Calc или Excel. Своего окна «открыть DBF» в типовых конфигурациях нет — нужна обработка или промежуточное преобразование в Excel.

Типичная ситуация: банк прислал зарплатный реестр в .dbf, или клиент переезжает со старой программы, и всё, что удалось из неё достать, — папка с десятком DBF-файлов. Открываете файл — вместо фамилий «кракозябры», а загрузить его в 1С кнопкой не получается. Ниже — что внутри такого файла, как его прочитать и как обменяться им с 1С без потерь.

Что такое DBF и зачем он нужен в 1С

Формат появился в СУБД dBase ещё в 1980-х, потом его подхватили FoxPro, Clipper и десятки учётных программ. Он простой, открытый и читается практически чем угодно. Поэтому DBF до сих пор живёт там, где обмен настроили давно и менять его никто не хочет.

Где бухгалтер или 1С-ник встречает DBF сегодня:

  • 🏦 зарплатные реестры и выписки некоторых банков и банк-клиентов старого образца;
  • 📦 выгрузки из старых учётных систем на FoxPro и Clipper при переходе на 1С;
  • 🗂 таблицы базы 1С:Предприятие 7.7 в файловом варианте — она хранила данные именно в DBF с индексами CDX;
  • 🗺 архивы классификаторов: КЛАДР и ранние выгрузки ФИАС распространялись в DBF;
  • 🏛 обмен с ведомственными и муниципальными программами, где формат задан десятилетия назад.

Сама 1С 8.3 данные в DBF не хранит. Файловая база восьмёрки — это один файл 1Cv8.1CD, клиент-серверная лежит в MS SQL или PostgreSQL. DBF для 8.3 — только формат обмена.

Если прислали папку с файлами вида 1Cv7.DD, 1SJOURN.DBF, SC123.DBF — это база 1С 7.7, а не «обычные» DBF. Разбирать её таблицы вручную бессмысленно: данные переносят в 8.3 типовыми обработками перехода, которые подключаются к 7.7 и читают объекты целиком.

Как устроен DBF-файл изнутри

Понимать структуру нужно не ради теории. Почти все проблемы с DBF — кодировка, обрезанные строки, «лишние» записи — объясняются тем, как файл устроен.

Файл состоит из трёх частей:

  1. Заголовок — 32 байта. В нём версия формата, дата последнего изменения, число записей, длина заголовка и длина одной записи.
  2. Описание полей — по 32 байта на каждое поле: имя (до 10 символов), тип, длина и число знаков после запятой. Блок заканчивается байтом 0x0D.
  3. Записи — идут подряд, все одной длины. Первый байт каждой записи — флаг удаления: пробел означает живую запись, звёздочка * — помеченную на удаление.

Основные типы полей:

КодТипЧто хранитОграничения
CСимвольныйСтрокуДо 254 символов, дополняется пробелами
NЧисловойЧисло как текстДлина и точность задаются заранее
DДатаДату в виде ГГГГММДДРовно 8 символов, без времени
LЛогическийT/F (или Y/N)1 символ
MМемоДлинный текст во внешнем файлеТекст лежит в .dbt или .fpt рядом

Отсюда три практических вывода:

  • ⚠️ Кодировка в файле почти не указана. В заголовке есть байт кодовой страницы, но многие программы его не заполняют. Читающая сторона должна сама знать, в чём записан текст: DOS-кодировка 866 или Windows-1251.
  • ✂️ Длина полей фиксирована. Если поле NAME объявлено на 40 символов, наименование из 60 символов при записи обрежется молча.
  • 🗑 Удалённые записи физически остаются в файле. Программа, которая не учитывает флаг, покажет их как обычные строки.

Если рядом с .dbf лежат файлы .cdx, .mdx, .ntx или .ndx — это индексы. Для чтения данных они не нужны, но файл .dbt/.fpt с мемо-полями терять нельзя: без него длинные тексты пропадут.

Чем открыть DBF-файл: пять способов

Способ выбирают по задаче: просто посмотреть, поправить пару значений или регулярно грузить в 1С.

СпособКогда подходитОграничения
LibreOffice CalcПосмотреть, поправить, сохранить обратно в DBFКодировку выбирают вручную при открытии
Microsoft ExcelПосмотреть и пересохранить в .xlsxСохранять в DBF современный Excel не умеет
Специализированный просмотрщик DBFБольшие файлы, правка структуры, кодировкиСторонняя программа, часто платная
Обработка 1С на объекте XBaseРегулярная загрузка в справочники и документыНужен программист или готовая обработка
ADO/ODBC из 1С через COMЗапросы к DBF как к таблице SQLТолько Windows, нужен драйвер нужной разрядности

LibreOffice Calc

Самый удобный бесплатный вариант. При открытии .dbf Calc показывает окно выбора кодировки: для файлов из DOS-программ выбирайте «Кириллица (DOS/OS2-866/Русская)», для остальных — «Кириллица (Windows-1251)». Если текст нечитаемый, закройте файл без сохранения и откройте с другой кодировкой.

Сохранить обратно можно через Файл → Сохранить как с типом «dBASE (.dbf)». Calc сам подберёт типы и длины полей — проверьте их потом, если получатель файла строг к структуре.

Microsoft Excel

Excel открывает DBF через обычное Файл → Открыть, выбрав в фильтре «Все файлы». Для просмотра и перевода в .xlsx этого хватает. А вот сохранять в DBF Excel 2007 и новее не умеет — пункта dBase в списке форматов нет.

Просмотрщики DBF

Отдельные программы — просмотрщики и редакторы DBF — открывают файлы на сотни тысяч записей, показывают удалённые строки, позволяют менять структуру и перекодировать. Это выбор администратора, который работает с DBF постоянно.

Обработка в 1С

Для регулярного обмена — единственный разумный путь. Обработка читает файл объектом XBase и сразу создаёт элементы справочников или документы. Код разобран ниже.

ADO из 1С

На Windows DBF можно прочитать как таблицу SQL: через Новый COMОбъект("ADODB.Connection") с провайдером Microsoft.ACE.OLEDB.12.0 и параметром Extended Properties=dBASE IV, где источником данных указывается папка с файлами. Способ удобен, когда нужен отбор или группировка прямо при чтении. Минус — зависимость от установленного драйвера и его разрядности, совпадающей с разрядностью процесса 1С.

Загрузка и выгрузка DBF в 1С по шагам

Разовая загрузка без программиста

Если файл пришёл один раз, проще всего обойтись без кода:

  1. Откройте DBF в LibreOffice Calc с правильной кодировкой.
  2. Удалите служебные столбцы и пустые строки, проверьте формат дат и чисел.
  3. Сохраните как .xlsx.
  4. В 1С откройте список, куда грузите данные, и поищите в командной панели или в меню Ещё команду загрузки из файла. В Бухгалтерии 3.0 она есть, например, в списке номенклатуры, а в табличных частях многих документов — кнопка Загрузить.
  5. Сопоставьте колонки файла с реквизитами 1С и запустите загрузку.

Если такой команды в нужном месте нет, используйте универсальную обработку загрузки данных из табличного документа — её подключают как внешнюю через Файл → Открыть.

Регулярная загрузка обработкой

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

  1. Пользователь выбирает файл на своём компьютере.
  2. Файл передаётся на сервер 1С через временное хранилище (ПоместитьФайл или НачатьПомещениеФайла).
  3. На сервере он сохраняется во временный каталог и открывается объектом XBase.
  4. Обработка проходит записи и ищет или создаёт объекты 1С по ключу — ИНН, коду, табельному номеру.
  5. После загрузки файл закрывается, временная копия удаляется.

Объект XBase доступен на сервере, в толстом клиенте и во внешнем соединении, но не в тонком и веб-клиенте. Поэтому в управляемой форме код чтения кладут в процедуру &НаСервере, а файл заранее передают на сервер. Путь C:\... на компьютере пользователя сервер 1С не видит.

Выгрузка в DBF

Обратная задача — сформировать реестр для банка или ведомства. Здесь главное — получить от получателя точную спецификацию: имена полей, типы, длины, кодировку. Без неё файл почти наверняка не примут, даже если он открывается в Excel.

Что уточнить у получателя DBF-файла
Выполнено: 0 / 5

Работа с DBF из кода 1С: объект XBase

Чтение файла

Пример читает файл с полями INN, NAME и SUMMA и собирает данные в таблицу значений. Код выполняется на сервере.

&НаСервереБезКонтекста
Функция ПрочитатьDBF(ПутьКФайлу)

    Результат = Новый ТаблицаЗначений;
    Результат.Колонки.Добавить("ИНН");
    Результат.Колонки.Добавить("Наименование");
    Результат.Колонки.Добавить("Сумма");

    Файл = Новый XBase;
    Файл.Кодировка = КодировкаXBase.OEM; // для файлов в 1251 — КодировкаXBase.ANSI
    Файл.ОткрытьФайл(ПутьКФайлу, , Истина); // третий параметр — только чтение

    Если Не Файл.Открыта() Тогда
        ВызватьИсключение "Не удалось открыть файл " + ПутьКФайлу;
    КонецЕсли;

    ЕстьЗапись = Файл.Первая();
    Пока ЕстьЗапись Цикл
        Строка = Результат.Добавить();
        Строка.ИНН          = СокрЛП(Файл.INN);
        Строка.Наименование = СокрЛП(Файл.NAME);
        Строка.Сумма        = Файл.SUMMA;
        ЕстьЗапись = Файл.Следующая();
    КонецЦикла;

    Файл.ЗакрытьФайл();
    Возврат Результат;

КонецФункции

Что здесь важно:

  • 🔤 Кодировку задают до открытия файла. Поменять её после ОткрытьФайл уже поздно — строки прочитаются неверно.
  • ✂️ СокрЛП обязателен. Символьные поля добиты пробелами до полной длины, без обрезки поиск по ИНН или коду не найдёт совпадений.
  • 🔁 Цикл по результату Следующая(). Метод возвращает Ложь, когда записи кончились; признак конца файла можно также проверять через ВКонце().
  • 🗑 Удалённые записи по умолчанию пропускаются. За это отвечает свойство ОтображатьУдаленные; если включить его, проверяйте флаг методом ЗаписьУдалена().

Поля читаются как свойства объекта по имени поля из файла. Узнать структуру незнакомого файла можно перебором коллекции Файл.Поля: у каждого элемента есть имя, тип, длина и точность.

Создание файла

&НаСервереБезКонтекста
Процедура ВыгрузитьВDBF(ПутьКФайлу, ТаблицаДанных)

    Файл = Новый XBase;
    Файл.Кодировка = КодировкаXBase.ANSI;

    Файл.Поля.Добавить("INN",     "S", 12);
    Файл.Поля.Добавить("NAME",    "S", 100);
    Файл.Поля.Добавить("SUMMA",   "N", 15, 2);
    Файл.Поля.Добавить("DATEPAY", "D");

    Файл.СоздатьФайл(ПутьКФайлу);

    Для Каждого Строка Из ТаблицаДанных Цикл
        Файл.Добавить();
        Файл.INN     = Строка.ИНН;
        Файл.NAME    = Лев(Строка.Наименование, 100);
        Файл.SUMMA   = Строка.Сумма;
        Файл.DATEPAY = Строка.ДатаПлатежа;
        Файл.Записать();
    КонецЦикла;

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

КонецПроцедуры

Типы полей в Поля.Добавить задаются буквами: "S" — строка, "N" — число, "D" — дата, "L" — булево. Явный Лев() для наименования нужен, чтобы вы сами контролировали обрезку, а не теряли хвост строки незаметно.

После Добавить() новую запись обязательно сохраняют вызовом Записать(). Без него значения полей в файл не попадут.

DBF или другой формат обмена: что выбрать

DBF выбирают не потому, что он лучше, а потому что его требует другая сторона. Если формат обмена решаете вы, сравните варианты:

ФорматПлюсыМинусыКогда брать
DBFСтрогая структура, читают старые программыКодировка не гарантирована, имена полей до 10 символов, строки до 254Получатель требует DBF
CSV / TXTПрост, открывается вездеНет типов, проблемы с разделителями и кавычкамиПростые плоские выгрузки
Excel (.xlsx)Понятен людям, удобно правитьТипы ячеек «плывут», для автоматики ненадёженРазовые загрузки руками
XMLИерархия, схема для проверки, UTF-8Объёмный, нужен разборОбмен с госорганами и банками нового образца
JSONКомпактный, удобен для веб-сервисовНет встроенной схемы проверкиИнтеграции через HTTP-сервисы
EnterpriseDataСтандарт обмена между конфигурациями 1СТолько для систем на 1СОбмен БП, УТ, ERP и других конфигураций

Для новой интеграции между двумя программами 1С DBF — плохой выбор: теряется ссылочная целостность, нет иерархии, всё придётся сопоставлять вручную по кодам. Для связи с внешней системой лучше XML или JSON в UTF-8: вопрос кодировки снимается сам собой.

Ошибки при работе с DBF и как их исправить

Диагностика: выберите симптом

Ещё один частый случай — числа с дробной частью. Если поле объявлено как N с длиной 10 и точностью 2, в него поместится число до 9 999 999,99: точка и два знака занимают три позиции из десяти. Большая сумма в такое поле не влезет, поэтому длину берите с запасом.

Частые вопросы о DBF в 1С

Можно ли открыть DBF-файл прямо в 1С без обработки?
Нет. В типовых конфигурациях 8.3 нет команды открытия DBF. Нужна внешняя обработка на объекте XBase или перевод файла в Excel.
Какую кодировку выбрать для DBF из старой программы?
Начните с 866 (OEM): так писали файлы DOS-программы, FoxPro и 1С 7.7. Если текст нечитаемый — попробуйте 1251 (ANSI).
Почему объект XBase не работает в тонком клиенте?
Он недоступен в тонком и веб-клиенте. Код чтения и записи выполняют на сервере, а файл передают туда через временное хранилище.
Сколько записей может быть в DBF?
Формально число записей хранится в 32-битном поле заголовка, но практичнее ориентироваться на размер файла до 2 ГБ — на это рассчитано большинство программ.
Можно ли так перенести базу 1С 7.7 в 8.3?
Не стоит. Таблицы 7.7 читать как DBF можно, но связи между объектами придётся восстанавливать вручную. Для перехода есть типовые обработки, которые читают базу 7.7 целиком.