К статье
Практический материал

Разработка и Конфигурация · 10 мин

xBase в 1С: что это и как работать с DBF-файлами

xBase в 1С — что это за объект, как читать и записывать DBF-файлы, примеры кода, типичные ошибки и ограничения формата при обмене данными.

xBase в 1С — это встроенный объект платформы, предназначенный для чтения и записи файлов формата DBF (dBase, FoxPro, Clipper). Объект позволяет программно открывать DBF-таблицы, перебирать записи, изменять поля, создавать новые файлы и строить индексы — всё это без внешних компонентов и драйверов, прямо из кода на встроенном языке 1С.

Формат DBF появился задолго до 1С и до сих пор встречается в обменах с государственными системами, банками, старым ПО и кассовым оборудованием. Если контрагент присылает прайс или реестр в DBF, а рядом лежит файл индексов CDX/MDX — работать с ним удобнее всего именно через объект xBase, а не через сторонние конвертеры.

Объект доступен как на сервере, так и на толстом клиенте. На тонком клиенте и в веб-клиенте прямой вызов ограничен: код обычно выполняют на сервере, предварительно передав файл во временное хранилище. Это важно учитывать при проектировании обработок загрузки.

Что представляет собой объект xBase и когда он нужен

Объект создаётся конструктором Новый XBase(ПутьКФайлу, ПутьКИндексам) и даёт доступ к записям таблицы последовательно или через поиск по индексу. Каждая запись — это набор полей, обращение к которым идёт по имени: БД.FAM, БД.SUMMA и так далее.

Типичные сценарии применения: загрузка классификаторов и справочников из внешних систем, приём реестров платежей из банков, выгрузка данных для налоговых и статистических программ, миграция данных из учётных систем на FoxPro при переходе на 1С. Во всех этих случаях DBF выступает промежуточным форматом, заданным внешней стороной, и повлиять на него нельзя.

Важно понимать: xBase — это не СУБД и не замена запросам 1С. Это низкоуровневый доступ к файлу. Никаких транзакций, ссылочной целостности и конкурентного доступа здесь нет. Если оба варианта возможны, для обмена между современными системами лучше выбрать XML, JSON или CSV — DBF оправдан только требованиями внешней стороны.

Как открыть и прочитать DBF-файл

Минимальный сценарий чтения выглядит так: создать объект, открыть файл, проверить, что записи есть, и пройти по ним в цикле. Перед чтением полезно проверить свойство КоличествоЗаписей() и факт успешного открытия.

bsl
БД = Новый XBase("C:\Обмен\sprav.dbf");
БД.Кодировка = КодировкаXBase.OEM;
Если Не БД.Открыта() Тогда
    Сообщить("Не удалось открыть файл");
    Возврат;
КонецЕсли;
БД.Первая();
Пока Не БД.ВКонце() Цикл
    Сообщить(Строка(БД.CODE) + " | " + БД.NAME);
    БД.Следующая();
КонецЦикла;
БД.ЗакрытьФайл();

Методы навигации: Первая(), Последняя(), Следующая(), Предыдущая(), Перейти(НомерЗаписи). Признаки границ — ВНачале() и ВКонце(). Пропуск проверки ВКонце() в условии цикла — частая причина зацикливания или обращения к несуществующей записи.

После работы файл нужно закрыть методом ЗакрытьФайл(). Пока файл открыт объектом xBase, он заблокирован: другой процесс не сможет его перезаписать, а повторное открытие из того же сеанса может дать ошибку.

Кодировка: главный источник «крякозябр»

DBF-файлы исторически хранят текст в однобайтовых кодировках. Российские файлы чаще всего идут в DOS-кодировке (OEM, CP866) или в Windows-ANSI (CP1251). Если кодировку не указать или указать неверно, русские буквы при чтении превратятся в нечитаемые символы.

За кодировку отвечает свойство Кодировка со значениями перечисления КодировкаXBase: OEM или ANSI. Устанавливать его нужно сразу после создания объекта, до чтения данных. Практический приём: если при OEM текст нечитаем — переключитесь на ANSI и наоборот; других вариантов у классического DBF почти нет.

Контрольные точки

Как проверить кодировку

Прочитать одну запись с русским текстом
Норма

Текст читается нормально, буквы Ё и й на месте

Тревожный признак

Символы вида ═══ или Р?аз — кодировка выбрана неверно

Длина строковых полей
Норма

Значения не обрезаны посреди слова

Тревожный признак

Хвосты строк обрезаны — поле в файле короче, чем реальные данные источника

Запись и изменение данных в DBF

Для изменения существующей записи используется связка: найти запись, присвоить полям новые значения, вызвать Записать(). Для добавления — Добавить(), заполнение полей, затем Записать(). Без вызова Записать() изменения не попадут в файл.

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

При записи действуют жёсткие ограничения полей: строка длиннее заявленной длины поля будет обрезана, число, не помещающееся в отведённую разрядность, приведёт к ошибке или потере точности. Перед массовой выгрузкой проверьте максимальные длины значений на реальных данных.

Создание нового DBF-файла и работа с индексами

Новый файл создаётся описанием структуры: через свойство Поля добавляют поля методом Добавить(Имя, Тип, Длина, Точность), затем вызывают СоздатьФайл(Путь). Типы указываются однобуквенно: «S» — строка, «N» — число, «D» — дата, «L» — логическое, «F» — число с плавающей точкой.

Индексы нужны для быстрого поиска методом Найти() и для сортировки. Индекс описывается через коллекцию Индексы (выражение, имя, уникальность) и создаётся методом СоздатьИндексныйФайл(Путь). При открытии существующего файла путь к индексному файлу передаётся вторым параметром конструктора.

Создание DBF с нуля
  1. 1
    Создайте объект: БД = Новый XBase() без параметров
  2. 2
    Добавьте поля через БД.Поля.Добавить() с типами и длинами
  3. 3
    При необходимости опишите индексы в БД.Индексы
  4. 4
    Вызовите БД.СоздатьФайл() с указанием пути
  5. 5
    Заполните записи: Добавить() → присвоить поля → Записать()
  6. 6
    Вызовите СоздатьИндексныйФайл() и закройте файл

Ограничения формата и типичные ошибки

Формат DBF накладывает ограничения, о которых нужно помнить при проектировании обмена: имена полей ограничены примерно десятью символами (в классических вариантах), строковые поля — сотнями символов, длина записи и размер файла тоже ограничены. Длинные наименования и многострочные тексты в DBF не помещаются — их либо сокращают, либо выносят в memo-поля, что усложняет обмен.

Даты в DBF не хранят время — только календарный день. Если в обмене критично время операции, его передают отдельным строковым или числовым полем. Логический тип имеет особенность: кроме «истина/ложь» там возможно третье состояние — неопределённое значение, что при невнимательной обработке даёт сюрпризы в условиях.

Типичные ошибки
01
Не указана кодировка — русский текст читается как мусор; лечится установкой КодировкаXBase.OEM или ANSI
02
Нет вызова Записать() после изменения полей — данные теряются молча
03
Цикл без проверки ВКонце() — зацикливание или ошибка обращения за границу файла
04
Строка длиннее поля — значение обрезается без предупреждения, данные искажаются
05
Файл не закрыт после работы — блокировка мешает следующему сеансу обмена
06
Удаление без Сжать() — файл растёт, а «удалённые» записи внезапно всплывают в выгрузках
Перед промышленной загрузкой большого DBF сделайте пробное чтение первых 10–20 записей с выводом всех полей в протокол. Это сразу покажет кодировку, реальные длины полей и наличие помеченных на удаление записей — и сэкономит часы отладки на полном объёме.
ПЗ
Практическое замечание

Альтернативы xBase и когда их выбрать

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

Сравнение вариантов обмена

xBase / DBF

Когда формат требует внешняя система: госорганы, банки, старое ПО. Ограничения: короткие имена полей, однобайтовая кодировка, даты без времени

Текстовый файл / CSV

Простой обмен плоскими таблицами. Минус: нет строгой типизации, разделители нужно согласовывать

XML / JSON

Обмен между современными системами, вложенные структуры, Unicode. Минус: сторонние старые системы их обычно не понимают

ADO / внешние компоненты

Доступ к DBF и другим источникам через драйверы Windows. Гибче, но зависит от установленных драйверов и разрядности платформы

Вывод простой: xBase — инструмент выживания в мире унаследованных форматов, а не выбор по умолчанию. Но в своей нише он незаменим: ничего другого для нативной работы с DBF из кода 1С не требуется.

Итог

Что важно запомнить

xBase — встроенный объект 1С для чтения и записи DBF-файлов. Ключевые правила: всегда задавайте кодировку, вызывайте Записать() после изменений, проверяйте ВКонце() в циклах, закрывайте файл и помните об ограничениях формата на длину полей и имена.

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

Чем xBase отличается от работы с текстовыми файлами в 1С?

Текстовый файл — это поток символов без структуры, который вы разбираете сами. xBase работает с типизированными полями и записями: знает типы, длины, индексы и умеет искать по ключу. Для DBF текстовое чтение бессмысленно — формат бинарный.

Почему русские буквы из DBF отображаются нечитаемо?

Файл записан в однобайтовой кодировке (обычно CP866 или CP1251), а объект читает его с другой. Установите свойство Кодировка в КодировкаXBase.OEM или КодировкаXBase.ANSI до чтения данных и проверьте результат на одной записи.

Можно ли использовать xBase на тонком клиенте?

Напрямую — нет, объект доступен на сервере и в толстом клиенте. Стандартный приём: передать файл с клиента во временное хранилище, на сервере сохранить его во временный файл, обработать через xBase и вернуть результат.

Как удалить записи из DBF полностью, а не пометить?

Метод Удалить() только ставит пометку удаления. Для физического удаления вызовите Сжать() — он перезаписывает файл без помеченных записей. Перед сжатием большого файла сделайте резервную копию.

Есть ли ограничение на размер DBF-файла?

Классический формат ограничен по числу записей и размеру файла (порядка 2 ГБ в распространённых реализациях), а также по длине записи. На практике при объёмах в сотни тысяч записей обмен лучше разбивать на несколько файлов — это и быстрее, и безопаснее при сбоях.

Что делать, если к DBF прилагаются файлы CDX или MDX?

Это индексные файлы. Передайте путь к индексному файлу вторым параметром конструктора xBase — тогда станут доступны поиск методом Найти() и упорядоченный обход. Без индекса файл читается только последовательно.