Способ первый – внешняя компонента
На официальном сайте замечательной компании Агент ПЛЮС в разделе Скачать свободно доступны Конфигурации для 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 "+ФТПимяПользователя+":"+ФТПпароль+" "+ФТПсервер); // вот и всё
Достоинства: пассивный режим, относительно быстрый, достаточно лояльный к серверам.
Недостаток: нет возможности программно определить результат отправки.
В прилагаемом архиве содержится конфигурации со всеми описанными способами и примененными компонентами, что позволяет, указав параметры своего сервера, быстро определиться с подходящим решением.
О том как можно организовать регулярную автоматическую отправку отчетов можно узнать здесь.
Конечно же, есть и множество других способов решить поставленную в заголовке задачу, однако мне вполне хватает вышеизложенных. Все три способа на момент публикации реально используются, поэтому делюсь, чтобы другим помогло и самому не забыть.