Как в веб-сервисе 1С прочитать DBF-файл, полученный в формате Base64?

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

При интеграции систем через веб-сервисы (SOAP или HTTP) нередко возникает задача передачи файлов. Если данные передаются в устаревшем, но все еще популярном формате DBF, на стороне клиента файл обычно кодируется в строку Base64. Разберем, как правильно принять такую строку в веб-сервисе 1С, преобразовать ее в таблицу и прочитать значения полей.

Архитектурные особенности работы с DBF в 1С

Для чтения файлов формата DBF в платформе 1С предназначен специализированный объект XBase. Однако у него есть важная особенность: объект XBase не умеет работать напрямую с потоками в оперативной памяти или с двоичными данными из временного хранилища. Для выполнения метода ОткрытьФайл() таблица обязательно должна физически находиться на диске.

В клиент-серверном варианте базы данных вызов веб-сервиса исполняется на стороне сервера в контексте рабочего процесса rphost. Следовательно, сохранять и читать файл необходимо в файловой системе сервера 1С.

Рассмотрим ключевые нюансы, которые необходимо учитывать:

  1. Права доступа: Пользователь операционной системы, от имени которого запущен сервер 1С, должен обладать правами на создание, чтение и удаление файлов во временном каталоге.
  2. Кодировка: DBF-файлы могут создаваться в кодировках DOS (OEM/CP866) или Windows (ANSI/CP1251). Неверно указанная кодировка приведет к искажению кириллических символов.
  3. Очистка ресурсов: Любые временно созданные файлы на сервере должны гарантированно удаляться после завершения чтения, чтобы не засорять дисковое пространство.

Пошаговый алгоритм обработки файла

Разберем по шагам весь процесс обработки входящей строки Base64 в методе веб-сервиса.

  1. Декодирование строки в двоичные данные: Используем функцию Base64Значение(), передав в нее входящую текстовую строку.
  2. Формирование пути к временному файлу: Применяем функцию ПолучитьИмяВременногоФайла("dbf"). Это гарантирует получение уникального имени в системном каталоге временных файлов сервера и исключит конфликты при параллельных вызовах сервиса.
  3. Запись файла на диск: Вызываем метод Записать() у полученных двоичных данных.
  4. Чтение структуры и данных: Создаем объект XBase, задаем кодировку через свойство Кодировка, открываем файл методом ОткрытьФайл() и обходим строки циклом.
  5. Закрытие и удаление файла: Закрываем таблицу методом ЗакрытьФайл() и удаляем временный файл процедурой УдалитьФайлы() в блоке обработки исключений.

Программная реализация чтения DBF

Посмотрим на пример кода функции веб-сервиса, которая принимает строку 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.ЗакрытьФайл();
    УдалитьФайлы(ПутьКФайлу);
    
    Возврат "Успешно";
    
КонецФункции

Возможные сложности и рекомендации

Проанализируем распространенные проблемы, с которыми можно столкнуться при реализации:

  1. Наличие Memo-полей и индексов: Если исходная таблица содержит Memo-поля (файлы с расширением .fpt или .dbt) либо связана с индексными файлами (.cdx), передача только одного файла .dbf приведет к ошибке при открытии. В таком случае необходимо либо передавать архив со всеми связанными файлами, либо отключать зависимости на стороне системы-отправителя.
  2. Серверы под управлением Linux: Если сервер 1С работает под ОС Linux, необходимо убедиться в корректности используемых драйверов и форматов, так как стандартный объект XBase может иметь ограничения по работе с некоторыми диалектами формата DBF (например, Visual FoxPro).
  3. Альтернативные форматы обмена: Передача двоичных таблиц через веб-сервисы является устаревшим подходом. Если есть возможность повлиять на формат взаимодействия, рекомендуется перевести интеграцию на стандартные форматы JSON или XML. Это избавит сервер от лишних операций дискового ввода-вывода и сделает обмен более надежным.
← На главную