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


Всё чаще встречаются задачи по отправке отчетов поставщику, и нередко подготовленные файлы необходимо записать на 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 "+ФТПимяПользователя+":"+ФТПпароль+" "+ФТПсервер); // вот и всё

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

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

 

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

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

 

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

25 Comments

  1. andrewks

    насколько законно такое использование APPlus.dll без наличия лицензии на Агент+?

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

    а можно ссылочку на ветку форума? или это из приватной переписки?

    Reply
  2. andrewks

    уж лучше dialmail.dll использовать, он-то уж точно свободно распространяемый

    Reply
  3. Yury1001

    (1) andrewks, нельзя — я письмо писал:

    Reply
  4. andrewks

    (3) спасибо. но всё равно я бы опасался её использования в каких-то серьёзных решениях, ведь лицензия на неё не указана, а письмо… это всего лишь письмо

    Reply
  5. Yury1001

    (4) andrewks, обязательно найду время, посмотрю dialmail.dll и добавлю четвертый способ:)

    Reply
  6. arjuna

    Обработка помогла, все три варианта сработали 🙂 вот теперь мучаюсь с выбором 🙂

    Reply
  7. Elected

    Первый способ у меня почему-то не работает. Выпадает ошибка: Не удалось отправить файл по причине: Ошибка записи файла-получателя. Файл на ФТП появляется, но пустой и повреждённый. В чём причина?

    Reply
  8. Yury1001

    (7) Elected, для того и представлено несколько способов, что бы найти рабочий, а так же посмотрите комментарии выше, там ещё одна компонента.

    Reply
  9. Elected

    (8) не знаю, у меня есть своя наработка и она работает на стандартной команде windows http://FTP.EXE. Всё загружается и выгружается…

    Reply
  10. CheBurator

    Я использую ncftp

    Reply
  11. dikd

    Для первого варианта будет ли работать Загрузка с FTP?:

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

    Reply
  12. dikd

    Да, работать будет ))

    Но вот так:

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

    Добрый день! Использую библиотеку APPlus.dll. Подскажите, пожалуйста, как должно выглядеть содержимое параметра ИмяФайлаНаФТП? При попытке отправить файл, возвращается код «6» и ошибка «Не удалось отправить файл по причине: Ошибка записи файла-получателя». Помогите разобраться.

    Reply
  14. Yury1001

    (13) Gennadiy83,

    0001/file1.txt

    положить в каталог 0001

    или

    /file1.txt

    положить в корневой каталог ФТП

    вот реальный пример

    storage/sdcard0/Download/To1C.zip

    загружаю файл на телефон

    Reply
  15. Gennadiy83

    При подключении к серверу начальный каталог не указывается. При подключении через браузер или проводник, локальный каталог не указываю и не вижу. Вероятнее всего при подключении к ftp сразу перенаправляет в нужную папку. Знаю, что на ftp каждому дистрибьютору соответствует папка по логину подключения.

    Пробовал установить каталог вызовом процедуры ФтпУстТекКаталог(имяПапкиНаFTP), но генерируется ошибка.

    Reply
  16. Gennadiy83

    Подозреваю, что ftp работает в пассивном режиме, есть ли возможность установки соединения с ftp-сервером в таком режиме?

    Reply
  17. Yury1001

    (16) Gennadiy83, попробуйте DialMail.dll — она, пожалуй, лучшая. Работает в пассивном режиме (пятый параметр 1, при подключении). Пользуюсь давно, но выложить руки так и не дошли.

    На фото рабочий пример кода, где параметры:

    Каталог — куда отправить на ФТП, например «1001/1002»

    Вложения — список значений, каждое значение которого — полное имя файла на диске; представление — имя файла, без каталогов, как его записать на ФТП, например:

    Вложения.ДобавитьЗначение(КаталогИБ() + «EUR.spl», «EUR.spl»);

    Reply
  18. Gennadiy83

    Огромное спасибо за помощь, попробую в ближайшее время, обязательно отпишу по результатам

    Reply
  19. Gennadiy83
    Reply
  20. Yury1001

    (19) Gennadiy83, гугл в помощь, как говорится, вероятно проблема на стороне сервера.

    Reply
  21. Gennadiy83

    В любом случае спасибо за помощь)

    Reply
  22. Hitryi

    Как через библиотеки АгентПлюс получить список файлов на ftp?

    Reply
  23. pragromist

    (22) на сколько я знаю, никак, здесь поможет dialmail.dll

    Reply
  24. Hitryi

    (23) Так и есть. Нет там таких методов.

    Выкрутился из ситуации получив список файлов curl-om.

    Так же выяснилось что Агент Плюс не любит русские символы.

    Reply
  25. ra9000

    Привет. Есть замечательная программка

    Складываем файлы в папку — Архивируем любым архиватором !!!ставим пароль на архив!!!

    В батнике пишем

    echo Пробуем выгрузить изменения.

    ncftpput.exe -u ftp_user -p ftp_pass -F %DebugMode% http://ftp.company.ru . %PC_Folder%MG1D.zip

    Сами файлы можно забрать у разработчика с описанием и примерами

    При этом версия 1с не имеет значения.

    http://www.ncftp.com/ncftp/

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *