В современной практике обмена данными использование протокола SFTP (SSH File Transfer Protocol) является стандартом безопасности. Часто внешние контрагенты или крупные аналитические системы (например, такие как Nielsen) требуют использования авторизации не по обычному паролю, а по приватному ключу. В среде 1С (особенно в старых версиях, таких как 8.1 или 8.2, а также в обычных формах 8.3) стандартных механизмов для работы с SFTP может быть недостаточно. В таких случаях на помощь приходит библиотека WinSCP .NET Assembly.
В данной статье мы подробно разберем, как реализовать подключение по ключу и как справиться с распространенной проблемой, когда файлы загружаются на сервер с расширением .filepart, но не переименовываются в оригинальные из-за ограничений прав доступа.
Прежде чем писать код в 1С, нам необходимо убедиться, что библиотека WinSCP готова к работе. Рассмотрим основные моменты подготовки:
WinSCPnet.dll является COM-видимой сборкой .NET. Чтобы 1С могла создать объект Новый COMОбъект("WinSCP.SessionOptions"), ее нужно зарегистрировать в системе с помощью утилиты regasm.exe. Важно помнить, что если ваша 1С 32-битная, то и регистрацию нужно проводить через 32-битную версию regasm, находящуюся в папке C:\Windows\Microsoft.NET\Framework\v4.0.30319\.WinSCPnet.dll — это всего лишь оболочка. Для ее работы файл WinSCP.exe должен находиться в той же папке, где лежит сама библиотека.-----BEGIN RSA PRIVATE KEY-----), его необходимо предварительно конвертировать в .ppk с помощью утилиты PuTTYgen.Проанализируем ситуацию, когда нам нужно передать параметры авторизации. Для этого используется объект SessionOptions. Рассмотрим основные свойства, которые необходимо заполнить для успешного входа по ключу.
Основная ошибка новичков заключается в попытке передать путь к ключу в поле пароля или использовании неверного отпечатка сервера (Fingerprint). Выясним, как правильно инициализировать параметры:
// Создаем объект параметров сессии
ПараметрыСессии = Новый COMОбъект("WinSCP.SessionOptions");
// Основные настройки хоста
ПараметрыСессии.Protocol = 1; // Протокол SFTP
ПараметрыСессии.HostName = "example.com";
ПараметрыСессии.UserName = "sftp_user";
// Авторизация по ключу
// Пароль оставляем пустым, если ключ не защищен парольной фразой
ПараметрыСессии.Password = "";
ПараметрыСессии.SshPrivateKeyPath = "C:\Keys\my_private_key.ppk";
// Указываем отпечаток сервера (Fingerprint)
// Это необходимо для проверки подлинности сервера при первом подключении
ПараметрыСессии.SshHostKeyFingerprint = "ssh-rsa 2048 xxxxxxx...";
Если вы не знаете SshHostKeyFingerprint, проще всего один раз подключиться к этому серверу через графический интерфейс программы WinSCP. При первом входе программа выдаст предупреждение и покажет строку отпечатка, которую можно просто скопировать в код.
Часто после успешного соединения возникает проблема: файл копируется на сервер, но остается там с расширением .filepart. При этом 1С выдает исключительную ситуацию: "Передача завершена, но не удаётся переименовать временный файл. Код ошибки: 4, Permission Denied".
Проанализируем причину. По умолчанию WinSCP загружает файлы под временным именем, чтобы в случае обрыва связи можно было докачать файл (Resume Support). После завершения загрузки программа пытается выполнить команду Rename. Однако на многих защищенных SFTP-серверах (например, серверах Nielsen или облачных S3-шлюзах) пользователю разрешена только запись, но запрещено переименование или удаление. В этом случае сервер блокирует попытку превратить file.zip.filepart в file.zip.
Чтобы решить эту проблему, нам нужно изменить параметры передачи файлов (TransferOptions). Рассмотрим, как это сделать:
// Создаем объект настроек передачи
НастройкиПередачи = Новый COMОбъект("WinSCP.TransferOptions");
// Режим передачи: 0 - Binary, 1 - Ascii, 2 - Automatic
НастройкиПередачи.TransferMode = 0;
// Самый важный параметр: отключаем поддержку докачки (Resume Support)
// State = 2 соответствует значению "Off" (Отключено)
НастройкиПередачи.ResumeSupport.State = 2;
// Также можно отключить использование временного имени файла напрямую
// (в новых версиях библиотеки)
// НастройкиПередачи.TemporaryTransferFile = 0; // Disabled
Теперь соберем все части воедино и разберем полный цикл работы: создание сессии, подключение, загрузка файла с правильными опциями и закрытие соединения.
Процедура ЗагрузитьФайлНаSFTP(ПутьКЛокальномуФайлу, ПутьНаСервере)
Попытка
// Настройка сессии
Сессия = Новый COMОбъект("WinSCP.Session");
Опции = Новый COMОбъект("WinSCP.SessionOptions");
Опции.Protocol = 1; // SFTP
Опции.HostName = "sftp.nielsen.com";
Опции.UserName = "YourUser";
Опции.SshPrivateKeyPath = "C:\1C_Exchange\key.ppk";
Опции.SshHostKeyFingerprint = "ssh-rsa 2048 xx:xx:xx...";
// Настройка параметров передачи
НастройкиПередачи = Новый COMОбъект("WinSCP.TransferOptions");
НастройкиПередачи.ResumeSupport.State = 2; // Отключаем .filepart
// Открываем соединение
Сессия.Open(Опции);
// Выполняем загрузку
// Параметры PutFiles: (ЛокальныйПуть, ДистанционныйПуть, УдалятьПосле, Опции)
РезультатПередачи = Сессия.PutFiles(ПутьКЛокальномуФайлу, ПутьНаСервере, Ложь, НастройкиПередачи);
// Проверяем на ошибки
РезультатПередачи.Check();
Сообщить("Файл успешно загружен!");
Исключение
Сообщить("Ошибка при работе с SFTP: " + ОписаниеОшибки());
КонецПопытки;
// Всегда закрываем сессию
Если Сессия.Opened Тогда
Сессия.Close();
КонецЕсли;
КонецПроцедуры
Разберем несколько тонкостей, которые помогут избежать ошибок в будущем:
ResumeSupport файл не загружается, убедитесь, что у пользователя 1С есть права на чтение локального файла и права записи в целевую папку на сервере.Сессия.SessionLogPath = "C:\logs\winscp.log";. Это поможет увидеть детальный диалог между клиентом и сервером.WinSCP.exe и WinSCPnet.dll.Таким образом, мы выяснили, что для стабильной работы с SFTP в 1С через WinSCP ключевыми факторами являются правильный формат ключа (PPK), точное указание SshHostKeyFingerprint и обязательное управление объектом TransferOptions для обхода ограничений файловой системы сервера на переименование временных файлов.