Разработка и Конфигурация · 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-файл
Минимальный сценарий чтения выглядит так: создать объект, открыть файл, проверить, что записи есть, и пройти по ним в цикле. Перед чтением полезно проверить свойство КоличествоЗаписей() и факт успешного открытия.
БД = Новый 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» — число с плавающей точкой.
Индексы нужны для быстрого поиска методом Найти() и для сортировки. Индекс описывается через коллекцию Индексы (выражение, имя, уникальность) и создаётся методом СоздатьИндексныйФайл(Путь). При открытии существующего файла путь к индексному файлу передаётся вторым параметром конструктора.
- 1Создайте объект: БД = Новый XBase() без параметров
- 2Добавьте поля через БД.Поля.Добавить() с типами и длинами
- 3При необходимости опишите индексы в БД.Индексы
- 4Вызовите БД.СоздатьФайл() с указанием пути
- 5Заполните записи: Добавить() → присвоить поля → Записать()
- 6Вызовите СоздатьИндексныйФайл() и закройте файл
Ограничения формата и типичные ошибки
Формат DBF накладывает ограничения, о которых нужно помнить при проектировании обмена: имена полей ограничены примерно десятью символами (в классических вариантах), строковые поля — сотнями символов, длина записи и размер файла тоже ограничены. Длинные наименования и многострочные тексты в DBF не помещаются — их либо сокращают, либо выносят в memo-поля, что усложняет обмен.
Даты в DBF не хранят время — только календарный день. Если в обмене критично время операции, его передают отдельным строковым или числовым полем. Логический тип имеет особенность: кроме «истина/ложь» там возможно третье состояние — неопределённое значение, что при невнимательной обработке даёт сюрпризы в условиях.
Перед промышленной загрузкой большого DBF сделайте пробное чтение первых 10–20 записей с выводом всех полей в протокол. Это сразу покажет кодировку, реальные длины полей и наличие помеченных на удаление записей — и сэкономит часы отладки на полном объёме.
Альтернативы xBase и когда их выбрать
Если формат обмена не задан жёстко, DBF стоит рассматривать последним вариантом. Современные альтернативы проще в отладке и не имеют ограничений на длину строк и имена полей.
Сравнение вариантов обмена
Когда формат требует внешняя система: госорганы, банки, старое ПО. Ограничения: короткие имена полей, однобайтовая кодировка, даты без времени
Простой обмен плоскими таблицами. Минус: нет строгой типизации, разделители нужно согласовывать
Обмен между современными системами, вложенные структуры, Unicode. Минус: сторонние старые системы их обычно не понимают
Доступ к 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 — тогда станут доступны поиск методом Найти() и упорядоченный обход. Без индекса файл читается только последовательно.