Перевод локальной информационной базы в облачный сервис 1С:Фреш (1cfresh.com) часто сопровождается неожиданными трудностями. Типичная ситуация: внешняя обработка, которая идеально работала в тонком клиенте на локальном компьютере, внезапно начинает выдавать ошибки при попытке отправить файл на FTP-сервер из облака. Рассмотрим детально, почему это происходит, и разберем по шагам, как адаптировать код для корректной работы в веб-клиенте и серверной среде "Фреша".
Проанализируем первую ошибку, с которой сталкивается пользователь при запуске обработки в браузере. В веб-клиенте попытка инициализации объекта FTPСоединение приводит к ошибке "Объект не определен". Это происходит потому, что браузерная среда (Chrome, Firefox, Safari и др.) из соображений безопасности не предоставляет платформе 1С прямой доступ к низкоуровневым сокетам и библиотекам операционной системы, необходимым для работы FTP-протокола.
Важно запомнить правило: объект FTPСоединение недоступен на стороне клиента в веб-клиенте. Если ваш код написан в процедуре с директивой компиляции &НаКлиенте, он гарантированно не будет работать в браузере. Выясним, как это исправить. Решение заключается в переносе всей логики работы с внешними ресурсами на сторону сервера.
Рассмотрим пример правильной структуры вызова:
&НаКлиенте
Процедура ОтправитьФайлНаFTP(ИмяФайла)
// На клиенте мы только выбираем файл или получаем данные
ДанныеФайла = Новый ДвоичныеДанные(ИмяФайла);
АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ДанныеФайла, ЭтаФорма.УникальныйИдентификатор);
// Вызываем серверный метод для работы с FTP
ОтправитьНаСерверИнформацию(АдресВоВременномХранилище);
КонецПроцедуры
&НаСервере
Процедура ОтправитьНаСерверИнформацию(АдресХранилища)
// Извлекаем данные из хранилища
Данные = ПолучитьИзВременногоХранилища(АдресХранилища);
// Создаем соединение только здесь!
Соединение = Новый FTPСоединение("ftp.myserver.ru", 21, "user", "password", , Истина); // Истина - пассивный режим
// ... дальнейшая работа
КонецПроцедуры
Даже если код выполняется &НаСервере, в облаке 1С:Фреш он работает в изолированной среде — "песочнице". Чтобы ваша обработка могла "постучаться" на внешний IP-адрес или домен, она должна пройти аудит, а в ее коде должны быть явно прописаны запросы на разрешения. Проанализируем, что нужно учесть при подготовке расширения или обработки к аудиту:
СведенияОВнешнейОбработке) необходимо указать конкретный адрес FTP-сервера и порт. Если адрес будет изменен, разрешение перестанет действовать.Проанализируем ситуацию с пассивным режимом. При создании объекта FTPСоединение шестым параметром всегда указывайте Истина (ПассивныйРежим). В этом режиме инициатором соединения для передачи данных выступает клиент (сервер 1С), что гораздо проще "пролезает" через сетевые экраны (firewalls) облачного провайдера.
В файловой базе мы привыкли создавать временный файл через ПолучитьИмяВременногоФайла(), записывать в него данные и отправлять на FTP. Посмотрим на этот процесс в облаке. Хотя функция создания временного файла работает, политика безопасности "Фреша" крайне не приветствует лишние манипуляции с дисковой подсистемой сервера.
Начиная с версии платформы 8.3.15, мы можем использовать потоки, чтобы избежать записи файла на диск сервера вообще. Рассмотрим, как реализовать отправку данных из оперативной памяти напрямую на FTP:
&НаСервере
Процедура ОтправитьДанныеБезФайла(ДвоичныеДанныеФайла, ИмяФайлаНаСервере)
ПотокЧтения = Новый ПотокВПамяти(ДвоичныеДанныеФайла);
// Настраиваем соединение (Пассивный режим = Истина)
Соединение = Новый FTPСоединение("ftp.example.com", 21, "login", "pass", , Истина);
// Используем метод Записать, передавая поток напрямую
Соединение.Записать(ПотокЧтения, ИмяФайлаНаСервере);
ПотокЧтения.Закрыть();
КонецПроцедуры
Такой подход не только повышает производительность, но и делает вашу обработку более "чистой" с точки зрения аудита 1С:Фреш, так как вы не оставляете следов в файловой системе сервера.
В ходе обсуждения специалисты часто упоминают, что классический FTP — протокол устаревший и небезопасный. Если ваш сервер поддерживает SSH, лучше использовать протокол SFTP. В платформе 1С работа с ним реализована через тот же объект FTPСоединение, начиная с версии 8.3.11.
Посмотрим на преимущества SFTP для работы в облаке:
Для активации SFTP в 1С достаточно в адресе сервера указать префикс sftp:// или использовать соответствующий конструктор.
Если в веб-клиенте мы получили ошибку отсутствия объекта, то в тонком клиенте, работающем через веб-сервер, ошибка может звучать как "Ошибка работы с Интернет". Проанализируем причины:
inetcfg.xml на стороне сервера, либо переданы в параметрах FTPСоединение.Если ваша обработка не работает в 1С:Фреш, выполните следующие шаги:
FTPСоединение и вызов метода Записать() происходят строго в серверном контексте (процедуры &НаСервере или модули объектов).ПассивныйРежим в значение Истина.ПотокВПамяти.Соблюдение этих правил позволит создать надежный механизм обмена данными, который будет стабильно работать как в локальных файловых базах, так и в высокозащищенных облачных сервисах.