Веб-сервисы идеально подходят для обмена данными между различными информационными системами. В этой статье я продемонстрирую, как можно сделать синхронизацию товаров с сайтом на простых примерах. В примерах будет использован язык PHP.
Самым простым случаем является вызов операций веб-сервисов 1С с сайта при необходимости. Например, при открытии сайта можно получить актуальный список товаров и их остатки.
Давайте для примера создадим простенькую базу 1С с одним справочником номенклатура, в котором будут храниться все необходимые данные, включая остатки.
И в этой базе создадим веб-сервис, который будет выдавать список товаров.
На рисунке изображен модуль ws-операции ПолучитьНоменклатуру() и ПакетXDTO, который содержит описание полей выгружаемой номенклатуры. Мы не используем отборы и выгружаем сразу весь список товаров. Более подробное о создании веб-сервисов в среде 1С вы сможете узнать на странице
1С:Предприятие 8. Веб-сервисы. Реализация веб-сервиса.
Для получения списка товаров на стороне сайта будет необходимо вызвать ws-операцию ПолучитьНоменклатуру() веб-сервиса "WebСервис" без параметров. В ответ будет получен массив объектов "Номенклатура" с полями:
- УникальныйИдентификатор
- Наименование
- Цена
- Остаток
Поле УникальныйИдентификатор необходимо для однозначного определения товара независимо от наименования.
Для работы с веб-сервисами в PHP существует класс SoapClient. Довольно легко с ним работать. Достаточно в вызове конструктора класса указать путь к WSDL веб-сервиса, логин пароль и уже можно работать. Давайте создадим страничку, например index1.php, и запишем туда следующий код:
header("Content-Type: text/html; charset=UTF-8");
$SoapClient1C = new SoapClient("
http://ghostaz.no-ip.org/sync/ws/WebСервис?wsdl");
$List = $SoapClient1C->ПолучитьНоменклатуру();
if(is_array($List->return->Список ))
{
foreach ( $List->return->Список as $key)
echo $key->УникальныйИдентификатор." ".$key->Наименование." ".$key->Цена." ".$key->Остаток." "."
";
} else
echo $List->return->Список->УникальныйИдентификатор." ".$List->return->Список->Наименование." ".$List->return->Список->Цена." ".$List->return->Список->Остаток;
?>
1С работает с UTF-8 потому в первой строке мы указываем кодировку. Далее мы создаем объект $SoapClient1C. ПРи его создании указываем ссылку на WSDL для нашего веб-сервиса. Узнать как формируется строка ссылки можно в статье
1С:Предприятие 8. Веб-сервисы. Публикация и тестирование.
В строке
$List = $SoapClient1C->ПолучитьНоменклатуру();
мы вызываем ws-операцию ПолучитьНоменклатуру(). Результат операции записываем в переменную &List.
Далее мы проверяем является ли этот результат массивом или содержит один элемент. Признаюсь честно, я не знаю почему 1C не выдает массив из одного элемента, а выдает просто объект и не знаю как это изменить. Ведь в таком случае приходится отдельно отрабатывать такой случай. В общем как вы видите, если результат операции является массивом, то код перебирает все элементы и выводит на экран, в противном случае выводит один элемент.
В результате запуска index1.php на экран будет выведено примерно следующее:
c5c291c5-3fe9-11e3-824f-083e8e40aa90 Гайки 120 5
2d490b6d-4f6a-11e3-beaf-28924a4e4c34 Гвозди 145 5
Это список товаров, которые заведены в базе 1С, с наименованием, ценой и количеством.
Этот способ синхронизации малопригоден для рабочих сайтов, так как при каждом открытии сайта или обновлении будет инициировано обращение к базе 1С, что замедлит работу сайта и увеличит трафик. Давайте улучшим текущую схему.
Для вывода на экран актуальных данных совсем не обязательно обращаться к базе 1С так часто, достаточно обратиться за получением остатков в момент их изменения и выводить эти данные до следующего изменения. Таким образом необходимо инициировать синхронизацию лишь в момент изменения данных в базе 1С, а полученные данные хранить на стороне хостинга. Момент, когда происходит изменение данных знает 1С, соответственно только она может инициировать синхронизацию. Для синхронизации она может вызвать какой либо скрипт, который из веб-сервиса получит остатки и запишет их в базу данных. План такой:
- Пользователь меняет справочник Номенклатура;
- Информационная база вызывает скрипт sync.php;
- Скрипт sync.php вызывает ws-операцию ПолучитьНоменклатуру() и помещает результат в таблицу tovar;
- Пользователь запускает index2.php, который выводит содержимое таблицы tovary.
На стороне базы 1С необходимо осуществить вызов скрипта sync.php. Данный вызов будем делать в процедуре ПослеЗаписиНаСервере формы справочника Номенклатура. Это крайне не оптимально, стоит использовать фоновые задания для вызова скриптов.
В данном коде мы используем GET запрос и вызываем скрипт "
http://sync.ghostaz.ru/sync.php". Все что скрипт выводит на экран, мы увидим во временном файле. Название файла хранится в переменной "УИ".
Для такой схемы нам нужно иметь базу данных и таблицу. Мы создадим таблицу с четырьмя полями:
- UID CHAR(36)
- Name VARCHAR(25)
- Cena REAL
- Ost REAL
Давайте посмотрим на результируюий код скрипта синхронизации. В комментариях я опишу назначение команд.
// устанавливаем кодировку
header("Content-Type: text/html; charset=UTF-8");
// создаем подключение к СУБД
$Link = mysql_connect ("localhost", "Логин", "Пароль") ;
// выбираем нужную базу данных
$rv = mysql_select_db("ghostaz", $Link);
// создаем таблицу товары если ее еще нет
mysql_query("CREATE TABLE IF NOT EXISTS tovary (UID CHAR(36) PRIMARY KEY, Name VARCHAR(25), Cena REAL, Ost REAL)");
// очищаем таблицу перед заполнением
mysql_query("DELETE FROM tovary");
// создаем клиент для веб-сервисов и вызываем операцию, которая в $List помещает массив номенклатуры
$SoapClient1C = new SoapClient("
http://ghostaz.no-ip.org/sync/ws/WebСервис?wsdl");
$List = $SoapClient1C->ПолучитьНоменклатуру();
// если ws-операция вернула массив
if(is_array($List->return->Список ))
{
// то перебираем весь список
foreach ( $List->return->Список as $key)
// и доавляем номенклатуру в базу
mysql_query("INSERT INTO tovary VALUES ('".$key->УникальныйИдентификатор."', '".$key->Наименование."', ".$key->Цена.", ".$key->Остаток.")");
} else
// если же это не массив, то одно единственное значение вносим в базу
mysql_query("INSERT INTO tovary VALUES ('".$key->return->Список->УникальныйИдентификатор."', '".$key->return->Список->Наименование."', ".$key->return->Список->Цена.", ".$key->return->Список->Остаток.")");
// проверяме что синхронизация прошла - выводим содержимое таблицы
$sql=mysql_query("SELECT * FROM tovary");
while($row = mysql_fetch_array($sql)) echo $row['UID']." ".$row['Name']." ".$row['Cena']." ".$row['Ost'].'
';
// закрываем соединение
mysql_close ($Link);
?>
Код файла index2.php может теперь содержать только вывод таблицы:
// устанавливаем кодировку
header("Content-Type: text/html; charset=UTF-8");
// создаем подключение к СУБД
$Link = mysql_connect ("localhost", "Логин", "Пароль") ;
// выбираем нужную базу данных
$rv = mysql_select_db("ghostaz", $Link);
//выводим содержимое таблицы
$sql=mysql_query("SELECT * FROM tovary");
while($row = mysql_fetch_array($sql)) echo $row['UID']." ".$row['Name']." ".$row['Cena']." ".$row['Ost'].'
';
// закрываем соединение
mysql_close ($Link);
?>
От себя добавлю, что данный способ синхронизации отлично работает в коммерческих проектах. Скорость отработки довольно высока. К примеру сложные и большие запросы отрабатываются за 0,2 секунды. Быстрые же запросы к веб-сервису могут заполнить 30 тысяч записей таблицы за 16 секунд.
Смотрите также:
Электронный учебник по программированию в 1С Рекомендации по изучению программирования 1С с нуля Игра "Кто хочет стать миллионером?" с вопросами на определенную тематику (язык программирования JavaScript, английские, немецкие, французские, испанские, португальские, нидерландские, итальянские слова, электробезопасность, промышленная безопасность, бокс и т.п.), написанная на 1С Программирование в 1С 8.3 с нуля - краткий самоучитель Комплексная подготовка программистов 1С:Предприятие 8.2 Сайты с уроками программирования и со справочниками Youtube-каналы с уроками программирования Сайты для обучения программированию Лекции и уроки