Как реализовать выгрузку файлов по протоколу SFTP в 1С 8.2 и 8.3

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

Протокол SFTP (SSH File Transfer Protocol) является стандартом для безопасной передачи файлов, однако разработчики 1С долгое время сталкивались с отсутствием его нативной поддержки. В платформе 1С 8.2 и версиях 8.3 до релиза 8.3.16 объект FTPСоединение поддерживает только классический FTP и FTPS (FTP через SSL/TLS), что не позволяет напрямую подключаться к SSH-серверам. В этой статье мы подробно разберем, как обойти это ограничение, используя проверенные инструменты и интеграции.

Метод 1. Использование внешней утилиты WinSCP (Scripting)

Одним из самых надежных и популярных способов реализации SFTP-обмена является использование бесплатной утилиты WinSCP. Мы рассмотрим вариант, при котором исполняемый файл утилиты хранится прямо внутри базы 1С, что избавляет от необходимости предварительной установки ПО на всех серверах или рабочих станциях.

Разберем алгоритм работы по шагам:

  1. Создадим в конфигурации ОбщийМакет с типом "Двоичные данные" и загрузим в него портативную версию winscp.exe.
  2. Напишем код, который будет извлекать этот файл во временный каталог перед использованием.
  3. Сформируем текстовый файл сценария (скрипт), который WinSCP выполнит для передачи данных.
  4. Запустим приложение и проанализируем результат.

Рассмотрим пример кода для реализации этой логики:


// 1. Извлечение WinSCP из макета
ПутьWinSCP = ПолучитьИмяВременногоФайла("exe");
МакетWinSCP = ПолучитьОбщийМакет("WinSCPexe");
МакетWinSCP.Записать(ПутьWinSCP);

// 2. Формирование текста сценария
// НастройкиПодключения - структура с параметрами Сервер, Логин, Пароль, Порт
// ПутьКФайлу - путь к локальному файлу для отправки
// ПутьНазначения - путь на SFTP сервере

ТекстСценария = "option batch abort
|option confirm off
|open sftp://" + НастройкиПодключения.Логин + ":" + НастройкиПодключения.Пароль + "@" + НастройкиПодключения.Сервер + ":" + НастройкиПодключения.Порт + " -hostkey=*
|put """ + ПутьКФайлу + """ """ + ПутьНазначения + """
|exit";

ИмяФайлаСценария = ПолучитьИмяВременногоФайла("txt");
ФайлСценария = Новый ТекстовыйДокумент;
ФайлСценария.УстановитьТекст(ТекстСценария);
ФайлСценария.Записать(ИмяФайлаСценария, КодировкаТекста.UTF8);

// 3. Формирование команды запуска
ИмяФайлаЛога = ПолучитьИмяВременногоФайла("log");
Команда = """" + ПутьWinSCP + """ /console /script=""" + ИмяФайлаСценария + """" + " /log=""" + ИмяФайлаЛога + """";

// 4. Запуск приложения
ЗапуститьПриложение(Команда,, Истина); // Истина - ждать завершения

// 5. Очистка временных файлов
УдалитьФайлы(ПутьWinSCP);
УдалитьФайлы(ИмяФайлаСценария);

В этом примере мы используем параметр -hostkey=*. Это критически важный момент для работы в фоновых заданиях. По умолчанию SSH-клиент запрашивает подтверждение подлинности сервера при первом подключении. В интерактивном режиме пользователь может нажать "Да", но в регламентном задании процесс просто "зависнет" или завершится с ошибкой Host key wasn't verified. Использование звездочки позволяет автоматически принимать любой ключ хоста, что удобно, но снижает безопасность (защиту от MITM-атак).

Метод 2. Решение проблемы с проверкой ключа хоста (Host Key)

Если ваша политика безопасности запрещает использование -hostkey=*, необходимо заранее получить отпечаток (fingerprint) сервера. Проанализируем, как это сделать правильно:

  1. Подключитесь к серверу вручную через интерфейс WinSCP.
  2. Скопируйте отпечаток ключа из настроек соединения или окна подтверждения (например, ssh-rsa 2048 ...).
  3. Укажите его в скрипте вместо звездочки: -hostkey="ssh-rsa 2048 xxxxxxxxx...".

Также обратите внимание на команду option confirm off. В режиме скриптов (флаг /script) она обычно установлена в значение off по умолчанию, но явное указание гарантирует, что программа не будет запрашивать подтверждение на перезапись файлов или другие действия.

Метод 3. Переход на нативные средства (для 1С 8.3.16 и выше)

Если у вас есть возможность использовать платформу 8.3.16 или более свежую, мы рекомендуем отказаться от внешних утилит в пользу штатного объекта FTPСоединение. Начиная с этой версии, 1С официально поддерживает SFTP.

Посмотрим на пример создания такого соединения:


// В новых версиях платформы достаточно указать протокол в адресе или использовать порт 22
АдресСервера = "sftp://sftp.example.com";
Порт = 22;
Соединение = Новый FTPСоединение(АдресСервера, Порт, Логин, Пароль,, Истина); // Истина для пассивного режима (если применимо)

// После создания соединения работа с методами .Установить() и .Получить() идентична обычному FTP
Соединение.Установить(ПутьКЛокальномуФайлу, ПутьНаСервере);

Преимущество этого метода в том, что он работает на всех операционных системах (включая Linux) и не требует манипуляций с временными файлами winscp.exe.

Метод 4. Интеграция через WinSCP .NET Assembly

Для более продвинутых разработчиков существует вариант использования WinSCPnet.dll. Это позволяет работать с SFTP как с COM-объектом. Выясним, почему это может быть удобнее:

Пример инициализации COM-объекта:


Попытка
    Сессия = Новый COMОбъект("WinSCP.Session");
    ПараметрыСессии = Новый COMОбъект("WinSCP.SessionOptions");
    ПараметрыСессии.Protocol = 1; // 1 соответствует SFTP
    ПараметрыСессии.HostName = "server.com";
    ПараметрыСессии.UserName = "user";
    ПараметрыСессии.Password = "password";
    ПараметрыСессии.SshHostKeyFingerprint = "ssh-rsa 2048 ...";
    
    Сессия.Open(ПараметрыСессии);
    // Выполнение операций...
    Сессия.Dispose();
Исключение
    Сообщить("Ошибка подключения: " + ОписаниеОшибки());
КонецПопытки

Особенности работы в фоновом режиме

При запуске SFTP-обмена через РегламентныеЗадания важно учитывать права пользователя, под которым запущена служба сервера 1С (обычно USR1CV8). Проанализируем возможные проблемы:

Подводя итог, можно сказать, что для старых систем 1С 8.2 использование WinSCP в режиме скриптов остается самым надежным "костылем", который при правильной настройке параметров -hostkey и /ini=nul работает стабильно годами.

← На главную