Выгрузка данных из 1С в файл DBF: от готовой обработки до своей на XBase
Содержание
Выгрузить данные из 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.
Как подключить обработку
Есть два способа.
- Разово. Меню
Файл → Открыть(в «Такси» — через значок меню в заголовке окна), выберите файл.epf. Нужно право на интерактивное открытие внешних обработок; у обычного пользователя его часто нет. - Постоянно. В Бухгалтерии 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С и сохраните его в XLSX (значок дискеты над табличным документом).
- Откройте файл в LibreOffice Calc, удалите шапку отчёта и итоги: первая строка — имена полей, дальше только данные.
Файл → Сохранить как, тип «dBASE (.dbf)», в диалоге выберите кодировку 866 или 1251.
Современный Excel в DBF больше не сохраняет: эту возможность убрали ещё в версии 2007. Поэтому нужен именно Calc. Типы полей он определяет сам по данным, и для строгих спецификаций это слабое место: ИНН может стать числом.
Ошибки при выгрузке из 1С в DBF и как их исправить
Ещё две мелочи, на которых часто спотыкаются:
- ✂️ Имя поля длиннее 10 символов. Формат DBF больше не позволяет. Сокращайте сами:
DATEVYG, а неDATAVYGRUZKI. - 🔄 Пропущен
Записать()после заполнения полей. Запись добавится пустой. Каждая строка — это параДобавить()иЗаписать().