Переход серверной части 1С:Предприятие на операционные системы семейства Linux ставит перед разработчиками серьезную задачу: как заменить привычные инструменты Windows, такие как COM-объекты WinSCP или библиотеки Microsoft. Одной из наиболее частых проблем является работа с протоколом SFTP (SSH File Transfer Protocol). В отличие от обычного FTP, встроенный объект 1С FTPСоединение на текущий момент не поддерживает работу через SSH-туннель. В данной статье мы подробно разберем, как обойти это ограничение, используя возможности среды Linux.
Рассмотрим стандартный механизм 1С. Объект FTPСоединение отлично справляется с протоколами FTP и FTPS (FTP через SSL/TLS). Однако SFTP — это принципиально другой протокол, работающий поверх SSH. Программисты, привыкшие в среде Windows использовать конструкцию Новый COMОбъект("WinSCP.Session"), при переходе на Linux обнаруживают, что COM-технология там отсутствует. Нам необходимо найти альтернативные способы, которые позволят программно отправлять и получать файлы, контролируя результат операции.
Утилита lftp является одним из самых мощных и гибких инструментов в Linux для работы с файловыми протоколами. Она поддерживает многопоточность, докачку и, что самое важное, сценарии (скрипты). Проанализируем, как можно интегрировать её в код 1С. Основная идея заключается в формировании текстового файла с командами и его выполнении через ЗапуститьПриложение.
Разберем пример создания скрипта для lftp:
// Формируем текст скрипта для передачи файла
ТекстСкрипта = "set sftp:auto-confirm yes;
|open sftp://user:password@server_address;
|put /home/usr1cv8/export/data.xml -o /remote/path/data.xml;
|bye;";
// Записываем скрипт во временный файл
ИмяФайлаСкрипта = ПолучитьИмяВременногоФайла("txt");
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.УстановитьТекст(ТекстСкрипта);
ТекстовыйДокумент.Записать(ИмяФайлаСкрипта, КодировкаТекста.ANSI);
// Выполняем команду через lftp
КомандаЗапуска = "lftp -f " + ИмяФайлаСкрипта;
КодВозврата = 0;
ЗапуститьПриложение(КомандаЗапуска, , Истина, КодВозврата);
Если КодВозврата = 0 Тогда
Сообщить("Файл успешно передан!");
Иначе
Сообщить("Ошибка при передаче. Код ошибки: " + КодВозврата);
КонецЕсли;
Параметр set sftp:auto-confirm yes критически важен при первом подключении, чтобы система не запрашивала подтверждение SSH-ключа в интерактивном режиме, который в фоновом задании 1С просто «повиснет».
Проанализируем альтернативу в виде curl. Эта утилита предустановлена почти в каждом дистрибутиве Linux. Если она собрана с поддержкой libssh2, то работа с SFTP становится предельно простой. Выясним, как составить команду для загрузки файла на сервер.
// Пример команды curl для отправки файла по SFTP
// -u задает пользователя и пароль
// -T указывает локальный файл для отправки
// -k игнорирует проверку ключа (использовать осторожно!)
КомандаCurl = "curl -u user:password sftp://server_address/remote/path/ -T /local/path/file.txt -k";
КодВозврата = 0;
ЗапуститьПриложение(КомандаCurl, , Истина, КодВозврата);
Если КодВозврата <> 0 Тогда
// Обработка ошибки
КонецЕсли;
Преимущество curl в том, что нам не нужно создавать промежуточный файл скрипта, всю команду можно передать одной строкой. Однако передача пароля в открытом виде в строке команды может быть небезопасной, так как он может отобразиться в списке процессов системы.
Рассмотрим наиболее надежный и профессиональный способ работы в Linux — отказ от паролей в пользу SSH-ключей. Это исключает необходимость хранить пароли в коде 1С и решает проблему интерактивных запросов. Процесс настройки выглядит следующим образом:
usr1cv8), используя команду ssh-keygen.id_rsa.pub) на удаленный SFTP-сервер в файл authorized_keys.scp или sftp не будет запрашивать пароль.Посмотрим, как упрощается код в 1С при использовании scp и ключей:
// Копирование файла через scp без пароля
ПутьКЛокальномуФайлу = "/home/usr1cv8/data.json";
АдресСервера = "user@remote-host:/remote/directory/";
КомандаSCP = "scp -i /home/usr1cv8/.ssh/id_rsa " + ПутьКЛокальномуФайлу + " " + АдресСервера;
ЗапуститьПриложение(КомандаSCP, , Истина, КодВозврата);
Использование флага -i позволяет явно указать путь к приватному ключу, если он отличается от стандартного.
Поскольку в Linux Python доступен «из коробки», мы можем написать небольшой скрипт на Python, использующий библиотеку Paramiko. 1С будет вызывать этот скрипт, передавая ему параметры. Этот метод хорош тем, что Python позволяет вернуть детальное описание ошибки обратно в 1С через стандартный поток вывода.
Пример вызова Python-скрипта из 1С:
ПутьКПутону = "/usr/bin/python3";
ПутьКСкрипту = "/home/usr1cv8/scripts/sftp_transfer.py";
ПараметрыСкрипта = "--server " + Сервер + " --user " + Логин + " --file " + Файл;
ЗапуститьПриложение(ПутьКПутону + " " + ПутьКСкрипту + " " + ПараметрыСкрипта, , Истина, КодВозврата);
Разберем еще одну интересную возможность Linux — монтирование удаленной папки SFTP в локальную файловую систему сервера с помощью SSHFS. В этом случае удаленный ресурс будет выглядеть для 1С как обычная папка на диске. Мы сможем использовать стандартные команды 1С, такие как КопироватьФайл() или НайтиФайлы().
После того как системный администратор настроит монтирование, работа в 1С сведется к следующему:
// Удаленный сервер примонтирован в папку /mnt/sftp_remote
ЛокальныйПуть = "/home/usr1cv8/output/report.pdf";
СетевойПуть = "/mnt/sftp_remote/reports/report.pdf";
Попытка
КопироватьФайл(ЛокальныйПуть, СетевойПуть);
Сообщить("Файл успешно скопирован через SSHFS");
Исключение
Сообщить("Ошибка копирования: " + ОписаниеОшибки());
КонецПопытки;
При работе с внешними утилитами крайне важно правильно обрабатывать результат выполнения. Метод ЗапуститьПриложение возвращает код завершения процесса. Выясним основные правила его интерпретации:
Рекомендуется перенаправлять поток ошибок в текстовый файл, чтобы в случае неудачи можно было прочитать причину. Например: curl ... 2> /tmp/error.log. Затем в блоке обработки ошибок в 1С можно прочитать содержимое этого файла и вывести его в журнал регистрации.
Несмотря на отсутствие прямой поддержки SFTP в 1С под Linux, операционная система предоставляет богатый выбор инструментов для решения этой задачи. Мы проанализировали использование lftp, curl, scp и sshfs. Выбор конкретного метода зависит от требований безопасности вашей организации (пароли или ключи) и необходимости детального логирования процесса. Наиболее стабильным и современным вариантом для промышленной эксплуатации является использование SSH-ключей в сочетании с утилитами scp или lftp. В качестве альтернативы ручной настройке консольных утилит можно использовать готовый модуль для обмена файлами и данными между 1С и внешними системами.