Почему обработка 1С загружает файлы на FTP в файловой базе, но выдает ошибку в облаке 1С:Фреш?

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

Перевод локальной информационной базы в облачный сервис 1С:Фреш (1cfresh.com) часто сопровождается неожиданными трудностями. Типичная ситуация: внешняя обработка, которая идеально работала в тонком клиенте на локальном компьютере, внезапно начинает выдавать ошибки при попытке отправить файл на FTP-сервер из облака. Рассмотрим детально, почему это происходит, и разберем по шагам, как адаптировать код для корректной работы в веб-клиенте и серверной среде "Фреша".

Разберем причину №1: Ограничения веб-клиента

Проанализируем первую ошибку, с которой сталкивается пользователь при запуске обработки в браузере. В веб-клиенте попытка инициализации объекта FTPСоединение приводит к ошибке "Объект не определен". Это происходит потому, что браузерная среда (Chrome, Firefox, Safari и др.) из соображений безопасности не предоставляет платформе 1С прямой доступ к низкоуровневым сокетам и библиотекам операционной системы, необходимым для работы FTP-протокола.

Важно запомнить правило: объект FTPСоединение недоступен на стороне клиента в веб-клиенте. Если ваш код написан в процедуре с директивой компиляции &НаКлиенте, он гарантированно не будет работать в браузере. Выясним, как это исправить. Решение заключается в переносе всей логики работы с внешними ресурсами на сторону сервера.

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


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

&НаСервере
Процедура ОтправитьНаСерверИнформацию(АдресХранилища)
    // Извлекаем данные из хранилища
    Данные = ПолучитьИзВременногоХранилища(АдресХранилища);
    
    // Создаем соединение только здесь!
    Соединение = Новый FTPСоединение("ftp.myserver.ru", 21, "user", "password", , Истина); // Истина - пассивный режим
    // ... дальнейшая работа
КонецПроцедуры

Разберем причину №2: Профили безопасности и аудит в 1С:Фреш

Даже если код выполняется &НаСервере, в облаке 1С:Фреш он работает в изолированной среде — "песочнице". Чтобы ваша обработка могла "постучаться" на внешний IP-адрес или домен, она должна пройти аудит, а в ее коде должны быть явно прописаны запросы на разрешения. Проанализируем, что нужно учесть при подготовке расширения или обработки к аудиту:

  1. Разрешение на интернет-соединение: В модуле объекта (или в функции СведенияОВнешнейОбработке) необходимо указать конкретный адрес FTP-сервера и порт. Если адрес будет изменен, разрешение перестанет действовать.
  2. Динамические порты в FTP: Это самый сложный момент. Протокол FTP использует порт 21 для команд, но для передачи самих данных открывает случайные порты из определенного диапазона. В профиле безопасности "Фреша" должны быть открыты не только порт 21, но и те порты, которые ваш FTP-сервер выделяет для данных.

Проанализируем ситуацию с пассивным режимом. При создании объекта FTPСоединение шестым параметром всегда указывайте Истина (ПассивныйРежим). В этом режиме инициатором соединения для передачи данных выступает клиент (сервер 1С), что гораздо проще "пролезает" через сетевые экраны (firewalls) облачного провайдера.

Разберем причину №3: Работа с временными файлами в облаке

В файловой базе мы привыкли создавать временный файл через ПолучитьИмяВременногоФайла(), записывать в него данные и отправлять на FTP. Посмотрим на этот процесс в облаке. Хотя функция создания временного файла работает, политика безопасности "Фреша" крайне не приветствует лишние манипуляции с дисковой подсистемой сервера.

Начиная с версии платформы 8.3.15, мы можем использовать потоки, чтобы избежать записи файла на диск сервера вообще. Рассмотрим, как реализовать отправку данных из оперативной памяти напрямую на FTP:


&НаСервере
Процедура ОтправитьДанныеБезФайла(ДвоичныеДанныеФайла, ИмяФайлаНаСервере)
    ПотокЧтения = Новый ПотокВПамяти(ДвоичныеДанныеФайла);
    
    // Настраиваем соединение (Пассивный режим = Истина)
    Соединение = Новый FTPСоединение("ftp.example.com", 21, "login", "pass", , Истина);
    
    // Используем метод Записать, передавая поток напрямую
    Соединение.Записать(ПотокЧтения, ИмяФайлаНаСервере);
    
    ПотокЧтения.Закрыть();
КонецПроцедуры

Такой подход не только повышает производительность, но и делает вашу обработку более "чистой" с точки зрения аудита 1С:Фреш, так как вы не оставляете следов в файловой системе сервера.

Разберем альтернативу: Переход на SFTP

В ходе обсуждения специалисты часто упоминают, что классический FTP — протокол устаревший и небезопасный. Если ваш сервер поддерживает SSH, лучше использовать протокол SFTP. В платформе 1С работа с ним реализована через тот же объект FTPСоединение, начиная с версии 8.3.11.

Посмотрим на преимущества SFTP для работы в облаке:

Для активации SFTP в 1С достаточно в адресе сервера указать префикс sftp:// или использовать соответствующий конструктор.

Выясним причины ошибок в тонком клиенте на веб-сервере

Если в веб-клиенте мы получили ошибку отсутствия объекта, то в тонком клиенте, работающем через веб-сервер, ошибка может звучать как "Ошибка работы с Интернет". Проанализируем причины:

  1. Тайм-ауты: Облачный сервер может ограничивать время выполнения серверного вызова. Если файл большой, соединение может быть разорвано. В таких случаях операцию передачи на FTP стоит выносить в фоновое задание.
  2. Прокси-сервер: Если сервер 1С:Фреш выходит в интернет через прокси, параметры этого прокси должны быть корректно прописаны в конфигурационном файле inetcfg.xml на стороне сервера, либо переданы в параметрах FTPСоединение.

Подведем итоги и сформируем алгоритм действий

Если ваша обработка не работает в 1С:Фреш, выполните следующие шаги:

  1. Убедитесь, что создание объекта FTPСоединение и вызов метода Записать() происходят строго в серверном контексте (процедуры &НаСервере или модули объектов).
  2. При инициализации соединения обязательно устанавливайте параметр ПассивныйРежим в значение Истина.
  3. Проверьте, что в запросах разрешений при аудите указаны точные адреса и порты вашего FTP-сервера.
  4. По возможности откажитесь от записи временных файлов на диск сервера, используя ПотокВПамяти.
  5. Если передача файлов занимает длительное время, используйте механизм фоновых заданий, чтобы не блокировать интерфейс пользователя и избежать обрыва сессии по таймауту.

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

← На главную