При организации интеграции с внешними системами разработчики часто сталкиваются с задачей обмена данными по защищенному протоколу SFTP. Выясним причину, почему штатные объекты платформы не подходят для этой задачи, разберем текущее состояние поддержки SFTP в платформе 8.3.27 и рассмотрим проверенные способы реализации обмена.
Проанализируем частую путаницу: в платформе «1С:Предприятие» существует стандартный объект FTPСоединение, поддерживающий параметр ЗащищенноеСоединение. Однако важно понимать техническую разницу протоколов:
FTPСоединение.FTPСоединение или HTTPСоединение работать с ним не умеет.В релизах платформы 8.3.27 встроенная объектная модель для прикладного кода не расширилась: отдельного объекта для работы с SFTP в режиме «1С:Предприятие» по-прежнему нет. Протокол SSH/SFTP в платформе задействован исключительно как служебный транспорт для режима агента конфигуратора. Объекты вроде СоединениеSftp присутствуют в смежных продуктах экосистемы (например, в «1С:Исполнителе» или «1С:Шине»), но не во встроенном языке конфигураций 1С. Поэтому для решения задачи передачи данных по SFTP разработчику необходимо использовать проверенные внешние инструменты.
Рассмотрим наиболее универсальный и кроссплатформенный вариант. Утилита curl встроена по умолчанию в современные операционные системы Windows (начиная с Windows 10 и Server 2019), а также присутствует практически во всех дистрибутивах Linux. Она поддерживает протокол SFTP без необходимости установки дополнительного ПО.
Посмотрим на пример отправки файла на сервер через запуск внешней команды:
Команда = "curl -k -u ""логин:пароль"" -T ""C:\Exchange\out.xml"" ""sftp://sftp.example.com:22/upload/""";
ЗапуститьПриложение(Команда, , Истина);
Разберем по шагам параметры вызова:
-u передает учетные данные пользователя.-T указывает путь к локальному файлу, который необходимо отправить на сервер.-k (или --insecure) позволяет пропустить проверку известного ключа хоста, если он не сохранен в системе.ЗапуститьПриложение(), установленный в Истина, заставляет платформу синхронно ожидать завершения работы процесса.Для ОС Windows стандартом де-факто является утилита WinSCP. Рассмотрим два основных сценария интеграции с ней.
Сценарий 1: Генерация командного файла для консольного клиента winscp.com
Этот способ надежен тем, что не требует регистрации COM-компонент в операционной системе. Разберем реализацию: сформируем текстовый скрипт с набором команд, после чего запустим консольный клиент с указанием файла сценария.
ФайлСкрипта = "C:\Exchange\script.txt";
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.ДобавитьСтроку("open sftp://user:password@sftp.example.com -hostkey=""*""");
ТекстовыйДокумент.ДобавитьСтроку("put C:\Exchange\data.xml /remote/path/");
ТекстовыйДокумент.ДобавитьСтроку("exit");
ТекстовыйДокумент.Записать(ФайлСкрипта, КодировкаТекста.ANSI);
КомандаЗапуска = """C:\Program Files (x86)\WinSCP\WinSCP.com"" /script=""" + ФайлСкрипта + """ /log=""C:\Exchange\winscp.log""";
КодВозврата = 0;
ЗапуститьПриложение(КомандаЗапуска, , Истина, КодВозврата);
Если КодВозврата <> 0 Тогда
// Обработка ошибки выполнения передачи
КонецЕсли;
Сценарий 2: Использование .NET сборки через COM-объект
Для более гибкого управления процессом передачи можно использовать библиотеку WinSCPnet.dll, предварительно зарегистрировав ее через утилиту regasm. Это позволяет программно обрабатывать события передачи, перехватывать исключения и не сохранять пароли в открытых текстовых файлах скриптов.
Рассмотрим альтернативный архитектурный подход: подключение удаленного SFTP-каталога в операционной системе в качестве сетевого диска или точки монтирования. В среде Linux это легко реализуется стандартной утилитой sshfs, а в среде Windows — сторонними драйверами файловой системы.
Главное преимущество этого способа: в коде 1С не требуется вызывать внешние процессы или сетевые утилиты. Работа с файлами ведется стандартными методами платформы:
ПутьКФайлу = "/mnt/sftp_share/orders.xml";
Если ФайлСуществует(ПутьКФайлу) Тогда
КопироватьФайл(ПутьКФайлу, "C:\LocalExchange\orders.xml");
УдалитьФайлы(ПутьКФайлу);
КонецЕсли;
При переносе кода в фоновые и регламентные задания проанализируем важные системные нюансы:
usr1cv8). У этого пользователя должны быть достаточные права на запуск внешних утилит и доступ к временным каталогам.ЗапуститьПриложение() и вызовы внешних программ должны быть явно разрешены в настройках профиля.known_hosts. В фоновом задании интерактивный ввод невозможен, из-за чего процесс зависнет. Обязательно передавайте ключ хоста в параметрах подключения либо заранее сохраняйте отпечаток сервера в профиле учетной записи службы 1С.