Способ первый – внешняя компонента
На официальном сайте замечательной компании Агент ПЛЮС в разделе Скачать свободно доступны Конфигурации для 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 "+ФТПимяПользователя+":"+ФТПпароль+" "+ФТПсервер); // вот и всё
Достоинства: пассивный режим, относительно быстрый, достаточно лояльный к серверам.
Недостаток: нет возможности программно определить результат отправки.
В прилагаемом архиве содержится конфигурации со всеми описанными способами и примененными компонентами, что позволяет, указав параметры своего сервера, быстро определиться с подходящим решением.
О том как можно организовать регулярную автоматическую отправку отчетов можно узнать здесь.
Конечно же, есть и множество других способов решить поставленную в заголовке задачу, однако мне вполне хватает вышеизложенных. Все три способа на момент публикации реально используются, поэтому делюсь, чтобы другим помогло и самому не забыть.
насколько законно такое использование APPlus.dll без наличия лицензии на Агент+?
а можно ссылочку на ветку форума? или это из приватной переписки?
уж лучше dialmail.dll использовать, он-то уж точно свободно распространяемый
(1) andrewks, нельзя — я письмо писал:
(3) спасибо. но всё равно я бы опасался её использования в каких-то серьёзных решениях, ведь лицензия на неё не указана, а письмо… это всего лишь письмо
(4) andrewks, обязательно найду время, посмотрю dialmail.dll и добавлю четвертый способ:)
Обработка помогла, все три варианта сработали 🙂 вот теперь мучаюсь с выбором 🙂
Первый способ у меня почему-то не работает. Выпадает ошибка: Не удалось отправить файл по причине: Ошибка записи файла-получателя. Файл на ФТП появляется, но пустой и повреждённый. В чём причина?
(7) Elected, для того и представлено несколько способов, что бы найти рабочий, а так же посмотрите комментарии выше, там ещё одна компонента.
(8) не знаю, у меня есть своя наработка и она работает на стандартной команде windows http://FTP.EXE. Всё загружается и выгружается…
Я использую ncftp
Для первого варианта будет ли работать Загрузка с FTP?:
Да, работать будет ))
Но вот так:
Добрый день! Использую библиотеку APPlus.dll. Подскажите, пожалуйста, как должно выглядеть содержимое параметра ИмяФайлаНаФТП? При попытке отправить файл, возвращается код «6» и ошибка «Не удалось отправить файл по причине: Ошибка записи файла-получателя». Помогите разобраться.
(13) Gennadiy83,
0001/file1.txt
положить в каталог 0001
или
/file1.txt
положить в корневой каталог ФТП
вот реальный пример
storage/sdcard0/Download/To1C.zip
загружаю файл на телефон
При подключении к серверу начальный каталог не указывается. При подключении через браузер или проводник, локальный каталог не указываю и не вижу. Вероятнее всего при подключении к ftp сразу перенаправляет в нужную папку. Знаю, что на ftp каждому дистрибьютору соответствует папка по логину подключения.
Пробовал установить каталог вызовом процедуры ФтпУстТекКаталог(имяПапкиНаFTP), но генерируется ошибка.
Подозреваю, что ftp работает в пассивном режиме, есть ли возможность установки соединения с ftp-сервером в таком режиме?
(16) Gennadiy83, попробуйте DialMail.dll — она, пожалуй, лучшая. Работает в пассивном режиме (пятый параметр 1, при подключении). Пользуюсь давно, но выложить руки так и не дошли.
На фото рабочий пример кода, где параметры:
Каталог — куда отправить на ФТП, например «1001/1002»
Вложения — список значений, каждое значение которого — полное имя файла на диске; представление — имя файла, без каталогов, как его записать на ФТП, например:
Вложения.ДобавитьЗначение(КаталогИБ() + «EUR.spl», «EUR.spl»);
Огромное спасибо за помощь, попробую в ближайшее время, обязательно отпишу по результатам
(19) Gennadiy83, гугл в помощь, как говорится, вероятно проблема на стороне сервера.
В любом случае спасибо за помощь)
Как через библиотеки АгентПлюс получить список файлов на ftp?
(22) на сколько я знаю, никак, здесь поможет dialmail.dll
(23) Так и есть. Нет там таких методов.
Выкрутился из ситуации получив список файлов curl-om.
Так же выяснилось что Агент Плюс не любит русские символы.
Привет. Есть замечательная программка
Складываем файлы в папку — Архивируем любым архиватором !!!ставим пароль на архив!!!
В батнике пишем
echo Пробуем выгрузить изменения.
ncftpput.exe -u ftp_user -p ftp_pass -F %DebugMode% http://ftp.company.ru . %PC_Folder%MG1D.zip
Сами файлы можно забрать у разработчика с описанием и примерами
http://www.ncftp.com/ncftp/
При этом версия 1с не имеет значения.