Три способа загрузить данные из DBF в базу 1С
Содержание
Данные из 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");
Для Каждого Поле Из Обработка.Поля Цикл
Сообщить(Поле.Имя + " — тип " + Поле.Тип + ", длина " + Поле.Длина);
КонецЦикла;
Обработка.ЗакрытьФайл();
Так вы заранее увидите реальные имена полей, их типы и длину — и не промахнётесь при чтении. Заодно прикиньте объём: если записей десятки тысяч, перебор циклом займёт минуты, и это нормально.
Теперь определитесь с задачей — от неё зависит способ.
Способ 1: читаем DBF напрямую объектом XBase
Самый быстрый путь для программиста — встроенный объект XBase. Он умеет читать и писать DBF без всяких драйверов, прямо из кода. Этого способа обычно нет в чужих инструкциях, а он решает большинство разовых переносов.
Код пишут во внешней обработке и запускают на сервере — файл должен быть доступен тому компьютеру, где исполняется код. Кодировку задавайте ДО открытия файла, иначе объект прочтёт текст в значении по умолчанию.
Обработка = Новый XBase;
Обработка.Кодировка = КодировкаXBase.OEM; // CP866 для файлов из DOS-программ
Обработка.ОткрытьФайл("C:\Обмен\klient.dbf");
Обработка.Первая();
Пока Не Обработка.ВКонце() Цикл
Код = СокрЛП(Обработка.KOD);
Наимен = СокрЛП(Обработка.NAME);
ИНН = СокрЛП(Обработка.INN);
Элемент = Справочники.Контрагенты.СоздатьЭлемент();
Элемент.Код = Код;
Элемент.Наименование = Наимен;
Элемент.ИНН = ИНН;
Элемент.Записать();
Обработка.Следующая();
КонецЦикла;
Обработка.ЗакрытьФайл();
Разберём ключевые моменты:
Новый XBaseсоздаёт объект. Структуру полей он читает из файла сам — описывать её заранее не нужно.- К значению поля обращаются по его имени:
Обработка.KOD. Имя берите точно из файла, с тем же регистром. - Конец файла проверяют методом
ВКонце(), переход к следующей записи —Следующая(). СокрЛПубирает пробелы: поля типаCв DBF дополнены пробелами до полной длины.- В конце обязательно
ЗакрытьФайл().
Разные типы полей объект возвращает по-своему: 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 + стандартная обработка». Она же удобна, если данные перед загрузкой надо почистить руками.
- Откройте
.dbfв LibreOffice Calc (пункт открытия файла) или в онлайн-конвертере и сохраните как.xlsx. - Проверьте, что текст читается, а не превратился в абракадабру. Если превратился — при открытии выберите правильную кодировку (см. следующий раздел).
- Запустите типовую внешнюю обработку «Загрузка данных из табличного документа». Она есть почти в каждой конфигурации на управляемых формах.
- Укажите, куда грузим (справочник или документ), и сопоставьте колонки таблицы с реквизитами объекта.
В обработке настраивается, по какому полю искать существующий элемент (например, по коду), — тогда повторная загрузка не создаст дубли, а обновит уже заведённые записи. Колонки, которые не нужны, в сопоставлении просто оставляют пустыми.
Этот маршрут не требует конфигуратора и прав разработчика, но ручная сверка колонок на большом файле занимает время. Для тысяч строк первый способ быстрее.
Кодировка: откуда берутся «кракозябры»
Текст в 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С. Его удобно вынести в настройку, чтобы не править код при каждом изменении файла:
Дальше обработку можно повесить на регламентное задание: оно периодически проверяет каталог обмена, и как только появляется новый .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 или в разделителе дробной части, а не в кодировке.