Как настроить выгрузку DBF-файла на FTP в сервисе 1С:Фреш?

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

Работа в облачных сервисах, таких как 1С:Фреш, накладывает ряд существенных ограничений на привычные методы разработки. Часто программисты сталкиваются с ситуацией, когда код, идеально работающий на локальной клиент-серверной базе (Windows + SQL), полностью отказывает в «облаке». Одной из таких проблем является выгрузка файлов через протокол FTP, особенно если речь идет о специфических форматах вроде XBase (DBF).

В этой статье мы подробно разберем, почему возникает ошибка «Файл не обнаружен» при попытке записи файла на FTP-сервер, проанализируем влияние операционной системы Linux на работу кода 1С и предоставим готовые решения для успешной интеграции.

Причина проблемы: Разница между Windows и Linux

Первое, что мы должны понять: серверная часть 1С:Фреш работает под управлением ОС Linux. В отличие от Windows, Linux крайне чувствителен к регистру символов в путях и именах файлов. Для этой системы Price.dbf и Price.DBF — это два абсолютно разных файла.

Разберем ситуацию: вы создаете файл с помощью объекта XBase. Исторически сложилось, что этот объект при создании файла на диске часто принудительно переводит расширение в верхний регистр (делает его .DBF), даже если вы явно указали строчными буквами в коде. Когда вы вызываете метод FTPСоединение.Записать(), указывая путь с маленькими буквами, сервер Linux сообщает, что файл не найден, так как фактически на диске лежит файл с заглавным расширением.

Рассмотрим подробнее типичный ошибочный сценарий:


// Ошибочный подход для Linux/Фреш
КаталогВФ = ФайловаяСистема.СоздатьВременныйКаталог();
ИмяФайла = КаталогВФ + "Price.dbf"; 

ФайлПрайс = Новый XBase;
// ... заполнение полей ...
ФайлПрайс.СоздатьФайл(ИмяФайла); // Система создаст Price.DBF
ФайлПрайс.Записать();
ФайлПрайс.ЗакрытьФайл();

// Здесь возникнет ошибка, так как поиск идет по "Price.dbf"
FTPСоединение.Записать(ИмяФайла, "upload/Price.dbf");

Решение №1: Принудительное управление регистром имен

Для того чтобы код стал универсальным, мы должны гарантировать совпадение имен файлов. Самый надежный способ — использовать методы ВРег() или НРег() при формировании путей. Выясним причину успеха: если мы сразу создаем файл с заглавным именем и расширением, несоответствий не возникнет.

Проанализируем исправленный фрагмент кода:


&НаСервере
Функция ВыгрузитьПрайсНаСервере()
    
    // Используем стандартный метод получения временного файла
    // Важно: XBase может ограничивать длину имени файла до 8 символов (стандарт DOS)
    ИмяФайла = ПолучитьИмяВременногоФайла("DBF"); 
    
    ФайлПрайс = Новый XBase;
    ФайлПрайс.Кодировка = КодировкаXBase.OEM;
    
    // Добавляем поля (имена полей также желательно в верхнем регистре)
    ФайлПрайс.поля.Добавить("CODEPST","S",36,0);
    ФайлПрайс.поля.Добавить("PRICE","N",10,2);
    
    ФайлПрайс.СоздатьФайл(ИмяФайла);
    
    // Цикл заполнения данных
    Для каждого Строка Из ТЗПрайс Цикл
        ФайлПрайс.Добавить();
        ЗаполнитьЗначенияСвойств(ФайлПрайс, Строка);
        ФайлПрайс.Записать();
    КонецЦикла;
    
    ФайлПрайс.ЗакрытьФайл();
    
    // Перед отправкой убедимся, что мы передаем именно то имя, которое создано на диске
    Попытка
        FTPСоединение = ПолучитьFTPСоединение();
        // Передаем точное ИмяФайла, полученное из ПолучитьИмяВременногоФайла
        FTPСоединение.Записать(ИмяФайла, "Price.DBF"); 
    Исключение
        // Обработка ошибок
        Возврат Ложь;
    КонецПопытки;
    
    УдалитьФайлы(ИмяФайла);
    Возврат Истина;
    
КонецФункции

Решение №2: Настройка пассивного режима и прокси

Вторая распространенная проблема в 1С:Фреш — блокировка соединения межсетевыми экранами (файрволлами). Облачная инфраструктура почти всегда требует использования пассивного режима FTP. В активном режиме FTP-сервер пытается сам подключиться к серверу 1С, что во Фреше запрещено правилами безопасности.

Посмотрим на пример правильной инициализации структуры настроек:


Функция FTPНастройкиСоединения()
    Результат = Новый Структура;
    Результат.Вставить("Сервер", "ftp.example.com");
    Результат.Вставить("Порт", 21);
    Результат.Вставить("ИмяПользователя", "user");
    Результат.Вставить("ПарольПользователя", "password");
    
    // Критически важно для облака!
    Результат.Вставить("ПассивноеСоединение", Истина); 
    
    Результат.Вставить("Таймаут", 60);
    Возврат Результат;
КонецФункции

Также важно учитывать, что для расширений в сервисе Фреш необходимо использовать механизмы БСП (Библиотеки Стандартных Подсистем), которые корректно обрабатывают настройки прокси-серверов. Рекомендуется использовать функцию ПолучениеФайловИзИнтернета.ПолучитьПрокси("ftp"), чтобы соединение проходило через разрешенные шлюзы сервиса.

Решение №3: Работа через фоновые задания

Если выгружаемый файл имеет большой объем, вы можете столкнуться с разрывом связи («сеанс потерян»). Это происходит из-за таймаутов веб-серверов Nginx или Apache, которые стоят перед кластером Фреша. Они ожидают ответа от сервера 1С ограниченное время (обычно от 30 до 60 секунд).

Разберем, как правильно организовать процесс:

  1. Клиент нажимает кнопку «Выгрузить».
  2. Сервер запускает ФоновоеЗадание, которое выполняет всю тяжелую работу (формирование DBF и отправку на FTP).
  3. Клиентская форма периодически (через обработчик ожидания) проверяет состояние задания.
  4. По завершении задания пользователю выводится сообщение об успехе.

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

Важные нюансы аудита расширений

При передаче расширения на аудит в 1С:Фреш, помните о профилях безопасности. В вашем расширении должны быть запрошены разрешения на доступ к внешним интернет-ресурсам. В манифесте расширения (или в настройках в личном кабинете) должен быть явно указан адрес FTP-сервера.

Полезные советы:

Соблюдение этих правил позволит вам создавать надежные механизмы обмена данными, которые будут стабильно работать в любой среде исполнения — от локального сервера до высоконагруженного облачного сервиса.

← На главную