Загрузка данных из DBF в 1С:Предприятие 8.3 — четыре рабочих способа

· 11 мин

Содержание

Открыть DBF файл в 1С через Файл → Открыть, как таблицу Excel, не получится: платформа этот формат в окне не показывает. Зато в 1С:Предприятии 8.3 есть встроенный объект XBase, который читает DBF без драйверов и внешних программ. Небольшая обработка на десяток строк кода открывает файл, перебирает записи и пишет их в справочники или документы.

Частое заблуждение — что для загрузки DBF обязательно нужен ODBC-драйвер или Microsoft Access. Драйвер понадобится, только если вы подключаете DBF как внешний источник данных или работаете через ADO. Для разовой загрузки хватает XBase или конвертации файла в Excel. Всё, что описано ниже, общее для платформы и не зависит от конфигурации: БП 3.0, ЗУП 3.1, УТ 11 читают DBF одинаково.

Что такое DBF и как он дружит с 1С

DBF — табличный формат времён dBase, Clipper и FoxPro. Один файл — одна таблица: заголовок с описанием полей и записи фиксированной длины. До сих пор в DBF выгружают данные старые банковские клиенты, складские программы под DOS, справочники вроде КЛАДР, учётные системы на FoxPro.

Что нужно знать о формате перед загрузкой:

  • 📏 Имена полей — латиница, до 10 символов: NAME, INN, DATE_DOC. Кириллицы в именах полей быть не должно.
  • 🔤 Кодировка текста — либо OEM (кодовая страница 866, файлы из DOS-программ), либо ANSI (1251, файлы из Windows). От неё зависит, увидите вы «Иванов» или набор закорючек.
  • 🗂 Типы полей — строка (C), число (N), дата (D), логическое (L), мемо (M). Visual FoxPro добавляет свои типы: целое, дата-время, денежный.
  • 🗑 Удалённые записи — DBF не стирает строку сразу, а помечает её флагом удаления. Такие строки физически лежат в файле, пока его не «упакуют».
  • 📎 Сопутствующие файлы — мемо-поля хранятся рядом в .dbt или .fpt, индексы — в .ndx, .mdx, .cdx. Их копируют вместе с основным файлом.

В 1С 8.3 объект XBase доступен на сервере, в толстом клиенте и во внешнем соединении. В тонком клиенте и веб-клиенте его нет. Поэтому в управляемой форме код чтения DBF всегда выполняется на сервере, а файл туда передают через временное хранилище.

Какой способ открыть DBF в 1С выбрать

СпособКогда подходитЧто нужноОграничения
Объект XBaseРазовая или регулярная загрузка, любой клиентВнешняя обработкаКодировки только OEM и ANSI
Внешний источник данныхDBF постоянно обновляется, нужно читать запросомODBC-драйвер, право менять конфигурациюРазрядность драйвера должна совпадать с 1С
Конвертация в Excel / XMLНет программиста, загрузка один разLibreOffice или Excel, обработка загрузкиРучной шаг при каждой загрузке
ADO через COMНужен SQL-запрос к DBF прямо из кодаПровайдер ACE или VFP на WindowsТолько Windows, проблемы с 64 битами

Если не знаете, с чего начать, начинайте с XBase. Он не требует установки чего-либо на сервер и работает одинаково в файловой и клиент-серверной базе.

Подготовка DBF-файла к загрузке

Пять минут подготовки избавляют от большинства сюрпризов на этапе загрузки.

  1. Сделайте копию файла. Работайте с копией, а оригинал оставьте как есть. Если программа-источник ещё пишет в этот файл, закройте её или выгрузите файл заново.
  2. Скопируйте сопутствующие файлы. Рядом с CLIENTS.DBF может лежать CLIENTS.DBT или CLIENTS.FPT. Без них мемо-поля прочитаются пустыми или файл не откроется вовсе.
  3. Определите кодировку. Откройте файл в LibreOffice Calc: при открытии DBF он спрашивает кодировку. Если кириллица читается в варианте «Кириллица (DOS/OS2-866)» — это OEM, если в «Кириллица (Windows-1251)» — ANSI.
  4. Выпишите структуру полей. Имя, тип, длина, число знаков после запятой. Структура пригодится для сопоставления с реквизитами 1С.
  5. Положите файл туда, где его увидит сервер 1С. Для клиент-серверной базы путь C:\Obmen\ означает диск сервера, а не вашего компьютера. Проще всего загружать файл через диалог выбора, как в примере ниже, — тогда путь не важен.
  6. Укоротите имя файла, если пойдёте через ODBC или ADO. Старые драйверы dBase спотыкаются на именах длиннее 8 символов и на кириллице в имени.

Сопоставление полей удобно держать перед глазами при написании обработки:

Сопоставление полей
NAME (C, 100)→Наименование контрагента
INN (C, 12)→ИНН
KPP (C, 9)→КПП
DATE_DOC (D)→Дата документа
SUMMA (N, 15, 2)→Сумма документа

Способ 1. Чтение DBF встроенным объектом XBase

Это главный способ, которым пользуются программисты 1С. Создайте внешнюю обработку : в Конфигураторе Файл → Новый → Внешняя обработка. Добавьте форму, на неё — команду «Загрузить» и вставьте код модуля формы.

Клиентская часть: выбор файла

&НаКлиенте
Процедура Загрузить(Команда)
    Оповещение = Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект);
    НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);
КонецПроцедуры

&НаКлиенте
Процедура ПослеПомещенияФайла(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
    Если Не Результат Тогда
        Возврат;
    КонецЕсли;
    Записи = ПрочитатьDBF(Адрес);
    Сообщить("Прочитано записей: " + Формат(Записи.Количество(), "ЧГ=0"));
КонецПроцедуры

Пользователь выбирает файл на своём компьютере, платформа кладёт его во временное хранилище и возвращает адрес. Код одинаково работает в тонком клиенте, толстом клиенте и в файловой базе.

Серверная часть: чтение записей

&НаСервереБезКонтекста
Функция ПрочитатьDBF(АдресФайла)

    ИмяФайла = ПолучитьИмяВременногоФайла("dbf");
    ДанныеФайла = ПолучитьИзВременногоХранилища(АдресФайла);
    ДанныеФайла.Записать(ИмяФайла);

    База = Новый XBase;
    База.Кодировка = КодировкаXBase.OEM; // для файлов из Windows-программ — ANSI
    База.ОткрытьФайл(ИмяФайла, , Истина); // третий параметр — только чтение

    Если Не База.Открыта() Тогда
        ВызватьИсключение "Не удалось открыть DBF-файл";
    КонецЕсли;

    Записи = Новый Массив;
    ЕстьЗапись = База.Первая();
    Пока ЕстьЗапись Цикл
        Запись = Новый Структура;
        Для Каждого Поле Из База.Поля Цикл
            Запись.Вставить(Поле.Имя, База.ПолучитьЗначениеПоля(Поле.Имя));
        КонецЦикла;
        Записи.Добавить(Запись);
        ЕстьЗапись = База.Следующая();
    КонецЦикла;

    База.ЗакрытьФайл();
    УдалитьФайлы(ИмяФайла);

    Возврат Записи;

КонецФункции

Функция возвращает массив структур: ключ — имя поля, значение — содержимое ячейки. Массив структур, в отличие от таблицы значений, можно передать на клиент. Вместо возврата массива можно сразу внутри цикла искать контрагента по ИНН и создавать документ.

Тонкости XBase, о которых узнают на практике

  • 🔁 Кодировка ставится до открытия файла. Если поменять её после ОткрытьФайл, текст уже прочитается неверно.
  • 🗑 Помеченные на удаление записи по умолчанию не видны: за это отвечает свойство ОтображатьУдаленные. Если в источнике строки удаляли пометкой, а вам нужны все — установите его в Истина.
  • 🔢 Числа приходят числами, даты — датами. Пустая дата в DBF превращается в пустую дату 1С, а не в ошибку, но строки с пробелами в конце придётся обрезать через СокрЛП().
  • 🔒 Режим только чтения (третий параметр Истина) защищает исходный файл и позволяет открыть его, даже если файл помечен как доступный только для чтения.

Если кодировка неизвестна, прочитайте первые 5 записей в обеих кодировках и выведите строковое поле через Сообщить(). Нормальная кириллица появится только в одном варианте.

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

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

Что установить

Внешний источник работает через ODBC, поэтому на компьютере, где выполняется код, нужен драйвер dBase:

  • Microsoft dBase Driver (*.dbf) — есть в составе Windows, но только 32-битный;
  • Microsoft Access dBASE Driver (*.dbf, *.ndx, *.mdx) — ставится вместе с пакетом Microsoft Access Database Engine, бывает 32- и 64-битным;
  • Microsoft Visual FoxPro Driver — для файлов FoxPro с типами, которых нет в dBase; только 32-битный.

Разрядность драйвера должна совпадать с разрядностью процесса 1С, который выполняет запрос. В клиент-серверной базе это рабочий процесс сервера 1С, а не ваш клиент. 64-битный сервер 1С не увидит 32-битный драйвер.

Как подключить

  1. В Конфигураторе откройте ветку Общие → Внешние источники данных и добавьте новый источник, например ДанныеDBF.
  2. В источнике добавьте таблицу. Её можно описать вручную: имя таблицы равно имени файла без расширения, поля — по структуре DBF. Либо загрузить описание из источника через конструктор, если соединение уже настроено.
  3. Обновите конфигурацию базы данных.
  4. В режиме Предприятия или из кода задайте строку соединения. Для системного драйвера dBase она выглядит так:
Driver={Microsoft dBase Driver (*.dbf)};DriverID=277;Dbq=C:\Obmen\;

Параметр Dbq указывает на папку, а не на файл: каждый DBF в этой папке становится отдельной таблицей.

  1. Установите соединение программно:
Параметры = Новый ПараметрыСоединенияВнешнегоИсточникаДанных;
Параметры.СтрокаСоединения = "Driver={Microsoft dBase Driver (*.dbf)};DriverID=277;Dbq=C:\Obmen\;";
ВнешниеИсточникиДанных.ДанныеDBF.УстановитьОбщиеПараметрыСоединения(Параметры);
ВнешниеИсточникиДанных.ДанныеDBF.УстановитьСоединение();

После этого DBF читается обычным запросом: ВЫБРАТЬ * ИЗ ВнешнийИсточникДанных.ДанныеDBF.Таблица.CLIENTS. Можно соединять его с таблицами 1С, фильтровать и группировать.

Для этого способа нужно менять конфигурацию. Если база на поддержке и вы не хотите снимать её с замков, выберите XBase во внешней обработке — он конфигурацию не трогает.

Способ 3. Конвертация DBF в Excel или XML

Если программиста под рукой нет, DBF проще превратить в формат, который 1С загружает штатно.

Через Excel или LibreOffice

  1. Откройте DBF в LibreOffice Calc и выберите кодировку, при которой кириллица читается.
  2. Проверьте даты и суммы: числа с точкой вместо запятой иногда превращаются в текст.
  3. Сохраните файл как .xlsx.
  4. Загрузите таблицу в 1С. В справочниках БП 3.0 и УТ 11, например в списке номенклатуры, есть команда загрузки из файла. Для остального подходит внешняя обработка загрузки из табличного документа: она сопоставляет колонки с реквизитами и ищет существующие элементы по ИНН, коду или наименованию.

Excel тоже открывает DBF, но кодировку не спрашивает и с DOS-файлами часто показывает закорючки. Сохранять обратно в DBF современный Excel не умеет, LibreOffice — умеет.

Через XML

XML-путь нужен, когда загрузку делают в базе без возможности поставить драйверы или написать обработку чтения DBF, но есть готовый механизм загрузки XML, например правила обмена.

  1. Конвертируйте DBF в XML внешней утилитой или программой-источником, если она умеет такой экспорт.
  2. Приведите структуру к той, которую ожидает обработка загрузки: один элемент на запись, поля — вложенными элементами или атрибутами.
  3. Загрузите файл обработкой, которая читает XML через объект ЧтениеXML, или правилами обмена.

Этот вариант длиннее остальных. Выбирайте его, когда XML уже используется в вашем обмене и под него есть проверенная обработка.

Способ 4. ADO и COM-соединение для автоматической загрузки

ADO даёт SQL-доступ к DBF прямо из кода 1С, без описания внешнего источника в конфигурации. Работает только на Windows, на той машине, где выполняется код. Нужен провайдер Microsoft ACE OLEDB из пакета Access Database Engine.

Соединение = Новый COMОбъект("ADODB.Connection");
Соединение.Open("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Obmen\;Extended Properties=dBASE IV;");

Набор = Соединение.Execute("SELECT * FROM CLIENTS");
Пока Не Набор.EOF Цикл
    Наименование = СокрЛП(Набор.Fields("NAME").Value);
    ИНН = СокрЛП(Набор.Fields("INN").Value);
    Сообщить(Наименование + " — " + ИНН);
    Набор.MoveNext();
КонецЦикла;

Набор.Close();
Соединение.Close();

Плюс ADO — фильтры и сортировка на стороне драйвера: SELECT * FROM CLIENTS WHERE SUMMA > 0. Минус — та же история с разрядностью, а провайдер Visual FoxPro (VFPOLEDB) существует только в 32-битном варианте.

Обратное направление: внешняя программа пишет в 1С

Иногда удобнее, чтобы скрипт или программа на стороне источника сама читала DBF и создавала объекты в 1С. Для этого используют COM-соединение V83.COMConnector: внешний процесс подключается к базе, получает доступ к справочникам и документам и записывает данные. Компонента регистрируется на компьютере вместе с платформой, а её разрядность тоже должна совпадать с разрядностью программы, которая её вызывает.

Регулярную загрузку по расписанию удобнее делать регламентным заданием в самой базе с объектом XBase: меньше движущихся частей и не нужен Windows-планировщик.

Ошибки при загрузке DBF в 1С и что с ними делать

Диагностика: выберите симптом

Отдельный случай — файлы Visual FoxPro с типами «дата-время», «целое» или «денежный». Если XBase такой файл не открывает или читает поля с ошибкой, пересохраните таблицу в формат dBase в программе-источнике или в LibreOffice. Другой вариант — читать её драйвером Visual FoxPro на 32-битном процессе 1С.

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

Можно ли записать данные из 1С обратно в DBF?
Да. Объект XBase умеет создавать файл: описывают поля через коллекцию Поля, вызывают СоздатьФайл, добавляют записи методом Добавить и сохраняют методом Записать. Так делают выгрузки для старых банковских и складских программ.
Почему обработка с XBase работает в толстом клиенте и падает в тонком?
В тонком клиенте объекта XBase нет. Вынесите чтение в серверную процедуру, а файл передавайте через временное хранилище.
Работает ли чтение DBF в 1С на Linux-сервере?
XBase работает на сервере 1С под Linux, ему не нужны драйверы Windows. ODBC-драйверы Microsoft, ADO и COM на Linux недоступны.
Нужна ли лицензия на Access, чтобы ставить Access Database Engine?
Нет. Пакет Microsoft Access Database Engine распространяется бесплатно и ставится отдельно от Office.
Как быстро посмотреть содержимое DBF, не загружая его в базу?
Откройте файл в LibreOffice Calc или в любом просмотрщике DBF. Для проверки внутри 1С выведите прочитанные записи в табличный документ на форме обработки.