Формат DBF и 1С 8.3: чтение, выгрузка и обмен через объект XBase
Содержание
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 — кодировка, обрезанные строки, «лишние» записи — объясняются тем, как файл устроен.
Файл состоит из трёх частей:
- Заголовок — 32 байта. В нём версия формата, дата последнего изменения, число записей, длина заголовка и длина одной записи.
- Описание полей — по 32 байта на каждое поле: имя (до 10 символов), тип, длина и число знаков после запятой. Блок заканчивается байтом
0x0D. - Записи — идут подряд, все одной длины. Первый байт каждой записи — флаг удаления: пробел означает живую запись, звёздочка
*— помеченную на удаление.
Основные типы полей:
| Код | Тип | Что хранит | Ограничения |
|---|---|---|---|
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С по шагам
Разовая загрузка без программиста
Если файл пришёл один раз, проще всего обойтись без кода:
- Откройте DBF в LibreOffice Calc с правильной кодировкой.
- Удалите служебные столбцы и пустые строки, проверьте формат дат и чисел.
- Сохраните как
.xlsx. - В 1С откройте список, куда грузите данные, и поищите в командной панели или в меню
Ещёкоманду загрузки из файла. В Бухгалтерии 3.0 она есть, например, в списке номенклатуры, а в табличных частях многих документов — кнопкаЗагрузить. - Сопоставьте колонки файла с реквизитами 1С и запустите загрузку.
Если такой команды в нужном месте нет, используйте универсальную обработку загрузки данных из табличного документа — её подключают как внешнюю через Файл → Открыть.
Регулярная загрузка обработкой
Когда файл приходит каждый месяц, переводить его в Excel вручную надоедает и рождает ошибки. Тогда пишут внешнюю обработку
на XBase. Порядок такой:
- Пользователь выбирает файл на своём компьютере.
- Файл передаётся на сервер 1С через временное хранилище (
ПоместитьФайлилиНачатьПомещениеФайла). - На сервере он сохраняется во временный каталог и открывается объектом
XBase. - Обработка проходит записи и ищет или создаёт объекты 1С по ключу — ИНН, коду, табельному номеру.
- После загрузки файл закрывается, временная копия удаляется.
Объект XBase доступен на сервере, в толстом клиенте и во внешнем соединении, но не в тонком и веб-клиенте. Поэтому в управляемой форме код чтения кладут в процедуру &НаСервере, а файл заранее передают на сервер. Путь C:\... на компьютере пользователя сервер 1С не видит.
Выгрузка в DBF
Обратная задача — сформировать реестр для банка или ведомства. Здесь главное — получить от получателя точную спецификацию: имена полей, типы, длины, кодировку. Без неё файл почти наверняка не примут, даже если он открывается в Excel.
Работа с 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: точка и два знака занимают три позиции из десяти. Большая сумма в такое поле не влезет, поэтому длину берите с запасом.