Настройка SFTP соединения в 1С (SSH-ключи и WinSCP COM)
Протоколы передачи и ограничения платформы
Для обмена банковскими выписками (DirectBank), реестрами зарплатных проектов или EDI-сообщениями современные контрагенты требуют использования защищенного протокола SFTP (SSH File Transfer Protocol), который работает через 22 порт с шифрованием. Исторически (до версии 8.3.22) платформа 1С:Предприятие "из коробки" поддерживала только FTP (порт 21) и FTPS (FTP over SSL/TLS). Попытки подключиться к SFTP-серверу штатным объектом FTPСоединение приводили к таймаутам или ошибке «Ошибка инициализации SSL соединения». Бизнес-риски: невозможность наладить B2B обмены с корпоративными партнерами (банки, маркетплейсы), требующими строгих стандартов ИБ.
Различия протоколов для обмена 1С
| Протокол | Порт | Шифрование | Поддержка в 1С |
|---|---|---|---|
| FTP | 21 | Нет (Открытый текст) | Нативно (С древних версий) |
| FTPS (FTP/SSL) | 21 / 990 | SSL/TLS (Сертификаты X.509) | Нативно (Параметр ЗащищенноеСоединение) |
| SFTP | 22 | SSH (Криптоключи RSA/Ed25519) | Нативно только с платформы 8.3.22! В старых - через COM (WinSCP). |
Алгоритмы реализации SFTP в 1С
Сценарий 1: Нативная реализация (Только для платформы >= 8.3.22)
В новых релизах 1С добавлена полноценная поддержка SFTP и аутентификации по закрытому ключу SSH (Private Key).
Подключение по SFTP средствами 1С 8.3.22+
ПараметрыСоединения = Новый ПараметрыСоединенияSFTP();
ПараметрыСоединения.КлючХоста = "...хеш отпечатка..."; // Опционально для валидации сервера
// Настройка авторизации по закрытому ключу (если пароль не используется)
КлючSSH = Новый ЗащищенныйКлючSSH(Новый Файл("C:\keys\private.pem"), "ПарольКлючаЕслиЕсть");
Аутентификация = Новый АутентификацияСекретнымКлючомSSH(КлючSSH);
// Создаем соединение (порт 22, протокол SFTP)
ФТП = Новый FTPСоединение("sftp.partner.com", 22, "LoginUser", "", , , , , ПараметрыСоединения, Аутентификация);
ФТП.Записать("C:\temp\data.xml", "/upload/data.xml");Сценарий 2: Использование COM-объекта WinSCP (Для старых версий 1С)
Если обновление платформы невозможно, стандартом де-факто является использование бесплатной библиотеки WinSCP (.NET сборка COM-visible).
1. Установите WinSCP и зарегистрируйте сборку (CMD от Администратора):
%WINDIR%\Microsoft.NET\Framework64\v4.0.30319\regasm.exe WinSCPnet.dll /codebase /tlb:WinSCPnet.tlb
2. Код 1С для вызова COM-объекта
Опции = Новый COMОбъект("WinSCP.SessionOptions");
Опции.Protocol = 3; // 3 = SFTP
Опции.HostName = "sftp.partner.com";
Опции.UserName = "LoginUser";
Опции.SshHostKeyFingerprint = "ssh-rsa 2048 xxxxxxxxxxx...";
Опции.SshPrivateKeyPath = "C:\keys\private.ppk";
Сессия = Новый COMОбъект("WinSCP.Session");
Сессия.Open(Опции);
Сессия.PutFiles("C:\temp\data.xml", "/upload/");
Сессия.Dispose();Типовые ошибки программистов 1С
- Попытка подключиться к SFTP (порт 22) через FTPS (FTPS over TLS): Это абсолютно разные протоколы (SSH vs SSL/TLS). На старых платформах код
Новый FTPСоединение(..., Новый ЗащищенноеСоединениеOpenSSL())на 22 порт выдаст сетевую ошибку. - Формат закрытого ключа: WinSCP принимает только ключи в формате
.ppk(PuTTY Private Key). Платформа 1С 8.3.22 нативно ожидает ключи в формате OpenSSH / PEM. Если вам дали ключid_rsa, а вы используете WinSCP — нужно конвертировать его через утилиту PuTTYgen.
Разработчики ITSTM реализуют любые B2B интеграции (SFTP, REST/SOAP API, AS2) даже на сильно кастомизированных конфигурациях 1С (УПП, УТ 10.3) без необходимости рискованного обновления технологической платформы.
Частые вопросы (FAQ)
Как получить отпечаток ключа хоста (SshHostKeyFingerprint) для WinSCP?
Подключитесь к SFTP серверу вручную через графический клиент WinSCP. При первом подключении появится окно с предупреждением и отпечатком ключа (например, ssh-ed25519 255 ...). Скопируйте эту строку в ваш код 1С.
Можно ли использовать curl через КомандаСистемы() для SFTP?
Да. Это альтернатива COM-объекту, работающая и на Linux-серверах 1С. Команда выглядит так: curl -T 'file.xml' sftp://server.com/upload/ --user 'login:password' -k. Но парсить ошибки (ExitCode) придется через чтение stdout из временных файлов.
Почему COM-объект WinSCP работает на клиенте, но выдает ошибку на сервере (в фоновом задании)?
Библиотека WinSCPnet.dll должна быть зарегистрирована на самом сервере 1С (где крутится процесс rphost), причем если сервер 64-битный, нужно использовать 64-битный regasm.exe. Также у пользователя USR1CV8 (от которого работает служба) должны быть права NTFS на чтение файла закрытого ключа.
Поддерживает ли 1С аутентификацию на SFTP только по паролю, без ключей?
Да, поддерживает (с 8.3.22). В этом случае объект ЗащищенныйКлючSSH создавать не нужно. Достаточно передать логин и пароль в стандартные параметры конструктора FTPСоединение, а параметр Аутентификация оставить пустым.