gifts2017

FTP отправка из 7.7

Опубликовал Юрий Зайцев (Yury1001) в раздел Программирование - Практика программирования

Всё чаще встречаются задачи по отправке отчетов поставщику, и нередко подготовленные файлы необходимо записать на FTP сервер. О том, как можно решить подобную задачу, и пойдёт речь.

Способ первый – внешняя компонента

На официальном сайте замечательной компании Агент ПЛЮС в разделе Скачать свободно доступны Конфигурации для 1С:Предприятие с интегрированным модулем обмена для "Агент Плюс: Мобильная торговля. Проф" среди которых Конфигурация "Агент Плюс. Торговля+Склад" (на базе типовой конфигурации "Торговля+Склад", редакция 9.2). В дистрибутиве конфигурации содержится внешняя компонента APPlus.dll и несколько дополнительных библиотек, дабы не мучать читателя подробностями – все они собраны в прикрепленном к статье архиве.

При помощи этой компоненты легко решается поставленная задача:

ЗагрузитьВнешнююКомпоненту("APPlus.dll"); // Регистрируем компоненту 
ФТП = СоздатьОбъект("AddIn.CeDataExch"); // Создаём объект 
ФТП.FtpOpenSession(); // Это я не знаю зачем:) 
Результат = ФТП.FtpConnect("ftp.filehost.ru","userName","Password"); // Подключаемся
Если Результат = 0 Тогда // Если успешно то отправляем файл
    Результат = ФТП.FtpPutFile(ИмяФайлаЛокально, ИмяФайлаНаФТП);
    Если Результат <> 0 Тогда // не получилось - сообщаем об ошибке
        Сообщить("Не удалось отправить файл по причине: " + ФТП.ErrDescription(Результат), "!");
    КонецЕсли; 
Иначе
    Сообщить("Не удалось подключиться по причине: " + ФТП.ErrDescription(Результат), "!"); 
КонецЕсли; 
ФТП.FtpCloseSession();

Преимущества: один из самых всеядных способов в плане серверов + контроль результата выполнения, легко организовать обработку исключительных ситуаций, так же сильны и методы чтения с фтп.

Недостатки: внешние компоненты в 7.7 требуют регистрации с правами администратора; относительно медленный способ.

По поводу правомерности использования компоненты мне официально ответили «Компонента APPlus.dll бесплатная, Вы можете использовать её в любых целях»  

 

Способ второй – консольный

Заключается в использовании стандартной команды windows «ftp» с параметрами.

Решение может выглядеть так:

Текст = СоздатьОбъект("Текст"); // Создаём файл с командами для ftp
Текст.ДобавитьСтроку("open " + ФТПсервер);
Текст.ДобавитьСтроку(ФТПимяПользователя);
Текст.ДобавитьСтроку(ФТПпароль);
Текст.ДобавитьСтроку("put " + ИмяФайлаЛокально);
Текст.ДобавитьСтроку("quit");
Текст.Записать(КаталогИБ() + "ftpcmd.dat");
ФС.УстТекКаталог(КаталогИБ()); // место расположения ftpcmd.dat
КомандаСистемы("ftp  -s:ftpcmd.dat"); // вызываем
ФС.УдалитьФайл(КаталогИБ() + "ftpcmd.dat"); // убираем за собой

Преимущества: никаких компонент, всё стандартное и понятное.

Недостатки: работает не всегда и не везде – капризный к серверам, для результата выполнения требуется анализ выводимых сообщений, можно сделать так.

"ftp  -s:ftpcmd.dat > naprimer.log"

После выполнения команды файл naprimer.log считывается программно и анализируется.

 

Способ третий – пассивный режим

История возникновения этого способа связана с тем, что первые два не имеют возможности перехода в пассивный режим обмена (как Web-браузер) и в некоторых случаях из-за этого не работают. Связано ли это с настройками фтп-серверов или политикой безопасности компьютера-клиента и его сети, лично для меня как необременённого сетевыми знаниями специалиста, загадка, а искать ответ или специалиста который бы помог в каждом новом случае – смерти подобно. Поэтому силами яндекса было найдено решение – использовать свободно доступную консольную программу «curl.exe» следующим образом:

ФС.УстТекКаталог(КаталогИБ()); // место расположения curl.exe и её компонент
КомандаСистемы("curl.exe  -T """+ИмяФайлаЛокально+""" -u "+ФТПимяПользователя+":"+ФТПпароль+" "+ФТПсервер); // вот и всё

Достоинства: пассивный режим, относительно быстрый, достаточно лояльный к серверам.

Недостаток: нет возможности программно определить результат отправки.

 

В прилагаемом архиве содержится конфигурации со всеми описанными способами и примененными компонентами, что позволяет, указав параметры своего сервера, быстро определиться с подходящим решением.

О том как можно организовать регулярную автоматическую отправку отчетов можно узнать здесь.

 

Конечно же, есть и множество других способов решить поставленную в заголовке задачу, однако мне вполне хватает вышеизложенных. Все три способа на момент публикации реально используются, поэтому делюсь, чтобы другим помогло и самому не забыть.

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Db.zip
.zip 6,69Mb
10.06.15
95
.zip 6,69Mb 95 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. andrewks 07.12.12 12:34
насколько законно такое использование APPlus.dll без наличия лицензии на Агент+?
По поводу правомерности использования компоненты мне официально ответили «Компонента APPlus.dll бесплатная, Вы можете использовать её в любых целях»


а можно ссылочку на ветку форума? или это из приватной переписки?
2. andrewks 07.12.12 12:35
уж лучше dialmail.dll использовать, он-то уж точно свободно распространяемый
3. Юрий Зайцев (Yury1001) 07.12.12 13:17
(1) andrewks, нельзя - я письмо писал:
Прикрепленные файлы:
4. andrewks 07.12.12 22:17
(3) Yury1001, спасибо. но всё равно я бы опасался её использования в каких-то серьёзных решениях, ведь лицензия на неё не указана, а письмо... это всего лишь письмо
5. Юрий Зайцев (Yury1001) 07.12.12 22:23
(4) andrewks, обязательно найду время, посмотрю dialmail.dll и добавлю четвертый способ:)
andrewks; +1 Ответить
6. arjuna (arjuna) 22.09.13 23:56
Обработка помогла, все три варианта сработали :) вот теперь мучаюсь с выбором :)
7. Стервятник (Elected) 06.11.14 08:23
Первый способ у меня почему-то не работает. Выпадает ошибка: Не удалось отправить файл по причине: Ошибка записи файла-получателя. Файл на ФТП появляется, но пустой и повреждённый. В чём причина?
8. Юрий Зайцев (Yury1001) 06.11.14 14:45
(7) Elected, для того и представлено несколько способов, что бы найти рабочий, а так же посмотрите комментарии выше, там ещё одна компонента.
9. Стервятник (Elected) 07.11.14 14:01
(8) Yury1001, не знаю, у меня есть своя наработка и она работает на стандартной команде windows FTP.EXE. Всё загружается и выгружается...
10. Сергей (Che) Коцюра (CheBurator) 07.11.14 22:36
11. Андрей Стручалин (dikd) 19.12.14 14:33
Для первого варианта будет ли работать Загрузка с FTP?:

Результат = ФТП.FtpGetFile(ИмяФайлаНаФТП,ИмяФайлаЛокально);

12. Андрей Стручалин (dikd) 19.12.14 14:45
Да, работать будет ))
Но вот так:

Результат = ФТП.FtpGetFile(ИмяФайлаЛокально,ИмяФайлаНаФТП);
13. Геннадий Поляков (Gennadiy83) 02.11.15 09:13
Добрый день! Использую библиотеку APPlus.dll. Подскажите, пожалуйста, как должно выглядеть содержимое параметра ИмяФайлаНаФТП? При попытке отправить файл, возвращается код "6" и ошибка "Не удалось отправить файл по причине: Ошибка записи файла-получателя". Помогите разобраться.
14. Юрий Зайцев (Yury1001) 02.11.15 11:13
(13) Gennadiy83,
0001/file1.txt
положить в каталог 0001
или
/file1.txt
положить в корневой каталог ФТП

вот реальный пример
storage/sdcard0/Download/To1C.zip
загружаю файл на телефон
Gennadiy83; +1 Ответить
15. Геннадий Поляков (Gennadiy83) 02.11.15 12:21
При подключении к серверу начальный каталог не указывается. При подключении через браузер или проводник, локальный каталог не указываю и не вижу. Вероятнее всего при подключении к ftp сразу перенаправляет в нужную папку. Знаю, что на ftp каждому дистрибьютору соответствует папка по логину подключения.

Пробовал установить каталог вызовом процедуры ФтпУстТекКаталог(имяПапкиНаFTP), но генерируется ошибка.
16. Геннадий Поляков (Gennadiy83) 02.11.15 21:45
Подозреваю, что ftp работает в пассивном режиме, есть ли возможность установки соединения с ftp-сервером в таком режиме?
17. Юрий Зайцев (Yury1001) 03.11.15 11:07
(16) Gennadiy83, попробуйте DialMail.dll - она, пожалуй, лучшая. Работает в пассивном режиме (пятый параметр 1, при подключении). Пользуюсь давно, но выложить руки так и не дошли.
На фото рабочий пример кода, где параметры:
Каталог - куда отправить на ФТП, например "1001/1002"
Вложения - список значений, каждое значение которого - полное имя файла на диске; представление - имя файла, без каталогов, как его записать на ФТП, например:
Вложения.ДобавитьЗначение(КаталогИБ() + "EUR.spl", "EUR.spl");
Прикрепленные файлы:
18. Геннадий Поляков (Gennadiy83) 04.11.15 10:44
Огромное спасибо за помощь, попробую в ближайшее время, обязательно отпишу по результатам
19. Геннадий Поляков (Gennadiy83) 05.11.15 00:42
Попробовал dialMail.dll в активном и пассивном режиме, подключение происходит, но файл не перегружается на ftp. Ниже приведу лог пассивного подключения, затем, активного

Пассивный режим:

.11.15 00:36:41.314 FTP: Подключаемся к сокету
05.11.15 00:36:41.330 FTP: К сокету подключились успешно
05.11.15 00:36:41.361 FTP <-- 220 Microsoft FTP Service
05.11.15 00:36:41.361 FTP --> USER ЛОГИН
05.11.15 00:36:41.377 FTP <-- 331 Password required for PTN020104699.
05.11.15 00:36:41.377 FTP --> PASS *****
05.11.15 00:36:41.392 FTP <-- 230 User logged in.
05.11.15 00:36:41.392 FTP --> TYPE I
05.11.15 00:36:41.424 FTP <-- 200 Type set to I.
05.11.15 00:36:41.424 FTP --> STRU F
05.11.15 00:36:41.439 FTP <-- 200 STRU F ok.
05.11.15 00:36:41.439 FTP --> REST 0
05.11.15 00:36:41.455 FTP <-- 350 Restarting at 0.
05.11.15 00:36:41.455 FTP --> REST 1
05.11.15 00:36:41.470 FTP <-- 350 Restarting at 1.
05.11.15 00:36:41.470 FTP --> REST 0
05.11.15 00:36:41.502 FTP <-- 350 Restarting at 0.
05.11.15 00:36:44.185 FTP DataSocket: Begin
05.11.15 00:36:44.185 FTP DataSocket: Use passive mode
05.11.15 00:36:44.185 FTP DataSocket: Command EPSV 1
05.11.15 00:36:44.185 FTP DataSocket: Command PASV
05.11.15 00:36:44.185 FTP --> PASV
05.11.15 00:36:44.200 FTP <-- 227 Entering Passive Mode (хх,хх,хх,хх,218,154).
05.11.15 00:36:44.200 FTP DataSocket: CloseSocket
05.11.15 00:36:44.200 FTP DataSocket: Bind 0.0.0.0:0
05.11.15 00:36:44.200 FTP DataSocket: Connect хх.хх.хх.хх:55962
05.11.15 00:37:05.229 FTP DataSocket: Error
05.11.15 00:37:05.229 D_FTP ErrorCode = 10060
05.11.15 00:37:05.229 D_FTP ErrorDesc = Connection timed out
05.11.15 00:37:05.229 FTP DataSocket: End
05.11.15 00:37:05.229 FTP --> QUIT
05.11.15 00:37:05.245 FTP <-- 221 Goodbye.


Активный режим:

05.11.15 00:41:13.831 FTP: Подключаемся к сокету
05.11.15 00:41:13.862 FTP: К сокету подключились успешно
05.11.15 00:41:13.878 FTP <-- 220 Microsoft FTP Service
05.11.15 00:41:13.878 FTP --> USER ЛОГИН
05.11.15 00:41:13.893 FTP <-- 331 Password required for PTN020104699.
05.11.15 00:41:13.893 FTP --> PASS *****
05.11.15 00:41:13.909 FTP <-- 230 User logged in.
05.11.15 00:41:13.909 FTP --> TYPE I
05.11.15 00:41:13.940 FTP <-- 200 Type set to I.
05.11.15 00:41:13.940 FTP --> STRU F
05.11.15 00:41:13.956 FTP <-- 200 STRU F ok.
05.11.15 00:41:13.956 FTP --> REST 0
05.11.15 00:41:13.971 FTP <-- 350 Restarting at 0.
05.11.15 00:41:13.971 FTP --> REST 1
05.11.15 00:41:14.002 FTP <-- 350 Restarting at 1.
05.11.15 00:41:14.002 FTP --> REST 0
05.11.15 00:41:14.018 FTP <-- 350 Restarting at 0.
05.11.15 00:41:17.653 FTP DataSocket: Begin
05.11.15 00:41:17.653 FTP DataSocket: Use active mode
05.11.15 00:41:17.653 FTP DataSocket: Bind 192.168.110.5:0
05.11.15 00:41:17.653 FTP DataSocket: Command PORT 192,168,110,5,240,79
05.11.15 00:41:17.653 FTP --> PORT 192,168,110,5,240,79
05.11.15 00:41:17.684 FTP <-- 501 Server cannot accept argument.
05.11.15 00:41:17.684 FTP DataSocket: End
05.11.15 00:41:17.684 FTP --> QUIT
05.11.15 00:41:17.700 FTP <-- 221 Goodbye.
20. Юрий Зайцев (Yury1001) 09.11.15 10:39
(19) Gennadiy83, гугл в помощь, как говорится, вероятно проблема на стороне сервера.
21. Геннадий Поляков (Gennadiy83) 10.11.15 01:03
В любом случае спасибо за помощь)
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа