Справочники и Данные · 11 мин
DBF как внешний источник данных в 1С
Как использовать DBF-файлы как внешний источник данных в 1С: чтение через XBase, запись, загрузка справочников, типичные ошибки, кодировки и ограничения формата.
Формат DBF остаётся одним из самых распространённых способов обмена данными между 1С и внешними программами: кассовым оборудованием, банковскими клиентами, складскими терминалами, старыми учётными системами и сторонними отчётными утилитами. Причина проста — структура файла предельно понятна (таблица с фиксированным набором полей), а в платформе 1С есть встроенный объект XBase, который читает и пишет такие файлы без дополнительных компонентов.
При этом «внешний источник данных» в контексте DBF может означать два разных подхода. Первый — программное чтение и запись файла через объект XBase в модуле обработки. Второй — механизм «Внешние источники данных» в конфигураторе, который обычно работает через ODBC, но тоже может подключаться к DBF-таблицам через соответствующий драйвер. Оба варианта рабочие, но у них разные сценарии применения и ограничения.
Ниже разобраны оба способа, практический код загрузки и выгрузки, требования к структуре файла, проблемы с кодировками и типичные ошибки, из-за которых загрузка «вроде проходит», но данные оказываются битыми.
Когда DBF оправдан как источник данных, а когда лучше выбрать другой формат
DBF имеет смысл использовать, если внешняя система умеет выгружать только этот формат (многие кассы, весы, ТСД и легаси-программы) или если приёмная сторона жёстко требует DBF на вход. Также формат удобен для простых плоских таблиц: список товаров с ценами, справочник контрагентов, реестр платежей.
Ограничения формата существенные: длина имени поля — до 10 символов, длина строкового поля — до 254 символов, нет встроенной поддержки NULL в классическом варианте, есть исторические проблемы с кодировками. Если обе системы под вашим контролем, надёжнее обмениваться через CSV с явной кодировкой, XML/JSON или EnterpriseData.
Сравнение вариантов обмена
Разовые и регламентные загрузки, обмен с кассами и ТСД. Не требует настройки драйверов, работает на клиенте и сервере.
Постоянный доступ к DBF-таблицам как к объектам конфигурации. Требует установленного драйвера на сервере и сложнее в сопровождении.
Когда формат обмена можно выбрать. Нет ограничений DBF, проще контроль кодировки.
Чтение DBF через объект XBase
Объект XBase доступен во встроенном языке 1С и не требует установки внешних компонентов. Типовой алгоритм чтения: создать объект, указать путь к файлу и кодировку, открыть файл, пройти по записям в цикле, закрыть файл.
ДБФ = Новый XBase;
ДБФ.Кодировка = КодировкаXBase.OEM; // или ANSI — зависит от источника
ДБФ.ОткрытьФайл("C:\Обмен\goods.dbf");
Если ДБФ.Первая() Тогда
Пока Истина Цикл
КодТовара = СокрЛП(ДБФ.KOD);
Наименование = СокрЛП(ДБФ.NAME);
Цена = ДБФ.PRICE;
// ... запись в справочник или регистр
Если Не ДБФ.Следующая() Тогда
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
ДБФ.ЗакрытьФайл();
Обращение к полям идёт по имени (ДБФ.NAME) или по индексу через коллекцию полей. Перед чтением полезно проверить, что поле существует: Если ДБФ.Поля.Найти("PRICE") <> Неопределено Тогда ... — это защитит от падения обработки, если поставщик изменит структуру файла.
Удалённые в DBF записи физически остаются в файле с пометкой. Свойство ДБФ.ОтображатьУдаленные управляет тем, будут ли такие записи попадать в выборку. Для загрузки справочников обычно правильно установить его в Ложь, иначе в 1С попадут «мёртвые» строки.
Запись данных из 1С в DBF
Выгрузка строится зеркально: сначала описывается структура полей, затем файл создаётся и заполняется записями. Типы полей задаются символами: «S» — строка, «N» — число, «D» — дата, «L» — логическое.
ДБФ = Новый XBase;
ДБФ.Кодировка = КодировкаXBase.OEM;
ДБФ.Поля.Добавить("KOD", "S", 10);
ДБФ.Поля.Добавить("NAME", "S", 100);
ДБФ.Поля.Добавить("PRICE", "N", 15, 2);
ДБФ.СоздатьФайл("C:\Обмен\goods_out.dbf");
Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
ДБФ.Добавить();
ДБФ.KOD = Лев(Выборка.Код, 10);
ДБФ.NAME = Лев(Выборка.Наименование, 100);
ДБФ.PRICE = Выборка.Цена;
КонецЦикла;
ДБФ.Записать();
ДБФ.ЗакрытьФайл();
Два момента, на которых чаще всего спотыкаются. Первый — обрезка строк: если значение длиннее объявленной длины поля, оно молча усекается, поэтому длину полей согласовывайте с принимающей стороной заранее. Второй — числа: количество знаков после запятой фиксируется при создании поля, и лишние разряды округляются.
Подключение DBF как внешнего источника данных через ODBC
Механизм «Внешние источники данных» в конфигураторе позволяет описать таблицу DBF как объект метаданных и обращаться к ней в запросах почти как к обычной таблице 1С. Для этого на сервере (или клиенте, если база файловая) должен быть установлен ODBC-драйвер, умеющий работать с DBF, — например, Microsoft dBASE Driver.
- 1Убедитесь, что на машине, где работает сервер 1С, установлен ODBC-драйвер DBF нужной разрядности.
- 2В конфигураторе создайте объект «Внешний источник данных» и добавьте таблицу с указанием строки подключения к папке с DBF-файлами.
- 3Опишите поля таблицы в соответствии со структурой DBF-файла.
- 4Установите пользователям права на объект внешнего источника данных.
- 5Проверьте чтение данных запросом в консоли запросов.
Разрядность драйвера критична: 64-разрядный сервер 1С не увидит 32-разрядный ODBC-драйвер, и наоборот. Это самая частая причина ситуации «на тестовой машине работает, на сервере — нет». Также учитывайте, что драйверы DBF от Microsoft исторически ориентированы на кодировку ANSI/OEM, и с кириллицей могут быть сюрпризы.
Практически этот подход оправдан, когда DBF-таблицы постоянно обновляются внешней системой и к ним нужен оперативный доступ из запросов и отчётов 1С без промежуточной загрузки. Для разового импорта он избыточен.
Кодировки и типы данных: где теряется кириллица
Классическая боль DBF — кодировка. Файлы, созданные DOS-программами и кассовым ПО, обычно в OEM (CP866), файлы из Windows-приложений — в ANSI (CP1251). Если открыть файл с неверной кодировкой, русские буквы превратятся в «кракозябры», причём ошибка не выдастся — данные просто запишутся в 1С испорченными.
Надёжный приём — открыть файл дважды с разными кодировками и сравнить содержимое первого строкового поля, либо попросить у поставщика тестовый файл с заведомо известным текстом. В XBase кодировка задаётся свойством Кодировка до открытия или создания файла.
По типам данных помните: даты в DBF хранятся без времени, логический тип имеет только два состояния, а «пустая» дата в файле может прочитаться как пустая дата 1С или как значение по умолчанию — это стоит проверить на тестовых данных. Числа с плавающей точкой в старых файлах иногда хранятся с ошибками округления, поэтому для денежных сумм лучше договариваться о числовом поле с фиксированной точностью.
Проверка результата загрузки
После загрузки недостаточно увидеть сообщение «обработано N записей». Минимальный контроль: сравнить количество прочитанных записей с количеством строк в файле (его можно посмотреть, открыв DBF в любом просмотрщике), выборочно сверить 5–10 записей по ключевым полям и проверить, что строковые поля читаемы.
Как проверить результат
Совпадает с числом активных записей в файле
Меньше — часть записей пропущена или помечена удалёнными; больше — возможны дубли
Текст читается, совпадает с источником
Кракозябры или вопросительные знаки — неверная кодировка
Значения совпадают с точностью до копеек
Округление или сдвиг разрядов — неверно описана точность поля
Даты в ожидаемом диапазоне
Пустые даты или 01.01.0001 — проблема чтения пустых значений
Альтернативы и границы самостоятельной работы
Если обмен регулярный и объёмы большие, имеет смысл рассмотреть замену DBF на более управляемый канал: выгрузку в CSV с контрольной суммой, обмен через веб-сервисы или планы обмена. DBF разумно оставить там, где он продиктован оборудованием или требованиями контрагента.
Самостоятельно безопасно: писать и тестировать обработки чтения/записи на копии базы, настраивать внешний источник данных в тестовом контуре. К работе в продуктивной базе стоит переходить после прогона на реальном файле с проверкой контрольных точек. Перед первой загрузкой в рабочую базу сделайте резервную копию — «битая» загрузка справочника номенклатуры потом откатывается долго и болезненно.
Что важно запомнить
Для разовых загрузок и обмена с оборудованием используйте объект XBase с явным указанием кодировки и контролем удалённых записей. Механизм внешних источников данных через ODBC оправдан при постоянном доступе к DBF-таблицам, но требует драйвера нужной разрядности. Всегда проверяйте результат сверкой количества записей, кириллицы и сумм.
Частые вопросы
Открываю DBF, а русские буквы отображаются нечитаемо. Что делать?
Файл записан в другой кодировке, чем вы указали при открытии. Попробуйте сменить КодировкаXBase.OEM на КодировкаXBase.ANSI (или наоборот) и перечитать файл. Если ни один вариант не помогает, уточните у поставщика файла, какой программой он создан, и попросите тестовый файл с известным текстом для подбора кодировки.
Можно ли читать DBF в тонком клиенте без установки драйверов?
Да. Объект XBase встроен в платформу и не требует внешних компонентов. Главное условие — файл должен быть доступен тому процессу, где выполняется код: либо передайте файл на сервер, либо выполняйте чтение на клиенте с локальным путём.
Загрузилось меньше записей, чем строк в файле. Почему?
Наиболее вероятная причина — в файле есть записи, помеченные как удалённые, и свойство ОтображатьУдаленные установлено в Ложь. Также проверьте, нет ли в цикле условий, которые пропускают часть записей, и не обрывается ли чтение из-за ошибки преобразования типа в отдельной строке.
Как передать в DBF длинное наименование товара?
Напрямую — никак: строковое поле DBF ограничено 254 символами, а многие принимающие программы работают с ещё меньшей длиной. Обычно договариваются о длине поля (например, 100 символов) и обрезают значение функцией Лев() при выгрузке, а полное наименование передают отдельным файлом или полем MEMO, если принимающая сторона его поддерживает.
Файл занят другой программой, и 1С не может его открыть. Как обойти?
Это нормальное поведение: DBF блокируется при открытии. Договоритесь с внешней системой о регламенте: она выгружает файл и закрывает его, а 1С читает по расписанию в другое время. Альтернатива — сначала скопировать файл во временную папку средствами 1С и читать уже копию.
Что выбрать для нового обмена: DBF или CSV?
Если формат не продиктован оборудованием или контрагентом, выбирайте CSV с явной кодировкой UTF-8: нет ограничений на длину полей и имён, проще диагностика, файл можно открыть и проверить в любом текстовом редакторе. DBF оправдан только как унаследованный или аппаратно навязанный формат.