Как реализовать обмен с FTP в 1С из веб-клиента и облака в безопасном режиме?

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

При разработке дополнительных отчетов и обработок для облачных сервисов (таких как 1С:Фреш или 1С:УНФ в облаке) разработчики часто сталкиваются с жесткими ограничениями: база данных запускается через веб-клиент, прямое интерактивное открытие внешних файлов через системное меню заблокировано, а все внешние модули подключаются через подсистему БСП «Дополнительные отчеты и обработки» и выполняются строго в безопасном режиме.

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

Ограничения платформы: веб-клиент и безопасный режим

Проанализируем две ключевые причины, из-за которых стандартный код обмена файлами отказывается работать в облачной инфраструктуре:

  1. Недоступность FTPСоединение на клиенте: В веб-клиенте (браузере) объект FTPСоединение платформенно не поддерживается. Согласно синтакс-помощнику, создание объекта и его методы доступны только на стороне сервера, толстого клиента, тонкого клиента и внешнего соединения. Любые операции с FTP-сервером обязаны инициироваться исключительно в серверных процедурах и функциях (&НаСервере или &НаСервереБезКонтекста).
  2. Изоляция безопасного режима: При работе в модели сервиса внешние обработки запускаются под управлением профилей безопасности кластера серверов 1С. В безопасном режиме платформой полностью заблокированы: обращение к файловой системе сервера, вызов внешних компонент и COM-объектов, а также сетевые соединения по внешним IP-адресам и портам, если на них не выданы явные разрешения.

Устаревший API (модули вроде ДополнительныеОтчетыИОбработкиВБезопасномРежиме) в актуальных версиях БСП выведен из эксплуатации. Вся работа с правами доступа к ресурсам операционной системы и сети переведена на модуль РаботаВБезопасномРежиме.

Пошаговое решение: декларирование разрешений через БСП

Чтобы внешняя обработка смогла работать с сетевым FTP-ресурсом и сохранять промежуточные файлы на диск сервера, эти привилегии необходимо явно запросить в функции СведенияОВнешнейОбработке() в модуле объекта обработки.

Разберем, какие разрешения являются обязательными:

  1. Разрешение на использование интернет-ресурса: Открывает сетевой доступ к конкретному хосту и порту. Метод РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса() принимает протокол ("FTP" или "FTPS"), имя хоста без служебных префиксов и номер порта числом.
  2. Разрешение на работу с каталогом временных файлов: Методы объекта FTPСоединение (такие как Записать() и Получить()) оперируют физическими путями файлов на диске. Поэтому обработке необходимо право на запись и чтение во временной папке сервера через РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаВременныхФайлов().

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


Функция СведенияОВнешнейОбработке() Экспорт

    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
    ПараметрыРегистрации.Версия = "1.0";
    ПараметрыРегистрации.БезопасныйРежим = Истина;
    
    // Регистрируем команду
    НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
    НоваяКоманда.Представление = НСтр("ru = 'Выполнить обмен с FTP'");
    НоваяКоманда.Идентификатор = "ВыполнитьОбменСФТП";
    НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
    НоваяКоманда.ПоказыватьОповещение = Истина;
    
    // Формируем список разрешений для безопасного режима
    Разрешения = Новый Массив;
    
    // Разрешение на сетевой доступ к FTP
    ХостFTP = "ftp.myserver.ru";
    ПортFTP = 21;
    Разрешения.Добавить(
        РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса("FTP", ХостFTP, ПортFTP, "Синхронизация данных через FTP")
    );
    
    // Разрешение на создание и чтение временных файлов на сервере
    Разрешения.Добавить(
        РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаВременныхФайлов(Истина, Истина, "Хранение промежуточных файлов обмена")
    );
    
    ПараметрыРегистрации.Разрешения = Разрешения;
    
    Возврат ПараметрыРегистрации;

КонецФункции

Реализация серверного кода для передачи и получения файлов

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

Разберем программную реализацию:


Процедура ВыполнитьОбменСФТП() Экспорт

    Хост = "ftp.myserver.ru";
    Порт = 21;
    Пользователь = "ftp_user";
    Пароль = "ftp_password";
    
    // Инициализируем соединение в пассивном режиме
    FTP = Новый FTPСоединение(Хост, Порт, Пользователь, Пароль, , Истина);
    
    // Формируем локальный временный файл на сервере
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла("txt");
    
    ЗаписьТекста = Новый ЗаписьТекста(ИмяВременногоФайла, КодировкаТекста.UTF8);
    ЗаписьТекста.ЗаписатьСтроку("Пример выгружаемых данных из 1С");
    ЗаписьТекста.Закрыть();
    
    Попытка
        // Отправляем файл на FTP-сервер
        FTP.Записать(ИмяВременногоФайла, "upload/data.txt");
        
        // Удаляем временный файл с диска сервера после успешной отправки
        УдалитьФайлы(ИмяВременногоФайла);
    Исключение
        // Обязательно очищаем временные файлы в блоке обработки ошибок
        Если НайтиФайлы(ИмяВременногоФайла).Количество() > 0 Тогда
            УдалитьФайлы(ИмяВременногоФайла);
        КонецЕсли;
        ВызватьИсключение;
    КонецПопытки;

КонецПроцедуры

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

  1. На клиенте вызывается асинхронный метод НачатьПомещениеФайлаНаСервер(), который передает файл из веб-браузера во временное хранилище 1С.
  2. Серверный метод считывает двоичные данные из временного хранилища, сохраняет их во временный файл через ПолучитьИмяВременногоФайла().
  3. Сервер вызывает FTPСоединение.Записать() и затем удаляет локальный файл.

Подводные камни при прохождении аудита в облаке

Проанализируем важные детали, на которые обращают внимание администраторы сервиса при аудите кода:

  1. Статические адреса серверов: Разрешение БСП привязывается к строго фиксированному адресу хоста и порту. Если адрес FTP-сервера пользователь вводит вручную на форме обработки, провайдер отклонит обработку, поскольку динамическое создание разрешений снижает безопасность облачной среды.
  2. Особенности операционной системы Linux: Большинство серверов облачных провайдеров работают под управлением ОС Linux. Недопустимо использовать жестко прописанные пути к файлам в стиле Windows (обратные слэши, диски C:\), COM-соединения или специфические утилиты ОС. Для формирования путей следует применять исключительно штатный метод платформы ПолучитьИмяВременногоФайла().
  3. Таймауты серверных вызовов: Синхронная передача файлов большого объема по протоколу FTP может превысить таймаут веб-клиента или регламентного вызова. В таких случаях передачу данных следует выносить в фоновое задание с помощью ДлительныеОперации.

Альтернативные архитектурные подходы

Если согласование сетевых разрешений для FTP вызывает сложности у службы поддержки облака, рассмотрим альтернативные варианты интеграции:

  1. Переход на HTTP/HTTPS REST API или WebDAV: Работа по портам 80/443 через объект платформы HTTPСоединение проходит аудит быстрее. Протокол HTTPS избавлен от проблем пассивных динамических портов, характерных для FTP, и безопаснее для облачных сред.
  2. Промежуточный веб-шлюз: Создается внешний микросервис вне облака 1С, принимающий файлы от базы по HTTPS и перенаправляющий их на целевой FTP-сервер. В этом случае обработке требуется всего одно стандартное разрешение на безопасный веб-ресурс.
  3. Инверсия обмена: Инициатива по передаче данных переносится на внешнюю сторону. Внешний скрипт на стороне FTP-сервера подключается к 1С через стандартный интерфейс OData или опубликованный HTTP-сервис конфигурации, забирает или передает данные самостоятельно, что полностью исключает необходимость настройки сетевых прав во внешней обработке.
← На главную