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

· 9 мин

Содержание

Выгрузить данные из 1С в DBF штатной кнопкой нельзя: ни отчёты, ни табличный документ не сохраняются в этот формат. Рабочих путей три: внешняя обработка (готовая или своя) на встроенном объекте XBase, выгрузка через COM-соединение по расписанию и обходной путь через Excel-файл с пересохранением в LibreOffice Calc.

Для разовой выгрузки хватит обработки на 30–40 строк кода. Если файл нужен каждый день, ту же обработку запускают без участия пользователя: через COM или командную строку 1cv8.

Почему в 1С 8.3 нет кнопки «Сохранить в DBF»

DBF — формат таблиц dBase и FoxPro. Сейчас его в основном требуют старые учётные программы, часть банков и ведомственных систем, которые принимают реестры только в нём.

В типовых конфигурациях (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) универсальной выгрузки в DBF нет. Табличный документ отчёта сохраняется в MXL, XLS/XLSX, ODS, PDF, HTML, TXT и ещё несколько форматов — DBF среди них нет.

Зато во встроенном языке платформы есть объект XBase. Он создаёт DBF-файл, описывает поля, добавляет записи и умеет индексы CDX. На нём построены все обработки выгрузки в DBF.

Перед тем как что-то писать, запросите у принимающей стороны спецификацию файла:

  • 📋 список полей: имя, тип, длина, число знаков после запятой;
  • 🔤 кодировку: DOS (866) или Windows (1251);
  • 📅 формат дат и пустых значений;
  • 📁 требования к имени файла (часто 8 символов + .dbf).

Без спецификации файл почти наверняка придётся переделывать: принимающая программа проверяет структуру строго.

Готовые внешние обработки и отчёты для выгрузки в DBF

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

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

Есть два способа.

  1. Разово. Меню Файл → Открыть (в «Такси» — через значок меню в заголовке окна), выберите файл .epf. Нужно право на интерактивное открытие внешних обработок; у обычного пользователя его часто нет.
  2. Постоянно. В Бухгалтерии 3.0 включите флажок Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки, затем в том же разделе откройте список и добавьте файл. Обработка появится в меню выбранного раздела.

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

Когда готовая обработка не подходит

Универсальные обработки выгружают реквизиты «как есть». Если банку нужен реестр с итогами по сотрудникам, а налоговой программе — свёртка по контрагентам, удобнее написать свою обработку с запросом под задачу. Это и быстрее, чем подгонять чужую.

Своя обработка выгрузки в DBF: пошагово

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

Шаг 1. Логика — в модуле объекта

Главный приём: функцию формирования файла пишите в модуле объекта обработки с ключевым словом Экспорт, а не в модуле формы. Тогда одну и ту же функцию можно вызвать и из формы, и через COM-соединение, и из регламентного запуска.

Объект XBase доступен на сервере, в толстом клиенте и во внешнем соединении. В тонком и веб-клиенте его нет, поэтому код выполняется на сервере.

Пример ниже выгружает контрагентов Бухгалтерии 3.0 в файл с кодировкой DOS:

Функция СформироватьDBF(ИмяФайла) Экспорт

    ДБФ = Новый XBase;
    ДБФ.Кодировка = КодировкаXBase.OEM;

    ДБФ.Поля.Добавить("KOD", "S", 11, 0);
    ДБФ.Поля.Добавить("NAIM", "S", 100, 0);
    ДБФ.Поля.Добавить("INN", "S", 12, 0);
    ДБФ.Поля.Добавить("DATEVYG", "D", 8, 0);

    ДБФ.СоздатьФайл(ИмяФайла);

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    Контрагенты.Код КАК Код,
    |    Контрагенты.Наименование КАК Наименование,
    |    Контрагенты.ИНН КАК ИНН
    |ИЗ
    |    Справочник.Контрагенты КАК Контрагенты
    |ГДЕ
    |    НЕ Контрагенты.ЭтоГруппа
    |    И НЕ Контрагенты.ПометкаУдаления";

    ДатаВыгрузки = НачалоДня(ТекущаяДата());
    Выборка = Запрос.Выполнить().Выбрать();
    Количество = 0;

    Пока Выборка.Следующий() Цикл
        ДБФ.Добавить();
        ДБФ.KOD = СокрЛП(Выборка.Код);
        ДБФ.NAIM = Лев(Выборка.Наименование, 100);
        ДБФ.INN = Выборка.ИНН;
        ДБФ.DATEVYG = ДатаВыгрузки;
        ДБФ.Записать();
        Количество = Количество + 1;
    КонецЦикла;

    ДБФ.ЗакрытьФайл();

    Возврат Количество;

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

К полям записи обращаются как к свойствам объекта: ДБФ.INN. Поэтому имена полей пишите латиницей, без пробелов и не длиннее 10 символов.

Шаг 2. Форма и вызов на сервере

Создайте форму обработки, добавьте команду «Выгрузить» и кнопку. В модуле формы:

&НаКлиенте
Процедура Выгрузить(Команда)
    Адрес = ВыгрузитьНаСервере();
    ФайловаяСистемаКлиент.СохранитьФайл(Неопределено, Адрес, "kontr.dbf");
КонецПроцедуры

&НаСервере
Функция ВыгрузитьНаСервере()
    ИмяФайла = ПолучитьИмяВременногоФайла("dbf");
    Обработка = РеквизитФормыВЗначение("Объект");
    Обработка.СформироватьDBF(ИмяФайла);
    Адрес = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайла), УникальныйИдентификатор);
    УдалитьФайлы(ИмяФайла);
    Возврат Адрес;
КонецФункции

Файл создаётся во временном каталоге сервера, уходит во временное хранилище, а пользователь сохраняет его к себе. ФайловаяСистемаКлиент — модуль библиотеки стандартных подсистем, он есть во всех актуальных типовых конфигурациях.

В клиент-серверной базе путь вида C:\Выгрузка\file.dbf в коде сервера указывает на диск сервера 1С, а не компьютера бухгалтера. Поэтому файл и передают через временное хранилище.

Шаг 3. Проверка результата

Откройте файл в программе, которая будет его принимать, или в LibreOffice Calc с выбором кодировки. Проверьте три вещи: читается ли кириллица, не обрезаны ли длинные строки, совпадает ли число записей с тем, что вернула функция.

Поля DBF: типы, длины и кодировка при выгрузке из 1С

Поле добавляется методом Поля.Добавить(Имя, Тип, Длина, Точность). Типов четыре:

КодТип в DBFЧто записывать из 1СНа что смотреть
SстрокаСтрока, код, ИНН, номерМаксимум 254 символа, длинное обрезается
NчислоЧислоДлина включает знак и точку
DдатаДатаХранится без времени, 8 байт
LлогическоеБулевоДлина 1

Как считать длину числового поля

Длина числа — это все символы, включая минус и десятичную точку. Для сумм до 999 999 999,99 нужно 9 цифр целой части, 1 точка и 2 знака: длина 12, точность 2. С запасом под знак ставят 13.

Если спецификация требует N(15,2), так и пишите: Поля.Добавить("SUMMA", "N", 15, 2).

Строки, коды и ИНН

ИНН, коды, номера счетов выгружайте строкой, а не числом. Числом теряются ведущие нули, а 20-значный расчётный счёт превращается в экспоненту в программе-получателе.

Перед записью приводите строки к длине поля: Лев(Значение, 100). Так обрезка будет вашим решением, а не сюрпризом.

Кодировка: OEM или ANSI

  • 🖥️ КодировкаXBase.OEM — DOS, кодовая страница 866. Её ждут программы на FoxPro и Clipper и многие банковские загрузчики.
  • 🪟 КодировкаXBase.ANSI — Windows, кодовая страница 1251.

Кодировку задают до СоздатьФайл(). Если в спецификации о ней ни слова, спросите. Ошибка в кодировке — самая частая причина «кракозябр» у получателя.

Пример: переводим спецификацию в код

Допустим, получатель прислал требования: поля TABN C(8), FIO C(60), SUMMA N(12,2), DATAOP D, кодировка DOS. Буква C в спецификациях dBase означает строку, в XBase ей соответствует S.

Описание полей получится таким:

ДБФ.Кодировка = КодировкаXBase.OEM;
ДБФ.Поля.Добавить("TABN", "S", 8, 0);
ДБФ.Поля.Добавить("FIO", "S", 60, 0);
ДБФ.Поля.Добавить("SUMMA", "N", 12, 2);
ДБФ.Поля.Добавить("DATAOP", "D", 8, 0);

Суммы перед записью округляйте до точности поля: Окр(Сумма, 2). Иначе копейки разойдутся с итогом, который получатель сверяет с платёжкой.

Индекс, если его требуют

Некоторые программы просят CDX-индекс рядом с таблицей. XBase умеет его создавать: индексы описывают до создания файла и передают имя индексного файла вторым параметром СоздатьФайл(). Делайте это, только если индекс прямо есть в требованиях.

Автоматическая выгрузка в DBF: COM-соединение, командная строка и Excel

Когда файл нужен по расписанию, человек в цепочке лишний. Вот варианты.

СпособКогда подходитОграничения
COM-соединениеВыгрузку запускает другая база 1С или внешний скриптНужна зарегистрированная comcntr.dll нужной разрядности
Запуск 1cv8 с /ExecuteПростое расписание в планировщике WindowsНужен свободный сеанс и лицензия
Регламентное заданиеВыгрузка внутри своей базы на сервереТребует доработки конфигурации
Excel → LibreOffice CalcРазовая выгрузка без программистаРучной труд, легко ошибиться в типах

Через COM-соединение

Логика уже лежит в модуле объекта, поэтому её достаточно вызвать снаружи. Пример из другой базы 1С (код на сервере или в толстом клиенте под Windows):

Коннектор = Новый COMОбъект("V83.COMConnector");
Соединение = Коннектор.Connect("File=""D:\Bases\Buh"";Usr=""Выгрузка"";Pwd=""пароль"";");
Обработка = Соединение.ВнешниеОбработки.Создать("D:\epf\VygruzkaDBF.epf", Ложь);
Количество = Обработка.СформироватьDBF("D:\Obmen\kontr.dbf");

Для серверной базы строка соединения другая: Srvr="имя_сервера";Ref="имя_базы";. Путь к файлу в этом случае — путь на машине, где выполняется внешнее соединение.

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

Через командную строку

Второй вариант — запуск клиента с параметром /Execute. Он открывает внешнюю обработку сразу после входа:

"C:\Program Files\1cv8\8.3.24.1691\bin\1cv8.exe" ENTERPRISE /F"D:\Bases\Buh" /N"Выгрузка" /P"пароль" /Execute"D:\epf\VygruzkaDBF.epf"

Номер платформы в пути подставьте свой. В обработке при открытии формы вызовите выгрузку, а затем ЗавершитьРаботуСистемы(Ложь), чтобы сеанс не висел и не держал лицензию. Задание ставят в планировщик Windows на ночь.

Через Excel и LibreOffice Calc

Обходной путь без программирования:

  1. Сформируйте нужный отчёт в 1С и сохраните его в XLSX (значок дискеты над табличным документом).
  2. Откройте файл в LibreOffice Calc, удалите шапку отчёта и итоги: первая строка — имена полей, дальше только данные.
  3. Файл → Сохранить как, тип «dBASE (.dbf)», в диалоге выберите кодировку 866 или 1251.

Современный Excel в DBF больше не сохраняет: эту возможность убрали ещё в версии 2007. Поэтому нужен именно Calc. Типы полей он определяет сам по данным, и для строгих спецификаций это слабое место: ИНН может стать числом.

Ошибки при выгрузке из 1С в DBF и как их исправить

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

Ещё две мелочи, на которых часто спотыкаются:

  • ✂️ Имя поля длиннее 10 символов. Формат DBF больше не позволяет. Сокращайте сами: DATEVYG, а не DATAVYGRUZKI.
  • 🔄 Пропущен Записать() после заполнения полей. Запись добавится пустой. Каждая строка — это пара Добавить() и Записать().

Частые вопросы о выгрузке DBF из 1С

Можно ли выгрузить DBF из 1С без программиста?
Да: готовой внешней обработкой или через сохранение отчёта в XLSX и пересохранение в LibreOffice Calc. Для строгих банковских форматов надёжнее своя обработка.
Работает ли XBase в базе в облаке или через веб-клиент?
Объект работает на стороне сервера, поэтому выгрузка возможна. Готовый файл пользователь получает через временное хранилище, как в примере выше.
Как выгрузить в DBF больше 254 символов текста?
Строковое поле DBF ограничено 254 символами. Разбейте текст на несколько полей или уточните у получателя, допускает ли он memo-поле и как его создавать.
Сколько записей можно выгрузить в один DBF?
Ограничение формата — 2 ГБ на файл. Для реестров на десятки тысяч строк этого с запасом. Медленно работает обычно не запись, а запрос: оптимизируйте его.
Можно ли этой же обработкой загрузить DBF обратно в 1С?
Да, через ОткрытьФайл(), а затем Первая(), Следующая() и проверку ВКонце(). Это отдельная задача со своей логикой поиска и создания объектов.