Работа в облачных сервисах, таких как 1С:Фреш, накладывает ряд существенных ограничений на привычные методы разработки. Часто программисты сталкиваются с ситуацией, когда код, идеально работающий на локальной клиент-серверной базе (Windows + SQL), полностью отказывает в «облаке». Одной из таких проблем является выгрузка файлов через протокол FTP, особенно если речь идет о специфических форматах вроде XBase (DBF).
В этой статье мы подробно разберем, почему возникает ошибка «Файл не обнаружен» при попытке записи файла на FTP-сервер, проанализируем влияние операционной системы Linux на работу кода 1С и предоставим готовые решения для успешной интеграции.
Первое, что мы должны понять: серверная часть 1С:Фреш работает под управлением ОС Linux. В отличие от Windows, Linux крайне чувствителен к регистру символов в путях и именах файлов. Для этой системы Price.dbf и Price.DBF — это два абсолютно разных файла.
Разберем ситуацию: вы создаете файл с помощью объекта XBase. Исторически сложилось, что этот объект при создании файла на диске часто принудительно переводит расширение в верхний регистр (делает его .DBF), даже если вы явно указали строчными буквами в коде. Когда вы вызываете метод FTPСоединение.Записать(), указывая путь с маленькими буквами, сервер Linux сообщает, что файл не найден, так как фактически на диске лежит файл с заглавным расширением.
Рассмотрим подробнее типичный ошибочный сценарий:
// Ошибочный подход для Linux/Фреш
КаталогВФ = ФайловаяСистема.СоздатьВременныйКаталог();
ИмяФайла = КаталогВФ + "Price.dbf";
ФайлПрайс = Новый XBase;
// ... заполнение полей ...
ФайлПрайс.СоздатьФайл(ИмяФайла); // Система создаст Price.DBF
ФайлПрайс.Записать();
ФайлПрайс.ЗакрытьФайл();
// Здесь возникнет ошибка, так как поиск идет по "Price.dbf"
FTPСоединение.Записать(ИмяФайла, "upload/Price.dbf");
Для того чтобы код стал универсальным, мы должны гарантировать совпадение имен файлов. Самый надежный способ — использовать методы ВРег() или НРег() при формировании путей. Выясним причину успеха: если мы сразу создаем файл с заглавным именем и расширением, несоответствий не возникнет.
Проанализируем исправленный фрагмент кода:
&НаСервере
Функция ВыгрузитьПрайсНаСервере()
// Используем стандартный метод получения временного файла
// Важно: XBase может ограничивать длину имени файла до 8 символов (стандарт DOS)
ИмяФайла = ПолучитьИмяВременногоФайла("DBF");
ФайлПрайс = Новый XBase;
ФайлПрайс.Кодировка = КодировкаXBase.OEM;
// Добавляем поля (имена полей также желательно в верхнем регистре)
ФайлПрайс.поля.Добавить("CODEPST","S",36,0);
ФайлПрайс.поля.Добавить("PRICE","N",10,2);
ФайлПрайс.СоздатьФайл(ИмяФайла);
// Цикл заполнения данных
Для каждого Строка Из ТЗПрайс Цикл
ФайлПрайс.Добавить();
ЗаполнитьЗначенияСвойств(ФайлПрайс, Строка);
ФайлПрайс.Записать();
КонецЦикла;
ФайлПрайс.ЗакрытьФайл();
// Перед отправкой убедимся, что мы передаем именно то имя, которое создано на диске
Попытка
FTPСоединение = ПолучитьFTPСоединение();
// Передаем точное ИмяФайла, полученное из ПолучитьИмяВременногоФайла
FTPСоединение.Записать(ИмяФайла, "Price.DBF");
Исключение
// Обработка ошибок
Возврат Ложь;
КонецПопытки;
УдалитьФайлы(ИмяФайла);
Возврат Истина;
КонецФункции
Вторая распространенная проблема в 1С:Фреш — блокировка соединения межсетевыми экранами (файрволлами). Облачная инфраструктура почти всегда требует использования пассивного режима FTP. В активном режиме FTP-сервер пытается сам подключиться к серверу 1С, что во Фреше запрещено правилами безопасности.
Посмотрим на пример правильной инициализации структуры настроек:
Функция FTPНастройкиСоединения()
Результат = Новый Структура;
Результат.Вставить("Сервер", "ftp.example.com");
Результат.Вставить("Порт", 21);
Результат.Вставить("ИмяПользователя", "user");
Результат.Вставить("ПарольПользователя", "password");
// Критически важно для облака!
Результат.Вставить("ПассивноеСоединение", Истина);
Результат.Вставить("Таймаут", 60);
Возврат Результат;
КонецФункции
Также важно учитывать, что для расширений в сервисе Фреш необходимо использовать механизмы БСП (Библиотеки Стандартных Подсистем), которые корректно обрабатывают настройки прокси-серверов. Рекомендуется использовать функцию ПолучениеФайловИзИнтернета.ПолучитьПрокси("ftp"), чтобы соединение проходило через разрешенные шлюзы сервиса.
Если выгружаемый файл имеет большой объем, вы можете столкнуться с разрывом связи («сеанс потерян»). Это происходит из-за таймаутов веб-серверов Nginx или Apache, которые стоят перед кластером Фреша. Они ожидают ответа от сервера 1С ограниченное время (обычно от 30 до 60 секунд).
Разберем, как правильно организовать процесс:
Это гарантирует, что основной сеанс пользователя не будет прерван по таймауту, а сервер спокойно завершит передачу данных.
При передаче расширения на аудит в 1С:Фреш, помните о профилях безопасности. В вашем расширении должны быть запрошены разрешения на доступ к внешним интернет-ресурсам. В манифесте расширения (или в настройках в личном кабинете) должен быть явно указан адрес FTP-сервера.
Полезные советы:
ДвоичныеДанные. Вместо того чтобы записывать файл на диск и передавать путь в метод Записать(), попробуйте прочитать файл в ДвоичныеДанные сразу после закрытия XBase. Метод FTPСоединение.Записать(Данные, Путь) отлично работает с этим типом.УдалитьФайлы(). Хотя система должна чистить временные папки, в условиях ограниченных квот Фреша лучше делать это сразу.КодировкаXBase.OEM (для DOS/Windows кодировок) или КодировкаXBase.ANSI в зависимости от ТЗ клиента, чтобы избежать проблем с кириллицей.Соблюдение этих правил позволит вам создавать надежные механизмы обмена данными, которые будут стабильно работать в любой среде исполнения — от локального сервера до высоконагруженного облачного сервиса.