Код с примером внизу поста
--
Для работы с обменом 1С и вашим сайтом, нужно хотя бы маломальски уметь работать с xml.
Особых знаний не нужно, нужно только взять файл, прочитать, пробежать в цикле по узлам и занести в базу нужные данные.
Протокол обмена данными и как все происходит, почитать можно здесь
http://v8[dot]1c[dot]ru/edi/edi_stnd/131/
Далее немного рассмотрим только обмен товаров на сайт. Рассматривать обмен заказами не будем, т.к. если поймете обмен товарами, то с обменом заказов проблем не будет.
Сначала создайте у вас на сайте php файлик(допустим 1c_exchange.php) для обмена данных и каталог, куда будете загружать файлы обмена.
В 1с настройте обмен данными с web-сайтом. Указав какие товары, цены, остатки будете выгружать.
Отмечайте чекбокс - Выгрузка товаров.
В поле
Адрес сайта укажите путь
http://site.ru/1c_exchange.php
Логин и
пароль пока оставьте пустым.
Сам процесс. Простыми словами.
Обмен товаров происходит в 4 этапа. На каждом этапе 1С будет отправлять разные http-запросы, и ждать ответ от сервера.
1. Начало сеанса
1С пуляет вам http-запрос запрос на аторизацию: /1c_exchange.php?type=catalog&mode=checkauth
*type=catalog - говорит о том, что будет осуществляться выгрузка товаров.
*mode=checkauth - запрос на авторизацию.
Естественно все это дело попадет в массив $_GET.
Далее 1с ждет ответ от сервера в виде строки
success или
failure
Если вы не проверяете на логин и пароль и не указываете их в 1С, просто отправьте обратно строку echo "success\n";
Если вы хотите работать с авторизацией, то логин и пароль будет лежать в $_SERVER['PHP_AUTH_USER'] и $_SERVER['PHP_AUTH_PW'];
Достаете, проверяете на соответствие и оправляете ответ.
Если 1C получает success,- продолжает процесс.
2. Запрос параметров от сайта
1С пуляет вам http-запрос запрос : /1c_exchange.php?type=catalog&mode=init
Тут она спрашивает, умеет ли ваша система работать с zip архивами?
PHP прекрасно работает с ZIP, поэтому отвечаем 1C -
zip=yes
Иначе, 1с будет загружать файлы не в архиве.
3. Выгрузка на сайт файлов обмена
1С пуляет вам http-запрос запрос : /1c_exchange.php?type=catalog&mode=file&filename=<имя файла>
На этом этапе принимаем файл, распаковываем его. Достаем из архива два xml файла.
import.xml и
offers.xml
отвечаем 1С
success, ну и соответственно
failure, если что-то не получилось.
И начинается самая важная часть.
4.1 Пошаговая загрузка каталога
1С пуляет вам http-запрос запрос : /1c_exchange.php?type=catalog&mode=import&filename=<имя файла>
В <имя файла> будет храниться значение
import.xml
На этом этапе вы берете файл import.xml и начинаете его парсить.
Как известно, самая простая читалка - это
simpleXml, но здесь на ваш вкус и цвет
Читаете файл, берете данные, записываете себе в базу данных.
Здесь лирическое отступление и вот на что стоит обратить внимание.
1с формирует 2 файла для отправки
import и
offers
В import она кладет каталоги(категории), товары, а в offers - цены и всякие опции....цвет, размер и т.д.
Естественно у каждой категории и товара 1с дает уникальный идентификатор, по которому идет связь.
НО!
Версии 1с могут отличаться и может случиться так, что выгрузка будет разная, все будет наоборот. Цены с товарами в import, а каталоги в offers.
В общем, перед выгрузкой изучите эти файлы и переделайте загрузчик под себя.
И так. Как только вы распарсили первый файл. отдаем 1с ответ
success
4.2 Пошаговая загрузка каталога
Здесь 1С пуляет вам http-запрос запрос : /1c_exchange.php?type=catalog&mode=import&filename=<имя файла>
где <имя файла> уже
offers.xml
Точно так же берем файл. Парсим, вставляем в базу.
И говорим 1Ске
success
Всё. На этом весь процесс заканчивается и 1С говорит вам -
Выгрузка товаров успешно завершена
Привожу пример. Файлик 1c_exchange.php, в котором все происходит.
Оформил в виде простого класса, да бы было все более менее понятно.
Реализация ни в коем случае не претендует на боевые условия, сделан специально для понимания. Хотя вполне себе рабочий вариант, можно поиграться
Аторизовывает, скачивает файлы, распаковывает. Но ничего не парсит, а эмулирует
success))))
Спойлер (Отобразить)PHP:
скопировать код в буфер обмена
<?PHP
class Exchange1c {
private $mode;
private $filename;
public function __construct() {
// принимаем значение mode
$this->mode = $_GET['mode'];
$this->filename = $_GET['filename'];
}
public function run(){
$mode = $this->mode;
// и здесь, в зависимости, что отправла 1С
// вызываем одноименный метод
/*
* 1. checkauth
* 2. init
* 3. file
* 4.1 import - [filename] => import.xml
* 4.2 import - [filename] => offers.xml
*/
$this->$mode();
}
/*
* Этап 1. Авторизовываем 1с клиента
*/
public function checkauth() {
echo "success\n";
}
/*
* Этап 2. Говрим 1с, умеем или не умеем работать с архивами
* в нашем случае - умеем :)
*/
public function init() {
echo 'zip='.$zip."\n";
echo "file_limit=0\n";
}
/*
* Этап 3. Принимаем файл и распаковываем его
*/
// вытаскиваем сырые данные
//Сохраняем файл импорта в zip архиве
// распаковываем
// работаем с zip
$zip = new ZipArchive;
//все в порядке с архивом?
if($res = $zip->open($this->filename, ZIPARCHIVE::CREATE)) {
// распаковываем два файла в формате xml куда-то
// в нашем случае в этот же каталог
$zip->extractTo(__DIR__);
$zip->close();
// удаляем временный файл
//Всё получилось?
echo "success\n";
}
}
// если ничего не получилось
echo "failure\n";
}
/*
* Этап 3 и 4 работаем с файлами обмена
*/
public function import() {
// используем читалку xml
if($xml && $this->filename == 'import.xml') {
/// обрабатываете import.xml как простой xml
//Считываете данные, подключаетесь к своей БД, записываете и т.д
//во время работы скрипта можете отправлять progress
// если все успешно закончилось отправляете успех
echo "success\n";
}elseif($xml && $this->filename == 'offers.xml') {
// обрабатываете offers.xml как простой xml
//Считываете данные, подключаетесь к своей БД, записываете и т.д
//во время работы скрипта можете отправлять progress
// если все успешно закончилось отправляете успех
echo "success\n";
}else{
echo "Ошибка загрузки XML\n";
echo "\t", $error->message;
}
}
}
}
$exaple = new Exchange1c();
$exaple->run();