Подключение к sftp из 1с
Первое что Вам нужно сделать - это установить бесплатную программу WinSCP, скачать ее Вы сможете здесь , также там есть вся необходимая литература по пользованию данной программы.
После того как Вы установили программу, Вам нужно добавить сессию, там все просто, прописываете узел, порт, логин и пароль к серверу.
Так же посоветую Вам вести логи данной программы, что бы потом можно было в любой момент посмотреть из-за чего не произошел обмен данными или проверять лог на успех или не успех синхронизации файлов. Для того что бы у Вас создавался лог нужно зайти на закладку «Журнализация» установить флажок записывать у файл и выбрать путь, имя файл советую сделать таким образом !S!Y!M!D.txt, это означает, что каждый день будет создаваться новый файл для лога с таким наименованием S – имя сессии, Y – год, M – месяц, D – день, то есть Вам потом будет намного удобнее считывать данные из логов.
Теперь приступим непосредственно к программирования в 1с и для этого нам нужно только знать основные команды WinSCP, весь список которых можно посмотреть на сайте программы. А я Вам приведу только те команды которые использовал я и которых на мой взгляд хватит для того что бы 1с успешно обменивалось данными с sFTP или FTPs серверами. Также я напишу что, зачем и в какой последовательности делал:
1. Перед тем как делать синхронизацию данных, нужно проверить есть ли вообще соединение с сервером, для этого мы делаем следующее:
ПроверимСоединение = """" + ПутьWinSCP + """" + " /console /command " + """option batch abort"" " + """open " + ПрофильWinSCP + """ " + " ""close"" ""exit""";
net = Новый COMОбъект("WScript.Shell");
2. После тога как мы выполнили предыдущую команду, настоятельно рекомендую делать следующее, искать по дате лог WinSCP и проверять его, не было ли ошибки в соединении, вариантов как это сделать много, но я делал так: с конца текста искал строку «Failed», до тех пор, пока не находил «Session name: " + ПрофильWinSCP», после этого поиск прерываем, ну и собственно если была обнаружена строка «Failed», то при подключении была ошибка.
3. Делаем синхронизацию файлов:
СтрокаСинхронизация = """" + ПутьWinSCP + """" + " /console /command " + """option batch abort"" " + """open " + ПрофильWinSCP + """ " + """synchronize both " + КаталогНаСервере1С + " " + КаталогНаSFTPСервере + """ " + """ close"" ""exit""";
net = Новый COMОбъект("WScript.Shell");
После этого снова проверяем лог.
Остальные команды которые могут Вам понадобится:
Запись файла на SFTP сервер:
СтрокаПрограммы = """" + ПутьWinSCP + """" + " /console /command " + """option batch abort"" " + """open " + ПрофильWinSCP + """ " + """put " + КаталогНаСервере1С + "\" +ИмяФайла + " " + КаталогНаSFTPСервере + "/" + ИмяФайла + """ " + """close"" ""exit""";
net = Новый COMОбъект("WScript.Shell");
Скопировать файл с SFTP сервера:
СтрокаПрограммы = """" + ПутьWinSCP + """" + " /console /command " + """option batch abort"" " + """open " + ПрофильWinSCP + """ " + """get " + КаталогНаSFTPСервере + "/" + ИмяФайлаСтр + " " + КаталогНаСервере1С + "\" + """ " + """close"" ""exit""";
net = Новый COMОбъект("WScript.Shell");
Получить список файлов на SFTP серверу и записать его в файл:
СтрокаПрограммы = "cmd.exe /c """"" + ПутьWinSCP + """ /console /command " + """option batch abort"" " + """open " + ПрофильWinSCP + """ " + """ls " + КаталогНаSFTPСервере + """""" + """ " + """ close""" + " > FMfiles.txt 2>&1" + """ " + """ exit""";
ЗапуститьПриложение(СтрокаПрограммы, ПутьКЛогам, Истина, КодВозврата);
Специальные предложения
Пытаюсь копировать файл с sftp на диск, но ничего не происходит. В логе непонятно, почему не копируется. Может кто подскажет?
. 2014-07-14 18:06:59.171 --------------------------------------------------------------------------
. 2014-07-14 18:06:59.171 WinSCP Версия 5.5.3 (сборка 4214) (OS 6.1.7601 Service Pack 1 - Windows 7 Professional)
. 2014-07-14 18:06:59.171 Configuration: HKEY_CURRENT_USER\Software\Martin Prikryl\WinSCP 2\
. 2014-07-14 18:06:59.172 Local account: REDIUS\telnov
. 2014-07-14 18:06:59.172 Working directory: D:\Рабочая папка
. 2014-07-14 18:06:59.172 Process ID: 2384
. 2014-07-14 18:06:59.172 Command-line: "C:\Program Files (x86)\WinSCP\winscp.exe" /console=553 /consoleinstance=_3252_323 "/console" "/command" "option batch abort" "open redius.sbp.ru@redius.spb.ru" "get /htdocs/.exchange/orders.csv D:\temp\" "close" "exit"
. 2014-07-14 18:06:59.172 Time zone: Current: GMT+4 (Азербайджанское время (зима)), No DST
. 2014-07-14 18:06:59.172 Warning: System option "Automatically adjust clock for Daylight Saving Time" is disabled, timestamps will not be represented correctly
. 2014-07-14 18:06:59.172 Login time: 14 Июль 2014 г. 18:06:59
. 2014-07-14 18:06:59.172 --------------------------------------------------------------------------
. 2014-07-14 18:06:59.172 Script: Retrospectively logging previous script records:
> 2014-07-14 18:06:59.172 Script: option batch abort
< 2014-07-14 18:06:59.172 Script: batch abort
> 2014-07-14 18:06:59.172 Script: open redius.sbp.ru@redius.spb.ru
. 2014-07-14 18:06:59.172 --------------------------------------------------------------------------
. 2014-07-14 18:06:59.172 Session name: redius.sbp.ru@redius.spb.ru (Modified site)
. 2014-07-14 18:06:59.172 Host name: redius.spb.ru (Port: 22)
. 2014-07-14 18:06:59.172 User name: redius.sbp.ru (Password: No, Key file: No)
. 2014-07-14 18:06:59.172 Tunnel: No
. 2014-07-14 18:06:59.172 Transfer Protocol: SFTP (SCP)
. 2014-07-14 18:06:59.172 Ping type: -, Ping interval: 30 sec; Timeout: 15 sec
. 2014-07-14 18:06:59.172 Proxy: none
. 2014-07-14 18:06:59.172 Send buffer: 262144
. 2014-07-14 18:06:59.172 SSH protocol version: 2; Compression: No
. 2014-07-14 18:06:59.172 Bypass authentication: No
. 2014-07-14 18:06:59.172 Try agent: Yes; Agent forwarding: No; TIS/CryptoCard: No; KI: Yes; GSSAPI: No
. 2014-07-14 18:06:59.172 Ciphers: aes,blowfish,3des,WARN,arcfour,des; Ssh2DES: No
. 2014-07-14 18:06:59.172 SSH Bugs: A,A,A,A,A,A,A,A,A,A
. 2014-07-14 18:06:59.172 Simple channel: Yes
. 2014-07-14 18:06:59.172 Return code variable: Autodetect; Lookup user groups: A
. 2014-07-14 18:06:59.172 Shell: default
. 2014-07-14 18:06:59.172 EOL: 0, UTF: 2
. 2014-07-14 18:06:59.172 Clear aliases: Yes, Unset nat.vars: Yes, Resolve symlinks: Yes
. 2014-07-14 18:06:59.172 LS: ls -la, Ign LS warn: Yes, Scp1 Comp: No
. 2014-07-14 18:06:59.172 SFTP Bugs: A,A
. 2014-07-14 18:06:59.172 SFTP Server: default
. 2014-07-14 18:06:59.172 Local directory: default, Remote directory: home, Update: Yes, Cache: Yes
. 2014-07-14 18:06:59.172 Cache directory changes: Yes, Permanent: Yes
. 2014-07-14 18:06:59.172 DST mode: 1; Timezone offset: 0h 0m
. 2014-07-14 18:06:59.172 --------------------------------------------------------------------------
. 2014-07-14 18:06:59.172 Looking up host "redius.spb.ru"
. 2014-07-14 18:06:59.186 Connecting to 84.204.252.3 port 22
. 2014-07-14 18:06:59.205 Server version: SSH-2.0-OpenSSH_6.1_hpn13v11 FreeBSD-20120901
. 2014-07-14 18:06:59.205 Using SSH protocol version 2
. 2014-07-14 18:06:59.205 We claim version: SSH-2.0-WinSCP_release_5.5.3
. 2014-07-14 18:06:59.212 Doing Diffie-Hellman group exchange
. 2014-07-14 18:06:59.323 Doing Diffie-Hellman key exchange with hash SHA-256
. 2014-07-14 18:06:59.834 Verifying host key rsa2 0x23,0xb513b870b15e1d22 e1667a7047dd6896 237f55154c2d8e1d c3edaffd526cb15b 5c362c6cb42d5dab 036fb9f1333e6d94 a1e5886da54455dd e122ed38aa088b91 2816b91ebbc5dfd8 2df7f414077eb488 02d4379b03fd4b39 b444f4b8dcb94678 e1c4960fb8caa9a4 69126d42424e17f8 c0b3599cbba5dd47 4a211234744de70d 0225ebed7b3a8a18 f53f0b43f1148533 8d57aaada251e5b7 e8af5cd4f2f58bb8 7248bade5aaf70bf ad1d877d6961347b 5673654273f96dc0 8ed88bff6e7b2fd2 5c911e5d7472012e 36523a5f2c161a77 a7acc6e15dbafaaa 55673b9dc00ac768 41433ee664e4c77d 0d8f454f0969ecf7 91a70c88d020f0ab a67269d1cb8c42e1 with fingerprint ssh-rsa 2048 29:c7:3b:e8:70:46:b4:83:dd:06:76:0d:85:22:af:37
. 2014-07-14 18:06:59.834 Asking user:
. 2014-07-14 18:06:59.834 **Продолжить подключение к неизвестному серверу и добавить его ключ в кэш?**
. 2014-07-14 18:06:59.834
. 2014-07-14 18:06:59.834 Ключ хоста сервера не найден в кэше. Нельзя гарантировать, что это тот самый сервер, который вам нужен.
. 2014-07-14 18:06:59.834
. 2014-07-14 18:06:59.834 Отпечаток ключа сервера rsa2:
. 2014-07-14 18:06:59.834 ssh-rsa 2048 29:c7:3b:e8:70:46:b4:83:dd:06:76:0d:85:22:af:37
. 2014-07-14 18:06:59.834
. 2014-07-14 18:06:59.834 Если вы доверяете этому хосту, нажмите «Да». Для подключения без добавления ключа хоста в кэш нажмите «Нет». Чтобы прервать подключение, нажмите «Отмена». ()
. 2014-07-14 18:06:59.834 Attempt to close connection due to fatal exception:
* 2014-07-14 18:06:59.834 Отпечаток ключа хоста - ssh-rsa 2048 29:c7:3b:e8:70:46:b4:83:dd:06:76:0d:85:22:af:37.
* 2014-07-14 18:06:59.834 (Exception) Ключ сервера не проверялся!
. 2014-07-14 18:06:59.834 Closing connection.
. 2014-07-14 18:06:59.834 Sending special code: 12
Думаю, что все знают, как работает 1с с FTP сервером, но вот как работать с sFTP или FTPs сервером?
Первое что Вам нужно сделать - это установить бесплатную программу WinSCP, скачать ее Вы сможете здесь, также там есть вся необходимая литература по пользованию данной программы.
После того как Вы установили программу, Вам нужно добавить сессию, там все просто, прописываете узел, порт, логин и пароль к серверу.
Так же посоветую Вам вести логи данной программы, что бы потом можно было в любой момент посмотреть из-за чего не произошел обмен данными или проверять лог на успех или не успех синхронизации файлов. Для того что бы у Вас создавался лог нужно зайти на закладку «Журнализация» установить флажок записывать у файл и выбрать путь, имя файл советую сделать таким образом !S!Y!M!D.txt, это означает, что каждый день будет создаваться новый файл для лога с таким наименованием S – имя сессии, Y – год, M – месяц, D – день, то есть Вам потом будет намного удобнее считывать данные из логов.
Теперь приступим непосредственно к программирования в 1с и для этого нам нужно только знать основные команды WinSCP, весь список которых можно посмотреть на сайте программы. А я Вам приведу только те команды которые использовал я и которых на мой взгляд хватит для того что бы 1с успешно обменивалось данными с sFTP или FTPs серверами. Также я напишу что, зачем и в какой последовательности делал:
1. Перед тем как делать синхронизацию данных, нужно проверить есть ли вообще соединение с сервером, для этого мы делаем следующее:
Код 1C v 8.х
где ПутьWinSCP – строка – путь к программе (c:\Program Files (x86)\WinSCP\WinSCP.com, ОБРАТИТЕ внимание, что расширение файла должно быть com), ПрофильWinSCP – строка – профиль сессии, то как Вы назвали Вашу сессию, к примеру test_sFTP.
2. После того как мы выполнили предыдущую команду, настоятельно рекомендую делать следующее, искать по дате лог WinSCP и проверять его, не было ли ошибки в соединении, вариантов как это сделать много, но я делал так: с конца текста искал строку «Failed», до тех пор, пока не находил «Session name: " + ПрофильWinSCP», после этого поиск прерываем, ну и собственно если была обнаружена строка «Failed», то при подключении была ошибка.
3. Делаем синхронизацию файлов:
Код 1C v 8.х
После этого снова проверяем лог.
Похожие FAQ
Фоновые задания: Пример запуска выполнения процедуры / функции на сервере 0
Как в 1С производится запуск фоновых заданий, каким образом можно получить список заданий при помощи метода "ПолучитьФоновыеЗадания()? В одном проекте понадобилось запускать выполнение выгрузки на сайт с сервера. Пользователь на своем клиенте от Посмотреть все результаты поиска похожих
Еще в этой же категории
К сожалению 1С пока не позволяет своими средствами обмениваться файлами с SFTP сервером.
Столкнувшись с этой проблемой, оптимальным для себя выбрал вариант с использованием бесплатного SFTP клиента:WinSCP.
Я не нашел в сети примеров работы 1С с этой утилитой через COM-соединение, поэтому выкладываю свой. Возможно кому-то будет полезен.
Первом делом необходимо скачать установочный пакет (можно так же использовать portable-версию) и COM-библиотеку с сайта здесь
Теперь можно работать с ней из 1С:
Все необходимые файлы и пример обработки обмена во вложении.
Я привел пример только основных возможностей, которые сам использовал. У библиотеки довольно много классов и методов и при необходимости возможности использования можно значительно расширить. Пример работы с WinSCP через командную строку
Специальные предложения
Мир этому дому!
Спасибо за интересную информацию - взял на заметку. Отдельное спасибо за ссылки по теме - будем разбираться.
(2) Vladuha, SFTP и FTPS - это разные вещи. SFTP - это фтп ssh сервера, а FTPS - это фтп через SSL/TLS.
Да действительно, заявлено что 8.3 умеет устанавливать FTPСоединение по SSL, не пробовал. Я привел рабочий пример для 8.2. Спасибо за информацию
норм, а я когда-то лет 7 назад для 8.1 настраивал какого-то ftp-клиента на сервере, прописывал профили, а потом вызывал через КомандаСистемы.
COM - это хорошо
а 8.3 - лучше :)
Добрый день!
Очень благодарен за информацию!
Только у меня не получается подключиться.
Не пойму что нужно указать в поле "SshHostKeyFingerprint"
где взять значение для этого поля?
Через обычного клиента WinSCP подключаюсь нормально. Там просто указываю адрес, юзера и пароль.
Вывод: данная реализация позволяет передавать файлы из 1С: Предприятие 8.2. большого размера по защищенному протоколу SFTP. Плюс появляется возможность переносить часть функционала из 1С во внешнюю компоненту, что защищает написанный код и позволяет реализовывать дополнительный, не доступный 1С функционал.
Ребята, а что таки писать в поле sessionOptions.SshHostKeyFingerprint ?
система мне отвечает так:
Соединение неожиданно разорвано. Сервер вернул код завершения команды 0.
вот от куда беру код:
(16) sandybaev,
какая именно команда возвращает ошибку, .Open ? С этими же параметрами через саму программу подключиться удается?
(17) ram3, Все, брат. Получилось. В параметр SshHostKeyFingerprint Я передал публичный ключ сгенерированный самим sftp серваком. А ошибка подключения была в изменненом пароле администратора (я об этом узнал потом).
Огромное спасибо вроде все заработало.
ТОлько единственное не пойму зачем ты перемещаешь файл этой командой -
ПереместитьФайл(ВыгруженныйФайл.FileName, ХранилищеВыгруженныхФайлов);
Если на сервер ты уже закидываешь эти файлы командой
Помогите
Как подключится без пароля с приват ключем.
sessionOptions = Новый COMОбъект("WinSCP.SessionOptions"); //Создаем объект SessionOptions
sessionOptions.HostName = "1.1.1.1";
sessionOptions.UserName = "log";
//sessionOptions.Password = "mypassword";
sessionOptions.PortNumber = "22";
sessionOptions.SshHostKeyFingerprint = "ssh-rsa 2048 010101010110101001012010";
sessionOptions.SshPrivateKeyPath = "С:\1111.ppk";
session = Новый COMОбъект("WinSCP.Session"); //Создаем объект Session
//параметр необходимо использовать если пути регистрации DLL и исполняемого файла различны
session.ExecutablePath = "C:\Program Files (x86)\WinSCP\winscp.exe";
Ошибка:
: Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (WinSCPnet): Disconnected: No supported authentication methods available (server sent: publickey)
(19) ram3,
Не подскажешь.
Как теперь я могу создавать и менять папки на sftp серваке.
Просто тут пишу обработку для обмена а она по ТЗ должна уметь создавать и менять папки.
(22) ram3, Все, плюсанул вроде как. Почитаю на досуге. Спасибо большое. Тебе бы дальше эту тему развить. желательно с обилием скринов :)
(22) ram3, отличная публикация! Есть вопрос по такой задаче: необходимо синхронизировать файлы командой SynchronizeDirectories. Пишу:
transferResult = session.SynchronizeDirectories(Local, ПутьЗагрузкиЛокальный, ПутьКФайламНаСервере, Ложь, Ложь, , "*.wav");
Но не знаю, что ставить в первый параметр. По-идее, там должен быть класс SynchronizationMode mode (Например: SynchronizationMode.Local, SynchronizationMode.Remote and SynchronizationMode.Both).
Как его объявить в 1С?
(24) kashafeev,
думаю можно так:
SynchronizationMode = Новый COMОбъект("WinSCP.SynchronizationMode");
но не уверен, надо пробовать.
(26) kashafeev,
а так:
WinSCP = Новый COMОбъект("WinSCP");
SynchronizationMode = WinSCP.SynchronizationMode;
мне это не нужно было, сейчас к сожалению времени нет разбираться. Посмотри примеры на сайте разработчика, может что найдешь
(26) kashafeev,
SynchronizationMode mode: 0 - local, 1 - remote, , 2 - both
SynchronizationCriteria criteria: 0 - None, 1 - Time, 2 - Size, 3 - Either
спасибо за чудесную реализацию.
в сети навалом обработок, но все они работают через командную строку, а тут COM-соединение. То что доктор прописал )))) в благодарность скачал, хотя и качать ничего не нужно, все понятно из текста статьи
ребята помогите
есть коренвая директория сервера /public
в ней я программно создаю поддиректорию командой session.CreateDirectory("/public" + "ОбластьКонтрагента")
все ок, создается теперь надо дальше в директории области контрагента создать еще одну папку (последнюю) под названием "НаименованиеКонтрагента"
как это сделать через функции WinSCPnet.dll?
перерыл из форум и хэлп, ничего нет.
Коллеги, подскажите как зарегистрировать WinSCP.dll, дело в том, что я в принципе такого файла найти не могу, нашел WinSCPnet.dll.
Зарегистрировал библиотеку командой
в ответ получил
Пытаюсь соединиться по sftp, 1 ска выдает ошибку:
: Ошибка при вызове конструктора (COMОбъект): -2147221164(0x80040154): Недопустимая строка с указанием классаОбщийМодуль.МойМодуль.Модуль(296)>
Что не так сделано?
Коллеги, подскажите как зарегистрировать WinSCP.dll, дело в том, что я в принципе такого файла найти не могу, нашел WinSCPnet.dll.
Хотя может быть мои знания устарели, и передача файла по SFTP в 1с возможна без лишних плясок - напрямую из платформы?
Я бы не стал называть это ошибкой, с версией 515 все работает. Если хотите использовать свежую версию, возможно придется адаптировать код. В заголовке статьи написано ПРИМЕР, это не готовое решение на все времена, и пожизненную поддержку никто не обещал.
Хотя может быть мои знания устарели, и передача файла по SFTP в 1с возможна без лишних плясок - напрямую из платформы?
На сколько я знаю, платформа 1С пока не поддерживает sFTP, только FTPS.
что значит ошибка:
: Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (WinSCPnet): Алгоритм обмена ключей diffie-hellman-group1-sha1 не был проверен!
как проверить алгоритм?
при подключение оболочкой спрашивает про тоже самое, но тут можно нажать ДА и все ок.
а как нажать Да через КОМ-соединение?
в оболочке нашел как сдвинуть свой алгоритм наверх.
но как в ком. пока ищю
добавил в парамтерах сессии
bool GiveUpSecurityAndAcceptAnyTlsHostCertificate Give up security and accept any FTPS/WebDAVS server TLS/SSL certificate. To be used in exceptional situations only, when security is not required. When set, log files will include warning about insecure connection. To maintain security, use TlsHostCertificateFingerprint.
но не помогло
версия последняя на седня 5.9.1. так и не победил.
искать старые может. в них видимо такой проверки не было
Коллеги, после установки 1С платформы 8.3.9 и обновления WinSCP на 5.9.2 у меня просто "Неизвестная ошибка"
: Ошибка при вызове метода контекста (Open)
session.Open(sessionOptions);
по причине:
Неизвестная ошибка
Даже и не знаю куда копать. Может кто подскажет?
(46) KokaDu, два варианта: либо качать старую версию WinSCP, либо смотреть документацию по новой версии и менять вызов метода .Open, видимо здесь "sessionOptions" что-то не соответствует новой версии.
Уже были проблемы с новой версией выше в комментариях. Я с WinSCP уже давно не работаю, проверить к сожалению не могу.
(47) ram3, перерыл документацию, ничего нового по "Open" не нашел.
Проблему обошел тем, что создал bat-ник из самого WinSCP , который запускается из 1С.
В любом случае спасибо.
(47) ram3, перерыл документацию, ничего нового по "Open" не нашел.
Проблему обошел тем, что создал bat-ник из самого WinSCP , который запускается из 1С.
В любом случае спасибо.
Проблема ошибки OPEN встала очень остро.
Переход на старую версию не помог. ВЫявил следующую закономерность: при простой регистрации компоненты через командную строку и работе на клиенте все ок.
Как только регистрируем компоненту в службе компонентов чтоб работало на серваке- ловим ошибку OPEN. Может быть кто то победил ее?
После регистрация WinSCP как 64 битного приложения проблема с OPEN остаётся.
Предлагаю следующие варианты решения с использованием батника:
Во вложении примеры с получением и отправки файла.
У меня есть еще решение с использованием Putty, если будет интересно, тоже могу поделиться.
далее послать принять как обычно
ПС вин2008р2 64. 1с8*64
Хотел бы добавить, что лично у меня алгоритм шифрования был иной, тогда нужно применить несколько иной метод соединения.
Спасибо за статью.
Немного покурив интернеты и мануал, выяснил, что библиотека умеет работать не только с SFTP, но и с FTPS.
Хотел добавить, если вы устанавливаете FTPES соединение
УРЛ + Логин + ":" + Пароль + "@" + АдресСервера;
sessionOptions.ParseUrl(УРЛ);
необходима версия WINSCP 5.9.2 и выше
Добавлю к "как выяснилось" к посту выше
скачав с их офф сайта winSCPnet.dll - регистрируете через RegAsm но согласно разрядности вашей ОС.
да и если работаете в клиент серверном варианте, то, версия утилиты на сервере должна совпасть с вашей локальной установкой.
Чтобы не париться с SshHostKeyFingerprint
можно так сделать:
fingerprint = session.ScanFingerprint(sessionOptions,"SHA-256");
sessionOptions.SshHostKeyFingerprint = fingerprint;
попробовал написать так как написано у Вас, выдает ошибку
подскажите почему такая ошибка может выдаваться?
Немного не в тему, но с FTPS тоже долго искал инфу, пришлось справку читать :)
Сервер = Новый FTPСоединение(ИПFTP, 21,ЛогинFTP,ПарольFTP,,Истина,300,, УровеньИспользованияЗащищенногоСоединенияFTP.ИспользоватьЕслиВозможно) ;
на удивление заработало. 8.3.11, в режиме совместимости 8.2.16
Мои 5 копеек:
// Подключаемся
session = Новый COMОбъект("WinSCP.Session"); //Создаем объект Session
session.open(sessionOptions);
версия WinSCP 5.11.3
Подскажите пожалуйста, я могу получить файлы (например *.txt) с sFTP, не выгружая в каталог на диске, а сразу в 1С?
Добрый день! подскажите можно же выгружать файл txt из 1с в каталог и отправлять на sftp сторонними средствами? Этот вариант хуже, чем использовать WinSCP ?
подскажите правильно ли я понимаю, что для получения и работы с полем sessionOptions.SshHostKeyFingerprint нужно сгенерировать открытый ключ и разместить его на сервере SFTP, а приватный ключ зарегистрировать на своем компьютере и только после этого можно обращаться обработкой из 1с на sftp сервер?
в программе WinSCP на нужном соединении открываете Manage - Generate Session URL/Code.
Далее на закладке URL установите опцию SSH host key.
Внизу в окне URL появится строка вида fingerprint=ecdsa-sha2-ххххххххххххххххххххххххххх
строку после fingerprint= присваиваете sessionOptions.SshHostKeyFingerprint. Это и есть ключ.
Вот эту всю историю нужно написать до .Оpen
Отмечу с какими сложностями столкнулся при установке библиотеки:
3. SshHostKeyFingerprint можно взять в winscp . Для этого подключаемся к sftp, главное меню -- соединение -- Информация о протоколе сервере. В открывшемся окне копируем значение MD5. При вставке к нему добавится ssh.
Нет такого программиста 1С, который бы не сталкивался с необходимостью программно передавать данные посредством FTP.
В 90% случаев это использование протокола FTP, в 9% FTPs и в 1% это sFTP (имхо)
Сразу стоит подчеркнуть, что FTPs и sFTP не одно и тоже и кардинально отливается в реализации.
Для любопытных, но ленивых вот ссылки:
Теперь рассмотрим реализацию передачи файлов по каждому варианту.
FTP – Легко
При этом настройка в FileZilla будет следующая:
Для реализации в 1С будем использовать следующую конструкцию:
При этом для соединения будет использоваться прокси по умолчанию, и если нам нужно пойти в обход прокси или использовать «особый», то будем этот самый прокси переопределять
После создания соединения начинаем передачу
Все, файл там, где нужно
FTP – легко и безопасно
При этом настройка в FileZilla будет следующая:
FTP – сложно и безопасно
При этом настройка в FileZilla будет следующая:
Хочу Вас сразу огорчить – с данным соединением 1С не работает и стандартный класс FTPСоединение не поможет.
Для работы с sFTP нужно будет использовать сторонние продукты. Я использую WinSCP, на основе нее и опишу решение передачи.
Запускать будем с использованием скрипта, т.е. файла, где описаны действия для WinSCP
По результату выполнения команды файл будет отправлен.
Для ленивых приложу обработину, где в МОДУЛЕ ОБЪЕКТА есть готовые процедуры работы с sFTP.
Во время создания очередной B2B-системы на этапе интеграции 1С: Предприятие 8.2 с web — интерфейсом возникла необходимость безопасной передачи файлов больших размеров из 1С в web.
Для решения этой задачи был выбран протокол SFTP, как надежный и не имеющий ограничений по размеру передаваемого файла.
Во встроенном языке 1С: Предприятие 8.2 отсутствуют функции для передачи данных через SFTP, поэтому пришлось искать прикладные средства. На интернет-ресурсах, посвященных программированию 1С, есть примеры удачного использования freeware утилит типа WinSCP. Для использования данного способа необходимо из встроенного языка 1С выполнить запуск утилиты с параметрами командной строки.
Пример запуска утилиты WinCSP из 1С:
Минусом такого решения является отсутствие возможности контроля ошибок запуска и выполнения из встроенного языка 1С. В связи с этим было принято решение написать внешнюю DLL компоненту для 1С: Предприятие 8.2.
Создание компоненты DLL
- IcomponentBase — реализует основные методы компоненты.
- IlanguageInterface — служит для локализации методов и свойств 1С и С++ через определения массивов соответствий и методов акцессоров GetMethodName, GetPropName.
3. Для вызова необходимой функции из компоненты используется метод CallAsFunc из интерфейса IcomponentBase. При вызове методов из компоненты 1С, вызывается этот С++ метод.
- lMethodNum – номер метода в массиве соответствий.
- pvarRetValue – указатель на выходные параметры.
- paParams — параметры из метода в 1С.
- lSizeArray – размер массива, если входной параметр массив.
4. В нашем примере из 1С можно выполнять 4 метода, которым соответствуют С++ методы в DLL компоненте.
1С (методы) | С++ методы |
---|---|
НачатьСессию() Предварительно нужно определить параметры авторизации(хост, связку логин, пароль – либо rsa ключи, путь на удалённом сервере). Поэтому функция НачатьСессию обрастает свойствами: Хост, Логин, Пароль, УдаленныйПуть | StartSSHSession(status,this->ssh_host,this->ssh_login,this->ssh_pass); StartSftpSession(status,this->sftp_path) |
ПослатьФайл(“Путь и имя файла на клиентской машине”) | WriteToServer(const char * &status, const char *loclfile) |
ЕслиСессияНачата() | isSessionStart() |
ЗакончитьСессию() | endSession() – завершает SFTP сеанс и SSH сеанс |
5. В С++ нужно определить параметры доступа(чтение/запись) к созданным свойствам за это отвечают два метода IsPropReadable и IsPropWritable.
Таблица соотношений свойств 1С и С++
1С(свойства) | С++ свойства |
---|---|
Хост | ssh_host |
Логин | ssh_login |
Пароль | ssh_pass |
УдаленныйПуть | Sftp_path |
Готовую библиотеку можно скачать тут.
Работа с компонентой во встроенном языке 1С
1. Выполняем подключение и создаем объект внешней компоненты, с помощью стандартных команд встроенного языка 1С.
2. Заполняем 4 свойства объекта компоненты Хост, Логин, Пароль, УдаленныйПуть.
3. Открываем сессию соединения
4. Отправляем файл
5. Отправляем следующий файл, с проверкой открыта ли сессия соединения.
6. После отправки файлов закрываем сессию
В результате выполнения успешно был передан файл с C:\data2.xml в /var/www/company/data/www/import/data.xml.
Вывод: данная реализация позволяет передавать файлы из 1С: Предприятие 8.2. большого размера по защищенному протоколу SFTP. Плюс появляется возможность переносить часть функционала из 1С во внешнюю компоненту, что защищает написанный код и позволяет реализовывать дополнительный, не доступный 1С функционал.
Читайте также: