При разработке дополнительных отчетов и обработок для облачных сервисов (таких как 1С:Фреш или 1С:УНФ в облаке) разработчики часто сталкиваются с жесткими ограничениями: база данных запускается через веб-клиент, прямое интерактивное открытие внешних файлов через системное меню заблокировано, а все внешние модули подключаются через подсистему БСП «Дополнительные отчеты и обработки» и выполняются строго в безопасном режиме.
В таких условиях стандартная попытка создать объект FTPСоединение приводит к системным ошибкам платформы. Разберем по шагам, почему возникают эти ошибки, как устроены ограничения веб-клиента и безопасного режима, а также как правильно настроить программный код обработки и декларацию разрешений БСП, чтобы успешно пройти аудит сервиса.
Проанализируем две ключевые причины, из-за которых стандартный код обмена файлами отказывается работать в облачной инфраструктуре:
FTPСоединение платформенно не поддерживается. Согласно синтакс-помощнику, создание объекта и его методы доступны только на стороне сервера, толстого клиента, тонкого клиента и внешнего соединения. Любые операции с FTP-сервером обязаны инициироваться исключительно в серверных процедурах и функциях (&НаСервере или &НаСервереБезКонтекста).Устаревший API (модули вроде ДополнительныеОтчетыИОбработкиВБезопасномРежиме) в актуальных версиях БСП выведен из эксплуатации. Вся работа с правами доступа к ресурсам операционной системы и сети переведена на модуль РаботаВБезопасномРежиме.
Чтобы внешняя обработка смогла работать с сетевым FTP-ресурсом и сохранять промежуточные файлы на диск сервера, эти привилегии необходимо явно запросить в функции СведенияОВнешнейОбработке() в модуле объекта обработки.
Разберем, какие разрешения являются обязательными:
РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса() принимает протокол ("FTP" или "FTPS"), имя хоста без служебных префиксов и номер порта числом.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С.ПолучитьИмяВременногоФайла().FTPСоединение.Записать() и затем удаляет локальный файл.Проанализируем важные детали, на которые обращают внимание администраторы сервиса при аудите кода:
C:\), COM-соединения или специфические утилиты ОС. Для формирования путей следует применять исключительно штатный метод платформы ПолучитьИмяВременногоФайла().ДлительныеОперации.Если согласование сетевых разрешений для FTP вызывает сложности у службы поддержки облака, рассмотрим альтернативные варианты интеграции:
HTTPСоединение проходит аудит быстрее. Протокол HTTPS избавлен от проблем пассивных динамических портов, характерных для FTP, и безопаснее для облачных сред.