1С. Работа с файлами DBF

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

Задача

Из табличной части документа «Начисление заработной платы» организовать выгрузку данных в файл формата DBF, файл должен содержать поля:

  • NAME — ФИО сотрудника, строка 50;
  • ACCOUNT — Номер лицевого счета, строка 20;
  • AMOUNT — Сумма перечисления, число 15,2.

Имя файла произвольное, указывается пользователем.

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

Решение

Открываем синтакс-помощник, читаем справку о XBase и пешем функцию получения данных и формирования, по традиции код снабжен комментариями:

&НаСервере
Функция СформироватьФайлВыгрузкиСервер(ДокументНачисления)
	
    // Получение данных для выгрузки
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("ДокументНачисления", ДокументНачисления);
    Запрос.Текст = 
    "ВЫБРАТЬ
    |	ДокументНачисления.ФИО,
    |	ДокументНачисления.НомерСчета,
    |	ДокументНачисления.Сумма
    |ИЗ
    |	Документ.НачислениеЗаработнойПлаты.Начисления КАК ДокументНачисления
    |ГДЕ
    |	ДокументНачисления.Ссылка = &ДокументНачисления";
	
    Результат = Запрос.Выполнить();
	
    Если Результат.Пустой() Тогда 
	Возврат Неопределено;
    КонецЕсли;
	
    // Метод ПолучитьИмяВременногоФайла() не подошел,
    // имя формируемого файла должно быть не более 8 символов
    ИмяФайла		= Формат(ТекущаяДатаСеанса(), "ДФ=yyyyMMdd") + ".dbf";
    ВременныйФайл	= КаталогВременныхФайлов() + ИмяФайла;
	
    // Создание файла и формирование таблицы
    ДБФ = Новый XBase();
    ДБФ.Кодировка = КодировкаXBase.OEM;

    ДБФ.Поля.Добавить("NAME",		"S", 100);
    ДБФ.Поля.Добавить("ACCUNT",		"S", 20);
    ДБФ.Поля.Добавить("AMOUNT",		"N", 15, 2);
	
    ДБФ.СоздатьФайл(ВременныйФайл);
	
    Выборка = Результат.Выбрать();
	
    Пока Выборка.Следующий() Цикл 
		
	// Добавление строк таблицы
	ДБФ.Добавить();
	ДБФ.УстановитьЗначениеПоля("NAME",	ВРЕГ(Выборка.ФИО));
	ДБФ.УстановитьЗначениеПоля("ACCUNT",	Выборка.НомерСчета);
	ДБФ.УстановитьЗначениеПоля("AMOUNT",	Выборка.Сумма);
	ДБФ.Записать();
		
    КонецЦикла;	
	
    // Закроем файл
    ДБФ.ЗакрытьФайл();
	
    // Подготовим к передаче на клиент
    АдресВХ = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ВременныйФайл));
	
    Возврат АдресВХ;
	
КонецФункции

Функция возвращает Неопределено или АдресВременногоХранилища, в которое помещен файл DBF.

Теперь остается написать команду, которая вызовет серверный метод и сохранит результат в файл на клиенте:

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

Функционал относящийся к формированию файла DBF описан. Остальной функционал к теме не относится и легко описывается.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *