При интеграции систем через веб-сервисы (SOAP или HTTP) нередко возникает задача передачи файлов. Если данные передаются в устаревшем, но все еще популярном формате DBF, на стороне клиента файл обычно кодируется в строку Base64. Разберем, как правильно принять такую строку в веб-сервисе 1С, преобразовать ее в таблицу и прочитать значения полей.
Для чтения файлов формата DBF в платформе 1С предназначен специализированный объект XBase. Однако у него есть важная особенность: объект XBase не умеет работать напрямую с потоками в оперативной памяти или с двоичными данными из временного хранилища. Для выполнения метода ОткрытьФайл() таблица обязательно должна физически находиться на диске.
В клиент-серверном варианте базы данных вызов веб-сервиса исполняется на стороне сервера в контексте рабочего процесса rphost. Следовательно, сохранять и читать файл необходимо в файловой системе сервера 1С.
Рассмотрим ключевые нюансы, которые необходимо учитывать:
Разберем по шагам весь процесс обработки входящей строки Base64 в методе веб-сервиса.
Base64Значение(), передав в нее входящую текстовую строку.ПолучитьИмяВременногоФайла("dbf"). Это гарантирует получение уникального имени в системном каталоге временных файлов сервера и исключит конфликты при параллельных вызовах сервиса.Записать() у полученных двоичных данных.XBase, задаем кодировку через свойство Кодировка, открываем файл методом ОткрытьФайл() и обходим строки циклом.ЗакрытьФайл() и удаляем временный файл процедурой УдалитьФайлы() в блоке обработки исключений.Посмотрим на пример кода функции веб-сервиса, которая принимает строку Base64, считывает данные из таблицы и возвращает результат:
Функция ОбработатьВходящийDBF(СтрокаBase64)
// 1. Декодируем Base64 в двоичные данные
ДвоичныеДанныеDBF = Base64Значение(СтрокаBase64);
// 2. Получаем уникальный путь к временному файлу на сервере
ПутьКФайлу = ПолучитьИмяВременногоФайла("dbf");
// 3. Сохраняем файл на диск
ДвоичныеДанныеDBF.Записать(ПутьКФайлу);
ТаблицаDBF = Новый XBase;
// Указываем кодировку (КодировкаXBase.ANSI или КодировкаXBase.OEM)
ТаблицаDBF.Кодировка = КодировкаXBase.ANSI;
Попытка
ТаблицаDBF.ОткрытьФайл(ПутьКФайлу);
Если Не ТаблицаDBF.Открыта() Тогда
ВызватьИсключение "Не удалось открыть DBF файл.";
КонецЕсли;
// 4. Позиционируемся на первую запись и обходим строки
ТаблицаDBF.Первая();
Пока Не ТаблицаDBF.ВКонце() Цикл
// Обращение к полям таблицы по их именам
КодТовара = ТаблицаDBF.CODE;
Наименование = СокрЛП(ТаблицаDBF.NAME);
Количество = ТаблицаDBF.QUANT;
// Здесь выполняется логика обработки полученных данных
// Например, заполнение таблицы значений или создание документов
ТаблицаDBF.Следующая();
КонецЦикла;
Исключение
// В случае ошибки обязательно закрываем файл перед пробросом исключения
Если ТаблицаDBF.Открыта() Тогда
ТаблицаDBF.ЗакрытьФайл();
КонецЕсли;
УдалитьФайлы(ПутьКФайлу);
ВызватьИсключение ОписаниеОшибки();
КонецПопытки;
// 5. Обязательно освобождаем файл и удаляем его с диска
ТаблицаDBF.ЗакрытьФайл();
УдалитьФайлы(ПутьКФайлу);
Возврат "Успешно";
КонецФункции
Проанализируем распространенные проблемы, с которыми можно столкнуться при реализации:
.fpt или .dbt) либо связана с индексными файлами (.cdx), передача только одного файла .dbf приведет к ошибке при открытии. В таком случае необходимо либо передавать архив со всеми связанными файлами, либо отключать зависимости на стороне системы-отправителя.XBase может иметь ограничения по работе с некоторыми диалектами формата DBF (например, Visual FoxPro).