Разработка и Конфигурация · 10 мин
1С: как работать с XBase (DBF-файлами)
Как работать с XBase (DBF) в 1С: подключение объекта XBase, чтение и запись записей, индексы, кодировки, типичные ошибки и примеры кода на встроенном языке.
Объект XBase во встроенном языке 1С предназначен для прямой работы с файлами формата DBF — таблицами dBase, FoxPro и совместимых систем. Такие файлы до сих пор встречаются в обменах с банками, старыми учётными программами, кассовым оборудованием и государственными сервисами, поэтому умение читать и записывать их из 1С остаётся востребованным навыком разработчика.
Работа с XBase не требует внешних компонентов: механизм встроен в платформу 1С:Предприятие 8 и доступен как на клиенте, так и на сервере. Объект позволяет создавать новые DBF-файлы, открывать существующие, добавлять и изменять записи, строить индексы и выполнять поиск по ключу.
Основные сложности при работе с XBase связаны не с самим объектом, а с особенностями формата: ограничениями на длину имён полей, разновидностями кодировок, типами полей и поведением чисел с плавающей точкой. Ниже разобраны практические сценарии: от создания файла до поиска по индексу и обработки типичных ошибок.
Что такое XBase и когда его применять в 1С
XBase — это объект встроенного языка 1С, обеспечивающий доступ к файлам формата DBF (DataBase File). Формат появился в системе dBase и стал фактическим стандартом простых табличных данных: один файл — одна таблица с фиксированной структурой полей. Помимо основного файла могут существовать файлы индексов (CDX, MDX, NDX) и файл memo-полей (DBT, FPT).
Типовые сценарии применения в 1С: загрузка выписок и реестров от банков и контрагентов, выгрузка данных во внешние системы, которые принимают только DBF, интеграция с устаревшим ПО, чтение прайсов и справочников, распространяемых в этом формате. Если обе системы под вашим контролем, предпочтительнее XML, JSON или CSV, но когда формат задан внешней стороной, XBase остаётся самым прямым решением.
Создание нового DBF-файла из 1С
Чтобы создать новый файл, объявляют объект XBase, описывают структуру полей через коллекцию «Поля» методом Добавить() и вызывают СоздатьФайл(). Типы полей задаются буквами: «S» — строка (Character), «N» — число (Numeric), «D» — дата, «L» — логическое, «F» — число с плавающей точкой, «M» — memo.
Для строковых полей указывается длина, для числовых — общая длина и количество знаков после запятой. Имя поля в классическом формате ограничено десятью символами, поэтому длинные русские названия придётся сокращать до латинских аббревиатур.
Пример кода создания файла и добавления записи:
ДБФ = Новый XBase;
ДБФ.Кодировка = КодировкаXBase.OEM;
ДБФ.Поля.Добавить("CODE", "S", 10);
ДБФ.Поля.Добавить("NAME", "S", 100);
ДБФ.Поля.Добавить("SUMMA", "N", 15, 2);
ДБФ.СоздатьФайл("C:\Обмен\sprav.dbf");
ДБФ.Добавить();
ДБФ.CODE = "000001";
ДБФ.NAME = "Тестовая позиция";
ДБФ.SUMMA = 1250.50;
ДБФ.Записать();
ДБФ.ЗакрытьФайл();
Открытие и чтение существующего DBF
Существующий файл открывается методом ОткрытьФайл() с указанием пути. Вторым параметром можно передать путь к файлу индекса, третьим — признак «только чтение», что полезно, чтобы случайно не изменить источник. После открытия доступны свойства объекта: количество записей, признак конца файла и сами поля.
Перебор записей выполняется в цикле: метод Первая() позиционирует на начало, Следующая() сдвигает указатель, а свойство ВКонце() сигнализирует о завершении. Обращение к полям идёт по имени через точку, как к свойствам объекта.
ДБФ = Новый XBase;
ДБФ.Кодировка = КодировкаXBase.OEM;
ДБФ.ОткрытьФайл("C:\Обмен\sprav.dbf", , Истина);
ДБФ.Первая();
Пока Не ДБФ.ВКонце() Цикл
Сообщить(ДБФ.CODE + " | " + ДБФ.NAME);
ДБФ.Следующая();
КонецЦикла;
ДБФ.ЗакрытьФайл();
Если при чтении русский текст отображается «кракозябрами», причина почти всегда в несовпадении кодировки. DBF-файлы старых программ обычно записаны в OEM (CP866), а Windows-утилиты — в ANSI (CP1251). Попробуйте сменить значение свойства Кодировка и открыть файл заново.
Как проверить результат
Русский текст читается корректно
Набор нечитаемых символов — неверная кодировка
Значения совпадают с источником, включая дробную часть
Потеряны знаки после запятой или числа сдвинуты
Совпадает с количеством строк в исходной системе
Часть записей отсутствует — проверьте пометки удаления
Запись, изменение и удаление записей
Добавление выполняется парой: Добавить() создаёт пустую запись, после заполнения полей Записать() фиксирует её в файле. Для изменения существующей записи достаточно спозиционироваться на неё, присвоить новые значения полям и вызвать Записать(). Без вызова Записать() изменения не сохраняются — это одна из самых частых причин «потерянных» данных.
Метод Удалить() помечает текущую запись как удалённую, но физически она остаётся в файле. Свойство ОтображатьУдаленные управляет тем, попадают ли такие записи в перебор. Полное физическое удаление и освобождение места выполняется методом Сжать(), который переписывает файл без помеченных записей.
Индексы и быстрый поиск записей
Без индекса поиск по таблице — это полный перебор, что на больших файлах работает медленно. Индекс описывается через коллекцию «Индексы»: задаётся имя, выражение (например, имя поля) и признак уникальности. Метод СоздатьИндексныйФайл() формирует файл индекса рядом с DBF.
После открытия файла с индексом поиск выполняется методом Найти() или НайтиПоКлючу(): объект перепозиционируется на запись, удовлетворяющую ключу. Текущий индекс переключается свойством ТекущийИндекс, если индексов несколько. Поиск по индексу на порядки быстрее перебора, поэтому для регулярных загрузок по ключу (код, артикул, ИНН) индекс стоит создавать обязательно.
ДБФ.Индексы.Добавить("IDXCODE", "CODE", Истина);
ДБФ.СоздатьИндексныйФайл("C:\Обмен\sprav.cdx");
// поиск
ДБФ.ТекущийИндекс = ДБФ.Индексы.IDXCODE;
Если ДБФ.Найти("000001", "=") Тогда
Сообщить("Найдено: " + ДБФ.NAME);
КонецЕсли;
- 1Определите кодировку файла: откройте и проверьте читаемость русских строк
- 2Опишите объект XBase и откройте файл в режиме только чтения
- 3Пройдите циклом по записям, пропуская удалённые
- 4Сопоставьте поля DBF реквизитам объектов 1С и заполните их
- 5Зафиксируйте данные в транзакции и закройте файл
- 6Сверьте количество загруженных записей с источником
Типичные ошибки и их устранение
Первая группа ошибок — кодировка: симптомы описаны выше, лечится перебором значений КодировкаXBase (OEM, ANSI) до появления читаемого текста. Вторая группа — типы данных: дата в DBF может читаться как пустое значение, если поле заполнено некорректно, а числа типа «F» иногда дают погрешности представления — при критичной точности лучше опираться на тип «N» с фиксированной дробной частью.
Третья частая проблема — блокировка файла: если DBF открыт другой программой монопольно, ОткрытьФайл() вызовет исключение. Оборачивайте открытие в Попытка/Исключение и выводите понятное сообщение пользователю. Также помните, что длинные строки обрезаются до длины поля без предупреждения — контролируйте длину при выгрузке.
Ограничения формата и альтернативы
Формат DBF имеет жёсткие ограничения: до 10 символов в имени поля, фиксированная длина строк, ограниченный набор типов, отсутствие встроенной многопользовательской защиты на уровне 1С. При проектировании нового обмена между двумя современными системами DBF выбирать не стоит.
Альтернативы внутри платформы: текстовые документы и ЧтениеТекста для CSV, объекты ЧтениеXML/ЗаписьXML и ЧтениеJSON для структурированных данных, а также планы обмена и HTTP-сервисы для регулярной интеграции. XBase оправдан тогда, когда формат навязан внешней стороной или нужно читать архивные данные старых систем.
Сравнение вариантов обмена
Когда внешняя система принимает или отдаёт только DBF; ограничения на имена полей и типы
Простые плоские выгрузки; нет типизации, нужны договорённости о разделителях и кодировке
Иерархические данные и современные интеграции; требует описания структуры обеими сторонами
Онлайн-обмен между системами; нужна разработка сервисной части и аутентификация
Часто задаваемые вопросы
Работает ли XBase на сервере 1С и в тонком клиенте?
Да, объект XBase доступен на сервере, в толстом и тонком клиенте. Важно лишь помнить, что путь к файлу интерпретируется относительно того места, где выполняется код: на сервере файл должен быть доступен с сервера 1С, а не с компьютера пользователя.
Как узнать структуру полей чужого DBF-файла?
Откройте файл через XBase и пройдите циклом по коллекции Поля: у каждого элемента доступны имя, тип, длина и точность. Эти сведения можно вывести в сообщение или таблицу значений, чтобы построить сопоставление с реквизитами 1С.
Почему после записи числа в поле теряются копейки?
Причина в описании поля: если при создании для числового поля не указать количество знаков после запятой (или указать недостаточное), дробная часть отбрасывается или округляется до заданной точности. Пересоздайте файл с корректным описанием, например «N», 15, 2.
Можно ли работать с memo-полями?
Да, тип поля «M» поддерживается, но для чтения и записи memo-данных рядом с DBF должен существовать соответствующий файл memo (DBT/FPT). Если его нет или он повреждён, содержимое memo-полей будет недоступно, хотя остальные поля читаются нормально.
Что делать, если DBF-файл очень большой и загрузка медленная?
Используйте индекс и поиск по ключу вместо полного перебора, отключите отображение удалённых записей, читайте только нужные поля и выполняйте загрузку порциями с промежуточной фиксацией транзакций. Также проверьте, не лежит ли файл на медленном сетевом ресурсе — копирование на локальный диск часто ускоряет обработку в разы.
Что важно запомнить
XBase — встроенный механизм 1С для чтения и записи DBF: описали поля, открыли файл, перебрали записи, не забыли Записать() и ЗакрытьФайл(). Главные источники проблем — кодировка, длина полей и удалённые записи; для поиска по ключу используйте индексы, а для новых интеграций по возможности выбирайте XML или JSON.