Блог → Стыковка базы V7 с витриной интернет магазина. Часть 3

Итак, с задачей мы определились. Переходим к обзору необходимого инструментария. Для начала, очевидно, что обмен данными между частями системы будет происходить через Интернет. Как следствие, вариантов при выборе транспорта будет немного: HTTP, FTP или электронная почта. Причем необязательно использовать один и тот же транспорт для движения в обе стороны, скажем, учётная система может закачивать задачи для web-витрины по FTP, а получать от него задачи по E-mail. Лично я бы предпочел бы FTP в обе стороны, но это, в принципе, дело вкуса.

На стороне web-витрины проблем с передачей и получением данных возникнуть не должно: в случае FTP и/или HTTP нужно просто положить файл в директорию или забрать файл из директории (логично будет организовать "обменный пункт" на стороне web-витрины). В случае E-mail нужно будет, конечно, приложить руки, но на любом web-сервере всегда найдется софт для работы с электронной почтой. А вот на стороне V7 обязательно понадобится дополнительный инструментарий - коммуникационные возможности в состав платформы не входят, их придется найти и установить самостоятельно.

Для начала, давайте посмотрим, как может осуществляться отсылка и получение электронной почты из-под V7. Есть два типа компонент, позволяющих работать с E-mail на платформе V7. К первому типу относится библиотека V7Plus (собственная разработка фирмы "1С", которая распространяется в составе типовых конфигураций и на CD информационно-технической поддержки). Эта библиотека не имеет собственной реализации POP3 и SMTP, а представляет собой мост между V7 и установленным в системе пользователя MAPI-совместимым почтовым клиентом.

Преимуществом V7Plus является то, что все принимаемые и отсылаемые письма "оседают" в общей почтовой базе - таким образом сохраняется вся история работы. В пользу V7Plus говорит и её многофункциональность - она умеет работать не только с почтой, но и с HTTP, MSXML, и большими текстовыми файлами. Но V7Plus работает не с любым почтовым клиентом, да и стабильность работы цепочки V7 - V7Plus MAPI временами оставляет желать лучшего. Давно известно, что чем больше в системе элементов и связей между ними, тем больше у системы возможностей "упасть".

Ко второму виду относятся библиотеки, в которых реализован полноценный POP3 и/или SMTP-клиент. В частности, это Mail (отсылка и получение почты, автор Алексей Приходько) и Sendmail2 (только отсылка, автором библиотеки является Дмитрий Дурандин). Эти компоненты умеют работать с почтовыми серверами напрямую, без обращений к почтовому клиенту, и как следствие - цепочка передачи данных получается короче, а значит, и система в-целом работает стабильнее. Но вот о хранении архива полученных о отправленных писем придётся позаботиться отдельно. И еще такой нюанс: обе компоненты распространяются как freeware, т.е. техническая поддержка не гарантируется, и возможные проблемы придется решать самостоятельно (в случае проблем с V7Plus можно обратится на горячую линию фирмы "1С" - правда, не факт, что оттуда действительно придёт решение, а не отписка).

Какую именно библиотеку для работы с электронной почтой выбрать - личное дело каждого, в принципе, оба вида были проверены на практике и вполне доказали свою работоспособность. Мы же переходим к выполнению НТТР-запросов из-под V7. Для нас существует два способа выполнить HTTP-запрос: либо взять библиотеку V7Plus и воспользоваться её классом V7HttpReader, либо использовать стороннее приложение. С V7Plus все довольно просто: послали запрос, получили результат (в строку или в файл), и начинаем разбирать, что именно мы получили. V7HttpReader имеет довольно скромные возможности, и не свободен от мелких недочетов (скажем, если мы обращаемся к несуществующему сетевому ресурсу, то получаем сообщение об ошибке, которое пугает пользователя и почему-то не подавляется штатной конструкцией Try - Except). Тем не менее, для простых задач типа "скачать файл" эта компонента вполне подойдет. Есть и другие способы достучаться до HTTP. Например, можно установить ActivePerl (http://www.acth/e-ware.com/) и использовать для выполнения НТТР-запросов Perl-скрипты (не нужно ничего изобретать, достаточно взять модули LWP и HTTP). При этом тексты скриптов можно динамически генерировать прямо из V7 - ведь Perl-скрипт, в сущности, является простым текстовым файлом. Для запуска Perl-скриптов из-под V7 подойдет метод RunApp(), только нужно не забыть про ассоциацию файлов *.pl с интерпретатором perl.exe.

Если же в системе установлен MS .NET Framework, то можно воспользоваться им. Этот способ вроде бы нигде еще описан не был, я обнаружил его случайно - но тем не менее, он работает. Для работы с HTTP нужно взять класс System.Net.WebClient - едва ли не единственный класс .NET, методы которого доступны через СОМ любому приложению. Делается это так. Вначале нужно зарегистрировать COM-объект в системе:

regasm /codebase system.dll


Теперь можно обращаться к web-клиенту непосредственно из V7:

Web = CreateObject
("System.Net.WebClient");
Web.DownloadFile
("http://domain.ru/index.html","c:\temp\domain.html");


Что касается доступа по FTP из-под V7, то такой вариант выглядит наиболее логичным способом обмена между web-магазином и учётной системой - в конце концов, ведь на то он и File Transport Protocol, чтобы качать файлы туда-сюда. Но, к сожалению, внешних компонент для V7, реализующих полноценную работу с FTP, в природе не существует. Под полноценной работой с FTP понимается передача файлов в обе стороны, авторизованный вход на FTP-сервер, поддержка прокси, и пр. Таких компонент пока что не написано.

Как же можно получить доступ к FTP? Вариантов два: либо взять готовый консольный FTP-клиент, либо написать что-то своё. Консольных клиентов в природе существует много и разных, самый простой (ftp.exe) входит в стандартный набор утилит операционной системы Microsoft Windows. Обращение к FTP будет состоять в том, чтобы через RunApp() запустить FTP-клиент с нужными ключами и параметрами. Впрочем, можно не брать готовый FTP-клиент, а написать свой. Это не так трудно, как кажется - разумеется, если писать не с нуля на C++, а взять такую среду, где весь нужный функционал уже есть, и осталось только сделать для него удобную "морду". Скажем, написать консольный FTP-клиент на Perl можно за полдня. Вот как выглядит простейший сеанс работы с FTP на Perl:

use NET::Ftp;

# коннектимся через прокси-сервер
$ftp = Net::FTP->
new("123.123.123.123",Firewall =>
"192.168.0.1");

# авторизуемся на FTP-сервере
$ftp->login
('MyCoolLogin','MyCoolPassword') II die $!;

# заходим в нужную директорию
$ftp->cwd('files');

# скачиваем файл с сервера
$ftp->get('file.txt','c:
ew_file.txt');

# закачиваем файл на сервер
$ftp->put('c:\file.txt','new_file.txt');

# отключаемся от сервера
$ftp->quit();


Можно взять .NET, и в целях повышения собственной квалификации попробовать написать FTP-клиент на C# (всё нужное для этого уже есть в .NET Framework). Вообще, ответ на вопрос "брать готовое или писать своё" обычно сводится к другому вопросу - "хочу ли я научится чему-то новому и достаточно ли у меня времени для этого". Ну и на сегодня на этом - всё, до встречи в моём блоге завтра!