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

Справочники и Данные · 11 мин

DBF как внешний источник данных в 1С

Как использовать DBF-файлы как внешний источник данных в 1С: чтение через XBase, запись, загрузка справочников, типичные ошибки, кодировки и ограничения формата.

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

При этом «внешний источник данных» в контексте DBF может означать два разных подхода. Первый — программное чтение и запись файла через объект XBase в модуле обработки. Второй — механизм «Внешние источники данных» в конфигураторе, который обычно работает через ODBC, но тоже может подключаться к DBF-таблицам через соответствующий драйвер. Оба варианта рабочие, но у них разные сценарии применения и ограничения.

Ниже разобраны оба способа, практический код загрузки и выгрузки, требования к структуре файла, проблемы с кодировками и типичные ошибки, из-за которых загрузка «вроде проходит», но данные оказываются битыми.

Когда DBF оправдан как источник данных, а когда лучше выбрать другой формат

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

Ограничения формата существенные: длина имени поля — до 10 символов, длина строкового поля — до 254 символов, нет встроенной поддержки NULL в классическом варианте, есть исторические проблемы с кодировками. Если обе системы под вашим контролем, надёжнее обмениваться через CSV с явной кодировкой, XML/JSON или EnterpriseData.

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

XBase (программно)

Разовые и регламентные загрузки, обмен с кассами и ТСД. Не требует настройки драйверов, работает на клиенте и сервере.

Внешний источник данных + ODBC

Постоянный доступ к DBF-таблицам как к объектам конфигурации. Требует установленного драйвера на сервере и сложнее в сопровождении.

CSV / XML / JSON

Когда формат обмена можно выбрать. Нет ограничений 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
    Убедитесь, что на машине, где работает сервер 1С, установлен ODBC-драйвер DBF нужной разрядности.
  2. 2
    В конфигураторе создайте объект «Внешний источник данных» и добавьте таблицу с указанием строки подключения к папке с DBF-файлами.
  3. 3
    Опишите поля таблицы в соответствии со структурой DBF-файла.
  4. 4
    Установите пользователям права на объект внешнего источника данных.
  5. 5
    Проверьте чтение данных запросом в консоли запросов.

Разрядность драйвера критична: 64-разрядный сервер 1С не увидит 32-разрядный ODBC-драйвер, и наоборот. Это самая частая причина ситуации «на тестовой машине работает, на сервере — нет». Также учитывайте, что драйверы DBF от Microsoft исторически ориентированы на кодировку ANSI/OEM, и с кириллицей могут быть сюрпризы.

Практически этот подход оправдан, когда DBF-таблицы постоянно обновляются внешней системой и к ним нужен оперативный доступ из запросов и отчётов 1С без промежуточной загрузки. Для разового импорта он избыточен.

Кодировки и типы данных: где теряется кириллица

Классическая боль DBF — кодировка. Файлы, созданные DOS-программами и кассовым ПО, обычно в OEM (CP866), файлы из Windows-приложений — в ANSI (CP1251). Если открыть файл с неверной кодировкой, русские буквы превратятся в «кракозябры», причём ошибка не выдастся — данные просто запишутся в 1С испорченными.

Надёжный приём — открыть файл дважды с разными кодировками и сравнить содержимое первого строкового поля, либо попросить у поставщика тестовый файл с заведомо известным текстом. В XBase кодировка задаётся свойством Кодировка до открытия или создания файла.

По типам данных помните: даты в DBF хранятся без времени, логический тип имеет только два состояния, а «пустая» дата в файле может прочитаться как пустая дата 1С или как значение по умолчанию — это стоит проверить на тестовых данных. Числа с плавающей точкой в старых файлах иногда хранятся с ошибками округления, поэтому для денежных сумм лучше договариваться о числовом поле с фиксированной точностью.

Типичные ошибки
01
Не указана кодировка — кириллица загружается нечитаемой, причём ошибка обнаруживается только при просмотре данных.
02
ОтображатьУдаленные не установлено — в справочник попадают записи, помеченные на удаление в исходной системе.
03
Файл читается по локальному пути, а код выполняется на сервере — обработка падает с ошибкой «файл не найден».
04
Имя поля длиннее 10 символов при создании файла — принимающая программа не видит такие поля.
05
Файл открыт в другой программе (Excel, кассовое ПО) — запись или чтение блокируется без понятного сообщения.

Проверка результата загрузки

После загрузки недостаточно увидеть сообщение «обработано 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 оправдан только как унаследованный или аппаратно навязанный формат.