Содержание


Загрузка товара из 1С 7.7 в интернет-магазин на примере CMS OpenCart

Часть 4. Автоматизация выгрузки и загрузки данных из 1С 7.7 в интернет-магазин и некоторые подводные камни

Comments

Серия контента:

Этот контент является частью # из серии # статей: Загрузка товара из 1С 7.7 в интернет-магазин на примере CMS OpenCart

Следите за выходом новых статей этой серии.

Этот контент является частью серии:Загрузка товара из 1С 7.7 в интернет-магазин на примере CMS OpenCart

Следите за выходом новых статей этой серии.

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

Автоматизация в 1С

Существует несколько способов запускать выполнение рассмотренных процессов автоматически. Рассмотрим два варианта. Во второй статье была получена обработка, которая записывала в табличный файл нужную информацию и отправляла его на ftp магазина. Чтобы эта обработка срабатывала через определенный промежуток времени, нужно ее превратить в процедуру глобального модуля программы, и из этого модуля с определенной периодичностью выполнять эту процедуру. Для этого в конфигураторе открывается Конфигурация, правой кнопкой мыши нажимается по верхней строчке конфигурации (название конфигурации) и выбирается в выпадающем меню Глобальный модуль. Затем нужно скопировать обработку и вставить ее перед первой функцией или процедурой и заменить Процедура Сформировать() на Процедура Выгрузка().

Таким образом в глобальном модуле появится Процедура Выгрузка(). Теперь, чтобы она запускалась, надо проверить в этом модуле наличие процедуры ПриНачалеРаботыСистемы() – для этого нужно нажать на значок бинокля внизу окна конфигуратора на нижней панельке и в открывшемся списке, где будут показаны все процедуры и функции глобального модуля, найти эту процедуру. Если есть такая процедура, то надо на нее нажать; если нет, то создать ее после последней функции или процедуры глобального модуля. В теле процедуры ПриНачалеРаботыСистемы() надо написать код, в котором будет вызываться Процедура Выгрузка() у определенного пользователя через каждые, например, 5 минут. Этот код показан в Листинге 1.

Листинг 1. Запуск процедуры Выгрузка в процедуре ПриНачалеРаботыСистемы().
Процедура ПриНачалеРаботыСистемы()
Если (СокрЛП(ИмяПользователя())="Робот") Тогда  
ОбработкаОжидания("Выгрузка", 300); 
КонецЕсли;
КонецПроцедуры

Затем нужно будет создать пользователя Робот, запустить его и через каждые 5 минут (300 секунд) система будет выгружать и отправлять данные под этим пользователем – ОбработкаОжидания() запускает процедуру Выгрузка() каждые 5 минут.

Автоматизация загрузки данных в интернет-магазине.

Данные из 1С выгружаются через каждые 5 минут. Теперь надо автоматизировать загрузку этих данных в магазин. Есть простой рецепт: в cron прописывается, чтобы через каждые 5 минут запускался php-скрипт zagryzka.php, описанный в третьей статье. На этом как бы и все: было получено то, что требовалось. Это первый вариант автоматизации, на котором можно и остановиться. Но если нет доступа к крону, то лучше использовать другой вариант.

Второй вариант автоматизации

В 1С все делается, как в первом варианте. Но затем надо будет добавить несколько строчек кода в процедуру Выгрузка() и ничего не делать со стороны интернет-магазина. В данном случае с помощью кода, показанного в Листинге 2, из 1С запускается php-скрипт zagryzka.php.

Листинг 2. Запуск из 1С php файла.
Попытка
Соединение = СоздатьОбъект("Addin.V7HttpReader");
Соединение.КоличествоПопытокАвторизации = 3;
Исключение
Сообщить("Не удалось создать объект Addin.V7HttpReader!");
КонецПопытки;
Адрес = "http://myshopchik.ru/ zagryzka.php";
Стр = "";
Попытка
Соединение.ПолучитьКакСтроку(Адрес, Стр);
Исключение
Сообщить("Неудачная попытка соединения.");
КонецПопытки;
Сообщить(Стр);

В Листинге 3 рассмотрим полный вариант кода в Глобальном модуле для второго варианта.

Листинг 3. Автоматизация загрузки-выгрузки в глобальном модуле, второй вариант.
Процедура Выгрузка ()
адрес_фтп = "myshopchik.ru";
логин = "dima";
пароль = "123456"; 
путь_к_файлу = "D:\1C_Base\dima\";
файлик = " D:\1C_Base\dima\export.csv";
Т=СоздатьОбъект("Текст");
СпрТМЦ=СоздатьОбъект("Справочник.Товары");
СпрТМЦ.ПорядокКодов();
СпрТМЦ.ВыбратьЭлементы();
Пока СпрТМЦ.ПолучитьЭлемент()>0 Цикл
Если СпрТМЦ.ЭтоГруппа()=1 Тогда
Продолжить;
КонецЕсли;
Если ПустоеЗначение(СпрТМЦ.Интернет_Категория) = 1 Тогда
Продолжить;
КонецЕсли;    
Если СпрТМЦ.Интернет_Категория.Наименование = "НЕ В ИНТЕРНЕТ" Тогда
Продолжить;
КонецЕсли;	
Артикул = Сокрлп(СпрТМЦ.Артикул);
Если  СпрТМЦ.Актуален=Да Тогда 
Актуальность = 7;
Иначе 
Актуальность = 5;
КонецЕсли;
Т.ДобавитьСтроку(СпрТМЦ.Код+"^"+СпрТМЦ.Наименование+"^"+Артикул+"^"+
СпрТМЦ.Бренд.Наименование+"^"+СпрТМЦ.Розн_Цена+"^"+СпрТМЦ.Мел_Опт_Цена+"^"+
СпрТМЦ.Опт_Цена+"^"+СпрТМЦ.Парт_Цена+"^"+Актуальность+"^"+
СпрТМЦ.Интернет_Категория.Наименование+"^"+ТоварныйОстаток(СпрТМЦ));
КонецЦикла;
Файл="export.csv";
Т.Записать (Файл);
Сообщить ("Файл с данными "+Файл+" сохранен в каталоге пользователя");   

//подготавливаем файл с командами ftp
ВременныйСкриптФайл="InetFTP.tmp";
Т=СоздатьОбъект("Текст");
Т.ДобавитьСтроку("open "+Сокрлп(адрес_фтп));
Т.ДобавитьСтроку(Сокрлп(логин));
Т.ДобавитьСтроку(Сокрлп(пароль));
Т.ДобавитьСтроку("prompt");
Т.ДобавитьСтроку("binary");
Т.ДобавитьСтроку("quote pasv");
Т.ДобавитьСтроку("cd "+Сокрлп("www")); 
Т.ДобавитьСтроку("mkdir "+Сокрлп("obmen"));
Т.ДобавитьСтроку("cd "+Сокрлп("obmen"));
Т.ДобавитьСтроку("put flag.mod"); //посылаем проверочный флаг
Т.ДобавитьСтроку("mput *.mod");//get
Т.ДобавитьСтроку("mput "+файлик);//get
Т.ДобавитьСтроку("get flag.mod flag2.mod");//считываем - его
Т.ДобавитьСтроку("put flag2.mod");
Т.ДобавитьСтроку("quit");//выход
Т.Записать(путь_к_файлу+"\"+ВременныйСкриптФайл);
ФайлФлага=путь_к_файлу+"\flag.mod";
ФайлФлага2=путь_к_файлу+"\flag2.mod";
Т=СоздатьОбъект("Текст");
Т.ДобавитьСтроку("=Проверка связи=");
Т.Записать(ФайлФлага);
Если ФС.СУществуетФайл(ФайлФлага2)=1 Тогда
ФС.УдалитьФайл(ФайлФлага2);
КонецЕсли;
Фс.УстТекКаталог(путь_к_файлу);
Команда="ftp -s:"""+ВременныйСкриптФайл+""">ftp_out.log";
КомандаСистемы(Команда);
Фс.УдалитьФайл(путь_к_файлу+"\"+ВременныйСкриптФайл);
Рез=ФС.СУществуетФайл(ФайлФлага2); //если файл существует, то соединение было успешное
ФС.УстТекКаталог(КаталогИБ()); 

Если Рез=1 Тогда
Сообщить("Передача данных на ftp-сервер успешно завершена");
Иначе  
Сообщить("Ниче не отправилось, Ахтунг!!!!!");
КонецЕсли;
Попытка
Соединение = СоздатьОбъект("Addin.V7HttpReader");
Соединение.КоличествоПопытокАвторизации = 3;
Исключение
Сообщить("Не удалось создать объект Addin.V7HttpReader!");
КонецПопытки;
Адрес = "http://myshopchik.ru/zagryzka.php";
Стр = "";
Попытка
Соединение.ПолучитьКакСтроку(Адрес, Стр);
Исключение
Сообщить("Неудачная попытка соединения.");
КонецПопытки;
Сообщить(Стр);
КонецПроцедуры

Процедура ПриНачалеРаботыСистемы()
Если (СокрЛП(ИмяПользователя())="Робот") Тогда  
ОбработкаОжидания("Выгрузка", 300); 
КонецЕсли;
КонецПроцедуры

В этом варианте создается табличный файл, отправляется на ftp и вызывается скрипт zagryzka.php в 1С, который со стороны интернет-магазина обрабатывает табличный файл и записывает данные в базу сайта. Этот вариант намного интересней.

Подводные камни

Но рассмотрим несколько подводных камней, которые могут встретиться при работе этой конструкции.

Если при выгрузке данных в названии товара или в других полях встречается знак дюймов в виде двойных кавычек или просто двойные кавычки, то происходит такая неприятная ситуация, когда OpenCart, который написан на php, воспринимает эти кавычки как спецсимвол и обрезает дальнейший текст после этих кавычек. В базу данных текст записывается нормально, но при считывании из базы текст обрезается после этих кавычек. Поэтому надо кавычки при загрузке в базу заменить на спецсимвол html. Как вариант – можно в цикле находить кавычки и заменять их на html-код этого символа. Но за нас уже все придумали, и для этого существует функция htmlentities(), в которую помещается строка и в какой кодировке используется эта строка. В Листинге 4 показан кусок кода zagryzka.php, в котором поля табличного файла присваиваются массиву без использования этой функции, а в Листинге 5 – с этой функцией.

Листинг 4. Код zagryzka.php без функции htmlentities().
$arr[$c]['product_id']= $data[0] ;
$arr[$c]['name']= $data[1];
$arr[$c]['articul'] = $data[2] ;
$arr[$c]['brend']=$data[3];
$arr[$c]['rozn_cena']=$data[4] ;
$arr[$c]['melk_opt_cena']=$data[5];
$arr[$c]['opt_cena']=$data[6] ;
$arr[$c]['part_cena']=$data[7];
$arr[$c]['actual']=$data[8] ;
$arr[$c]['category']=$data[9];
Листинг 5. Часть кода zagryzka.php с использованием функции htmlentities().
$arr[$c]['product_id']= $data[0] ;
$arr[$c]['name']=htmlentities($data[1],ENT_COMPAT,"UTF-8");
$arr[$c]['articul'] = htmlentities($data[2] ,ENT_COMPAT,"UTF-8");
$arr[$c]['brend'] = $data[3];
$arr[$c]['rozn_cena']=$data[4] ;
$arr[$c]['melk_opt_cena']=$data[5];
$arr[$c]['opt_cena']=$data[6] ;
$arr[$c]['part_cena']=$data[7];
$arr[$c]['actual']= htmlentities($data[8] ,ENT_COMPAT,"UTF-8");
$arr[$c]['category']= htmlentities($data[9] ,ENT_COMPAT,"UTF-8");

Следующий подводный камень заключается в том, что все вышеописанное прекрасно работает, если 1С стоит на сервере 2000-2008 и используются подключения к серверу терминалов. Но если используется подключение к 1С по сети, то файл для выгрузки будет сохраняться не в домашней папке, а во временной. И чтобы отправка файла на ftp произошла, нужно изменить 5 и 6 строчку, описанные в Листинге 3 на такие:

путь_к_файлу = КаталогВременныхФайлов();
файлик = " КаталогВременныхФайлов()+"export.csv";

Теперь табличный файл будет сохраняться не в домашнюю папку, а во временную, и из нее будет забираться файл, такова специфика работы 1С по сети.

Заключение

В цикле статей «Загрузка товара из 1С 7.7 в интернет-магазин на примере CMS OpenCart» был рассмотрен способ выгрузки данных из 1С в интернет-магазин с последующей автоматизацией этих процессов, а также показаны несколько подводных камней и методов борьбы с ними, которые могут возникнуть при работе с сетевой версией 1С, а также при наличии двойных кавычек в тексте товара. Надеюсь, эти статьи помогут Вам сделать свой магазин, работающий с 1С , или заработать денег, сделав его заказчику.


Ресурсы для скачивания


Похожие темы


Комментарии

Войдите или зарегистрируйтесь для того чтобы оставлять комментарии или подписаться на них.

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Open source, Linux
ArticleID=859909
ArticleTitle=Загрузка товара из 1С 7.7 в интернет-магазин на примере CMS OpenCart: Часть 4. Автоматизация выгрузки и загрузки данных из 1С 7.7 в интернет-магазин и некоторые подводные камни
publish-date=02282013