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

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

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

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

1. Поддерживаемые типы данных в XBase

При создании структуры DBF-файла через 1С необходимо четко сопоставить типы данных 1С с типами полей dBase. Давайте проанализируем, какие типы данных поддерживает встроенный объект XBase при добавлении колонок через метод БД.Поля.Добавить():

Важный нюанс: встроенный объект XBase в 1С не поддерживает полноценную работу с Memo-полями (тип "M"), предназначенными для хранения длинных текстов неограниченного размера. Попытка записать данные в Memo-поле стандартными средствами вызовет ошибку, поэтому для больших текстов приходится искать обходные пути.

2. Как обойти ограничение на длину имени файла (8 символов)

Одной из самых частых проблем является ошибка «Длина имени файла превысила 8 символов». Объект XBase строго следует стандарту именования файлов MS-DOS (так называемый формат 8.3: максимум 8 символов на имя файла и 3 символа на расширение).

Если вам требуется выгрузить файл с длинным и понятным именем (например, Vigruzka_Nomenklaturi_2023.dbf), напрямую создать его методом СоздатьФайл() не получится. Рассмотрим проверенный алгоритм обхода этого ограничения:

  1. Создаем DBF-файл во временном каталоге под коротким разрешенным именем (например, temp.dbf).
  2. Заполняем файл данными, используя стандартные методы работы с XBase.
  3. Закрываем файл методом БД.ЗакрытьФайл(), чтобы снять монопольную блокировку операционной системы.
  4. Переименовываем или копируем закрытый файл в целевую директорию, присваивая ему любое длинное имя с помощью встроенных средств работы с файловой системой 1С.

Ниже мы разберем программную реализацию этого обхода в комплексном примере.

3. Работа с длинными строками и кодировкой

При выгрузке текстовых реквизитов (например, наименования или описания номенклатуры) важно помнить о двух критических ограничениях:

Максимальная длина текстового поля. Поля типа "S" в формате DBF не могут быть длиннее 254 символов. Если вы попытаетесь создать поле длиной 300 или 500 символов, платформа выдаст ошибку на этапе создания структуры. Если вам жизненно необходимо выгрузить строку длиной, к примеру, 1000 символов, решение заключается в ее искусственном разделении на несколько колонок (например, Cnote1, Cnote2, Cnote3, Cnote4 по 250 символов в каждой) с помощью функций ЛЕВ() и СРЕД().

Кодировка текстовых данных. По умолчанию при создании файла может использоваться кодировка Windows (ANSI). Однако большинство принимающих программ требуют DOS-кодировку (OEM). Чтобы избежать появления "кракозябр" вместо русских букв, всегда явно указывайте кодировку перед созданием файла:

БД.Кодировка = КодировкаXBase.OEM; или БД.Кодировка = КодировкаXBase.ANSI;

4. Ограничение на наименование колонок

Имя каждого поля (колонки) в таблице DBF имеет жесткий лимит — не более 10 символов (только латиница, цифры и символ подчеркивания). Если вы укажете имя длиннее (например, "Zakaz_Kratno" — 12 символов), платформа 1С автоматически обрежет его до 10 символов ("Zakaz_Krat"). Это может привести к конфликту имен или к ошибкам при последующей записи данных, если вы будете обращаться к полю по его исходному длинному имени. Всегда планируйте структуру заранее и укладывайтесь в 10 символов.

5. Комплексный пример выгрузки справочника Номенклатура

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


// Очистим путь и подготовим имена файлов
ПутьКЦелевомуФайлу = "C:\Выгрузка\Выгрузка_Номенклатуры_За_Сегодня.dbf";
ИмяВременногоФайла = КаталогВременныхФайлов() + "temp.dbf";

// Инициализируем объект XBase
БД = Новый XBase;

// Явно указываем кодировку (обычно требуется OEM/DOS)
БД.Кодировка = КодировкаXBase.OEM;

// Формируем структуру полей (имена колонок строго до 10 символов!)
БД.Поля.Добавить("KOD",       "N", 9, 0);   // Числовое поле без дробной части
БД.Поля.Добавить("NAME",      "S", 100);    // Строка длиной 100 символов
БД.Поля.Добавить("PRICE",     "N", 15, 2);  // Число с плавающей точкой (длина 15, 2 знака после запятой)
БД.Поля.Добавить("DATE_CR",   "D");         // Поле типа "Дата"
БД.Поля.Добавить("IS_ACT",    "L");         // Булево поле (Логическое)

// Решаем проблему длинной строки (описание до 500 символов разбиваем на 2 колонки по 250)
БД.Поля.Добавить("DESC1",     "S", 250);
БД.Поля.Добавить("DESC2",     "S", 250);

// Создаем пустой файл во временном каталоге (имя temp.dbf гарантированно укладывается в 8 символов)
БД.СоздатьФайл(ИмяВременногоФайла);

// Если файл успешно создан, начинаем заполнение данными
Если БД.Открыта() Тогда
    
    // Получаем данные для выгрузки (например, выборкой из справочника)
    Выборка = Справочники.Номенклатура.Выбрать();
    
    Пока Выборка.Следующий() Цикл
        
        // Добавляем новую запись в DBF-таблицу
        БД.Добавить();
        
        // Заполняем простые типы данных
        БД.KOD     = Выборка.Код;
        БД.NAME    = Лев(Выборка.Наименование, 100); // Страхуемся от превышения длины поля
        БД.PRICE   = Выборка.Цена;
        БД.DATE_CR = Выборка.ДатаСоздания;
        БД.IS_ACT  = Выборка.Активен;
        
        // Обрабатываем длинный текст описания (разбиваем на части)
        ПолноеОписание = Выборка.Описание;
        БД.DESC1 = Лев(ПолноеОписание, 250);
        Если СтрДлина(ПолноеОписание) > 250 Тогда
            БД.DESC2 = Сред(ПолноеОписание, 251, 250);
        Иначе
            БД.DESC2 = "";
        КонецЕсли;
        
        // Фиксируем запись в файле
        БД.Записать();
        
    КонецЦикла;
    
    // Обязательно закрываем файл, чтобы освободить его в памяти системы
    БД.ЗакрытьФайл();
    
    // Перемещаем файл из временной папки в целевую с длинным именем
    ФайлНаДиске = Новый Файл(ПутьКЦелевомуФайлу);
    Если ФайлНаДиске.Существует() Тогда
        УдалитьФайлы(ПутьКЦелевомуФайлу); // Удаляем старый файл, если он уже был создан ранее
    КонецЕсли;
    
    ПереместитьФайл(ИмяВременногоФайла, ПутьКЦелевомуФайлу);
    Сообщить("Выгрузка успешно завершена в файл: " + ПутьКЦелевомуФайлу);
    
Иначе
    Сообщить("Не удалось создать временный файл DBF!", СтатусСообщения.Важное);
КонецЕсли;

6. Что делать, если ограничения XBase критичны для задачи?

Если требования вашей задачи выходят за рамки возможностей стандартного XBase (например, вам обязательно нужно записывать длинные тексты в поля типа Memo без их разделения на части, либо требуется высокая скорость выполнения операций через SQL-запросы), рекомендуется отказаться от встроенного объекта в пользу работы через COM-соединение ADO.

Для этого в среде Windows используется провайдер Microsoft Jet или Microsoft Visual FoxPro OLE DB (VFPOLEDB). Подключение к папке с DBF-файлами инициализируется следующим образом:


Connection = Новый COMОбъект("ADODB.Connection");
Connection.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ПутьККаталогу + ";Extended Properties=dBase IV");

Использование ADO позволяет обращаться к таблицам DBF с помощью стандартного синтаксиса SQL (операторы INSERT, UPDATE, SELECT), полностью снимает ограничение на длину имени файла на этапе создания и обеспечивает стабильную запись в Memo-поля.

← На главную