Три способа загрузить данные из DBF в базу 1С

· 9 мин

Содержание

Данные из DBF загружают в 1С тремя путями: прочитать файл встроенным объектом XBase во внешней обработке, подключить DBF как внешний источник данных через ODBC-драйвер или выгрузить таблицу в Excel и залить стандартной обработкой «Загрузка данных из табличного документа». Какой способ выбрать — зависит от того, разовый это перенос или регулярный обмен, и насколько вы готовы писать код.

DBF — это формат таблиц из мира dBase и FoxPro. В нём до сих пор выгружают данные старые бухгалтерские и складские программы, кассовые системы, банк-клиенты. Один файл .dbf хранит одну таблицу: список контрагентов, остатки, справочник номенклатуры. Прежде чем загрузить DBF в 1С, с файлом нужно разобраться — какие в нём поля и в какой кодировке лежит текст. От этого зависит и выбор инструмента, и то, не превратится ли текст в «кракозябры».

Для разового переноса почти всегда хватает объекта XBase: он настраивается быстрее, чем ODBC-источник, и не упирается в разрядность драйверов. Внешний источник данных оправдан там, где обмен постоянный и записи нужно выбирать запросами с отбором.

С чего начать: разбираем структуру DBF-файла

Откройте файл в любом просмотрщике DBF или в LibreOffice Calc (он умеет открывать .dbf напрямую) и запишите:

  • 📑 имена полей — в DBF они не длиннее 10 символов и обычно записаны заглавными: KOD, NAME, INN, SUMMA;
  • 🔤 типы полей — C (строка), N (число), D (дата), L (логическое), M (memo, длинный текст);
  • 🌐 кодировку — DOS-программы пишут в CP866, Windows-программы в CP1251 (к этому вернёмся в отдельном разделе).

Рядом с .dbf могут лежать файлы-спутники. Файлы .fpt или .dbt содержат memo-поля, и без них длинный текст прочитать нельзя — копируйте их вместе с таблицей. Индексы .cdx или .idx для чтения не обязательны.

Если просмотрщика под рукой нет, список полей можно получить прямо из 1С — объект XBase читает структуру сразу после открытия файла:

Обработка = Новый XBase;
Обработка.ОткрытьФайл("C:\Обмен\klient.dbf");
Для Каждого Поле Из Обработка.Поля Цикл
    Сообщить(Поле.Имя + " — тип " + Поле.Тип + ", длина " + Поле.Длина);
КонецЦикла;
Обработка.ЗакрытьФайл();

Так вы заранее увидите реальные имена полей, их типы и длину — и не промахнётесь при чтении. Заодно прикиньте объём: если записей десятки тысяч, перебор циклом займёт минуты, и это нормально.

Теперь определитесь с задачей — от неё зависит способ.

Какой способ загрузки DBF выбрать?

Способ 1: читаем DBF напрямую объектом XBase

Самый быстрый путь для программиста — встроенный объект XBase. Он умеет читать и писать DBF без всяких драйверов, прямо из кода. Этого способа обычно нет в чужих инструкциях, а он решает большинство разовых переносов.

Код пишут во внешней обработке и запускают на сервере — файл должен быть доступен тому компьютеру, где исполняется код. Кодировку задавайте ДО открытия файла, иначе объект прочтёт текст в значении по умолчанию.

Обработка = Новый XBase;
Обработка.Кодировка = КодировкаXBase.OEM;   // CP866 для файлов из DOS-программ
Обработка.ОткрытьФайл("C:\Обмен\klient.dbf");

Обработка.Первая();
Пока Не Обработка.ВКонце() Цикл

    Код    = СокрЛП(Обработка.KOD);
    Наимен = СокрЛП(Обработка.NAME);
    ИНН    = СокрЛП(Обработка.INN);

    Элемент = Справочники.Контрагенты.СоздатьЭлемент();
    Элемент.Код           = Код;
    Элемент.Наименование  = Наимен;
    Элемент.ИНН           = ИНН;
    Элемент.Записать();

    Обработка.Следующая();
КонецЦикла;

Обработка.ЗакрытьФайл();

Разберём ключевые моменты:

  1. Новый XBase создаёт объект. Структуру полей он читает из файла сам — описывать её заранее не нужно.
  2. К значению поля обращаются по его имени: Обработка.KOD. Имя берите точно из файла, с тем же регистром.
  3. Конец файла проверяют методом ВКонце(), переход к следующей записи — Следующая().
  4. СокрЛП убирает пробелы: поля типа C в DBF дополнены пробелами до полной длины.
  5. В конце обязательно ЗакрытьФайл().

Разные типы полей объект возвращает по-своему: C — строкой, N — числом, D — датой (пустая дата приходит пустым значением), L — булевым. Поэтому числовое поле не нужно дополнительно преобразовывать, а строку с суммой — наоборот, прогонять через Число(). Memo-поле (M) читается как обычная строка, если на месте файл .fpt/.dbt.

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

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

Способ 2: подключаем DBF как внешний источник данных

Если данные приходят регулярно и их удобнее выбирать запросом (с отбором, соединениями, группировкой), DBF подключают как внешний источник данных — объект метаданных, появившийся в платформе 8.3.

Что для этого нужно:

  • 🔌 ODBC-драйвер для DBF. Подойдёт драйвер dBASE из пакета Microsoft Access Database Engine либо драйвер Visual FoxPro. Разрядность драйвера должна совпадать с разрядностью той программы, что к нему обращается: для сервера 1С x64 нужен 64-битный драйвер. Это главная причина, по которой подключение «не видит» таблицу.
  • 📁 В строке подключения для dBASE «базой данных» выступает каталог, а каждый файл .dbf в нём — отдельная таблица.

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

Запрос = Новый Запрос;
Запрос.Текст =
    "ВЫБРАТЬ KOD, NAME, INN
    |ИЗ ВнешнийИсточникДанных.ОбменDBF.Таблица.Клиенты
    |ГДЕ INN <> """"";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    // создаём или обновляем элемент справочника по Выборка.KOD
КонецЦикла;

Способ сложнее первого в настройке, зато дальше работает как с обычной таблицей базы: можно фильтровать записи условием ГДЕ, соединять с данными самой 1С и не перечитывать весь файл циклом.

Способ 3: через Excel и «Загрузку из табличного документа»

Когда кода писать некому, выручает связка «Excel + стандартная обработка». Она же удобна, если данные перед загрузкой надо почистить руками.

  1. Откройте .dbf в LibreOffice Calc (пункт открытия файла) или в онлайн-конвертере и сохраните как .xlsx.
  2. Проверьте, что текст читается, а не превратился в абракадабру. Если превратился — при открытии выберите правильную кодировку (см. следующий раздел).
  3. Запустите типовую внешнюю обработку «Загрузка данных из табличного документа». Она есть почти в каждой конфигурации на управляемых формах.
  4. Укажите, куда грузим (справочник или документ), и сопоставьте колонки таблицы с реквизитами объекта.

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

Этот маршрут не требует конфигуратора и прав разработчика, но ручная сверка колонок на большом файле занимает время. Для тысяч строк первый способ быстрее.

Кодировка: откуда берутся «кракозябры»

Текст в DBF хранится в однобайтовой кодировке, и беда одна: программа-источник писала в CP866 (DOS), а читаете вы как CP1251 (Windows), или наоборот. Результат — нечитаемый текст вроде Їав®ўла c®ав.

Правило простое:

Источник файлаКодировкаСвойство XBase
DOS-программа (старый FoxPro, бухгалтерия под DOS)CP866КодировкаXBase.OEM
Windows-программаCP1251КодировкаXBase.ANSI

В коде кодировку задают свойством Кодировка до вызова ОткрытьФайл. Если не угадали с первого раза — поменяйте значение на противоположное и перечитайте файл.

При маршруте через Excel кодировку выбирают в окне импорта в момент открытия .dbf. При подключении через ODBC кодовую страницу задают в настройках драйвера или в строке соединения. Если источник вам неизвестен, начните с OEM (CP866): старые DOS-программы, из которых чаще всего и выгружают DBF, пишут именно в ней.

Самый надёжный способ определить кодировку — прочитать пару записей в обоих вариантах и посмотреть, где текст осмысленный. Числа и даны от кодировки не зависят, страдает только текст.

Автоматизация: своя внешняя обработка для регулярного обмена

Если файл приходит по расписанию (например, выгрузка из кассовой программы каждую ночь), разовый код из первого способа оборачивают во внешнюю обработку с формой. На форме делают поле выбора файла, кнопку запуска и таблицу соответствия полей.

Главная часть такой обработки — сопоставление полей источника реквизитам объекта 1С. Его удобно вынести в настройку, чтобы не править код при каждом изменении файла:

Сопоставление полей
KOD→Код элемента справочника
NAME→Наименование
INN→ИНН контрагента
SUMMA→Сумма документа
DATE_DOC→Дата документа

Дальше обработку можно повесить на регламентное задание: оно периодически проверяет каталог обмена, и как только появляется новый .dbf — читает его и создаёт объекты. Чтобы не плодить дубли, перед записью ищите элемент по коду или ИНН методом НайтиПоКоду / НайтиПоРеквизиту и обновляйте существующий, а не создавайте новый.

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

В клиент-серверной базе регламентное задание исполняется на сервере. Каталог с файлами должен быть виден серверу 1С, а не только вашему компьютеру.

Типичные ошибки при импорте DBF

  • ❌ «Поле не найдено» — имя поля указано с другим регистром или длиннее 10 символов. Сверьте имена с реальной структурой файла и пишите ровно так, как в DBF.
  • ❌ Длинный текст пустой или обрезан — рядом нет файла .fpt/.dbt с memo-полями. Положите его в ту же папку, что и .dbf.
  • ❌ ODBC-источник не видит таблицу — разрядность драйвера не совпадает с разрядностью сервера 1С, либо в строке соединения указан сам файл, а не каталог.
  • ❌ Пустые или нулевые даты — в DBF пустая дата хранится как пробелы. При чтении проверяйте результат на пустое значение, прежде чем записывать в реквизит типа «Дата».
  • ❌ Числа с лишними знаками или округлённые — поле N имеет фиксированную разрядность; сверьте число знаков после запятой с описанием поля.
  • ❌ Файл занят другим процессом — DBF открыт в Excel или в программе-источнике. Закройте его перед чтением.

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

Можно ли загрузить DBF в базовую версию 1С?
Способы с внешней обработкой и объектом XBase в базовых версиях недоступны — они не дают запускать внешние обработки и менять конфигурацию. Остаётся маршрут через Excel и типовую загрузку из табличного документа, если конфигурация её поддерживает.
Нужны ли файлы `.cdx` или `.idx` для загрузки?
Для чтения данных индексы не нужны — они ускоряют поиск, но при переборе всех записей циклом не используются. А вот файл .fpt (или .dbt) нужен, если в таблице есть memo-поля.
Почему в тексте нормальные буквы, а числа и даты сбились?
Так не бывает: кодировка влияет только на текст. Если «поехали» числа — проблема в разрядности поля N или в разделителе дробной части, а не в кодировке.
Поддерживает ли XBase длинные имена полей?
Нет, это ограничение самого формата DBF: имя поля — не более 10 символов латиницей. Если исходная система использовала более длинные имена, при выгрузке в DBF они уже были обрезаны.
Как перенести из DBF не справочник, а документы с табличной частью?
Одной таблицей DBF это не делается: обычно шапки документов лежат в одном файле, а строки — в другом, связанные по номеру. Читают оба файла и в коде собирают документ: по совпадению ключа добавляют строки в табличную часть.