Дай дернуть! О веб-сервисах, Linux'ах и добрых поисковых сайтах

30.12.15

Интеграция - Сайты и интернет-магазины

О веб-сервисах, апачах и *nix'ах.
- установим на новенький убунту старенький апач с php.
- дернем сервис из php-скрипта.
- создадим приложение, позволяющее дергать произвольный сервис с произвольными данными.
- ну и что там получится по пути в лес...

Начнем...

Как оказалось, лучшее - враг хорошего. По всей видимости, именно этим постулатом руководствовались создатели 1С, когда пилили в ней последние фичи с HTTP-сервисами и прочей OData. Иначе как объяснить, что 1С не работает с новыми версиями Apache 2.4 (по крайней мере в Linux'е). И если пользоваться необновленными программами - это любимое дело пользователей окон, то с Linux такая тема так просто не проходит - если уж он обновляется, то методично и капитально. Правда, в отличие от последних версий окошек, в Linux можно и не запускать обновление, просто проигнорировав зеленый значек на панели приложений (если у Вас Unity и Ubuntu).

Установка апача 2.2 для 1С

Для того, чтобы поставить старую версию apache, нужно всего-ничего: создать пару-тройку файлов со следующим содержимым:

1. /etc/apt/sources.list.d/ubuntu1204.list со следующим содержимым:

deb http://ru.archive.ubuntu.com/ubuntu/ precise main

Этот файл позволяет устанавливать пакеты с дистрибутива Ubuntu 12.04. В этом дистрибутиве апач еще старый - версии 2.2.

2. Создадим три файла в каталоге /etc/apt/preferences.d/:

2.1. apache22

Package: apache*
Pin: release a=precise
Pin-Priority: 500

2.2. libapache2

Package: libapache2*
Pin: release a=precise
Pin-Priority: 500

2.3. php5

Package: php5*
Pin: release a=precise
Pin-Priority: 500

Суть этих записей в том, что при установке пакетов, начинающихся с apache, libapache2 и php5 будет использоваться источник "precise" (Ubuntu 12.04), который мы указали в первом файле.

Дальше все просто для Linux:

sudo apt-get install apache2 php5 libapache2-mod-php5

Ждем, пока пакеты скачаются и установятся, и вот у нас апач 2.2 + php. Дальше можно поставить серверную 1С и постгрес. Как ее поставить, я вам не буду рассказывать, ибо количество людей, это рассказавших, давно уже перевалило за тысячу. Если поискать в гугле, то найдется масса мануалов:

http://sibtone.ru/?id=1c8.3ubuntu

http://www.avtomat.biz/blog/ustanovka-1s-predpriyatie-83-v-ubuntu-linux#.VoLGgXWLTCI

Ну и Инфостарт тут тоже чуток отметился форумом: http://forum.infostart.ru/forum74/topic119091/

Публикация 1С на вебсервисе

Для публикации я использую утилиту wininst, которая идет в поставке с 1С. Для этого пишу такое заклинание:

cd /opt/1C/v8.3/x86_64/
sudo ./webinst -apache22 -wsdir test -dir /var/www/TestPub -connstr "Srvr=192.168.1.5;Ref=utdemo" -confPath /etc/apache2/httpd.conf

В данном конкретном случае я опубликовал базу utdemo, расположенную на сервере 192.168.1.5 (параметр -connstr). Каталог вебсервера /var/www/TestPub. Имя публикации "test", путь к файлу конфига апача "/etc/apache2/httpd.conf".

Перезапускаем сервер:

sudo /etc/init.d/apache2 restart

В итоге у нас появился каталог /var/www/TestPub и в нем файл default.vrd, а в файле /etc/apache2/httpd.conf появились следующие строчки:

# 1c publication
Alias "/test" "/var/www/TestPub/"
<Directory "/var/www/TestPub/">
    AllowOverride All
    Options None
    Order allow,deny
    Allow from all
    SetHandler 1c-application
    ManagedApplicationDescriptor "/var/www/TestPub/default.vrd"
</Directory>

Проверяем, для этого пришем в браузере http://localhost/test. Все работает!

Публикуем веб-сервисы

Для этого нам нужно залезть шаловливыми ручками в наш файл default.vrd, в котором описаны веб-инструменты. Сейчас он в таком виде:

<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
		xmlns:xs="http://www.w3.org/2001/XMLSchema"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		base="/test"
		ib="Srvr=192.168.1.5;Ref=utdemo"/>

Для того, чтобы опубликовать веб-сервисы, надо их список добавить в файл. Точка входа в сервис добавляется после тега ws вот таком вот образом:

<ws>
	<point name="Exchange"
		alias="exchange.1cws"
		enable="true"/>
	<point name="Exchange_2_0_1_6"
		alias="exchange_2_0_1_6.1cws"
		enable="true"/>
	<point name="InterfaceVersion"
		alias="InterfaceVersion.1cws"
		enable="true"/>
	<point name="ManagedApplication_1_0_0_1"
		alias="ManagedApplication_1_0_0_1.1cws"
		enable="true"/>
	<point name="MessageExchange"
	    alias="messageexchange.1cws"
	    enable="true"/>
	<point name="MessageExchange_2_0_1_6"
	    alias="messageexchange_2_0_1_6.1cws"
	    enable="true"/>
	<point name="MobileService"
	    alias="mobile.1cws"
	    enable="true"/>
	<point name="RemoteAdministrationOfExchange"
	    alias="RemoteAdministrationOfExchange.1cws"
	    enable="true"/>
	<point name="RemoteAdministrationOfExchange_2_0_1_6"
	    alias="RemoteAdministrationOfExchange_2_0_1_6.1cws"
	    enable="true"/>
	<point name="RemoteAdministrationOfExchange_2_1_6_1"
	    alias="RemoteAdministrationOfExchange_2_1_6_1.1cws"
	    enable="true"/>
	<point name="RemoteControl"
		alias="RemoteControl.1cws"
		enable="true"/>
	<point name="SiteExchange"
		alias="ExchangeWithSites.1cws"
		enable="true"/>
	</ws>

Итак, я опубликовал все вебсервисы, которые есть у меня в конфе.

Для того, чтобы получить wsdl-файл для сервиса от 1С, в браузере надо написать так:

http://localhost/test/ws/ИмяСервиса?wsdl

В качестве имени введем стандартное "Федоров (администратор)" и получим наш xml.

 

Веб-сервисы опубликованы и дергаются. Дело за малым - использовать дергание в мирных научных целях и заставить 1С выдать в браузер не абстрактный малокомунужный XML, а какой-нибудь не менее абстрактный, но всем понятный пример типа "Hello, World!".

Для этого давайте напишем php-скриптик, который будет дергать наш сервис:

<?php
	function Connect1C(){
		if (!function_exists('is_soap_fault')){
			print 'Не настроен web сервер. Не найден модуль php-soap.';
			return false;
		}
		try {
		  $Клиент1С = new SoapClient('http://192.168.1.5/test/ws/RemoteControl?wsdl',
								   array('login'          => 'Федоров (администратор)',
										 'password'       => '',
										 'soap_version'   => SOAP_1_2,
										 'cache_wsdl'     => WSDL_CACHE_NONE, //WSDL_CACHE_MEMORY, //, WSDL_CACHE_NONE, WSDL_CACHE_DISK or WSDL_CACHE_BOTH
										 'exceptions'     => true,
										 'trace'          => 1));
		}catch(SoapFault $e) {
		  trigger_error('Ошибка подключения или внутренняя ошибка сервера. Не удалось связаться с базой 1С.', E_ERROR);
		}
		if (is_soap_fault($Клиент1С)){
		  trigger_error('Ошибка подключения или внутренняя ошибка сервера. Не удалось связаться с базой 1С.', E_ERROR);
		  return false;
		}
		return $Клиент1С;
	  }
	 
	  function GetData($idc){
		  if (is_object($idc)){
	 
			try {
								
				$ret1c = $idc->GetCurrentState();
				
			} catch (SoapFault $e) {
						  echo "Ошибка</br>";
						  var_dump($e);
						  var_dump($ret1c);
			}   
		  }
		  else{
			echo 'Не удалось подключиться к 1С<br>';
		  }
		return $ret1c;
	  }
	 
	$idc = Connect1C();
	$ret1c = GetData($idc);
	echo $ret1c->return."<br>\n";
?>

Итак, давайте разберемся, что в этом коде что делает. Собственно, здесь определены две функции: Connect1C() - устанавливает соединение с 1С, и GetData() - дергает нужный нам веб-сервис.

Для подключения алгоритм такой:

1. Проверяем, есть ли расширение для SOAP. Если нет - возвращаемся с ошибкой.

2. Создаем объект "SoapClient", и инициализируем его. В качестве аргументов передаем точку входа в наш сервис и ассоциативный массив параметров с логином, паролем, версией SOAP и прочими рюшками.

3. Если не произошло никаких исключений, то возвращаем полученный объект.

Для дергания сервиса алгоритм еще проще:

1. Проверяем, существует ли объект. Если нет - возвращаемся.

2. Дергаем функцию сервиса по имени.

3. Если ошибок на было, то возврашаем результат.

Результат функции содержится в параметре return. В итоге мы просто выводим его на нашу страницу: 

echo $ret1c->return."<br>\n";

Вот и весь Hello, world! Остается только в 1С поменять тип возвращаемого параметра для функции GetCurrentState веб-сервиса RemoteControl и вместо Возврат Истина написать Возврат "Hello, World!":

 

Параметры функций веб-сервисов.

Остается разобраться с вопросом о том, как передавать в функцию веб-сервиса параметры. В принципе достаточно просто:

function GetData($idc){
  if (is_object($idc)){

	try {
		$params["Number"] = $_GET["Number"];
		$params["ID"] = $_GET["ID"];
		$params["bt"] = $_GET["bt"];
		$params["Type"] = $_GET["Type"];
		$params["Date"] = $_GET["Date"];
		
		$ret1c = $idc->GetDocument($params);
		
	} catch (SoapFault $e) {
				  echo "АЩИБКА!!! </br>";
				  var_dump($e);
				  var_dump($ret1c);
	}   
  }
  else{
	echo 'Не удалося подключиться к 1С<br>';
  }
return $ret1c;
}

В данном случае я передаю параметры Number, ID, bt, Type и Date в функцию GetDocument одного из вебсервисов, а данные для я беру из формы веб-страницы. Т.е. вебстраница была дернута так: localhost/mtscript.php?Number=1&ID=001&bt=123&Type=001&Date=29.12.2015

В итоге все эти данные будет переданы в функцию вебсервиса.

Приложение для дергания сервисов создадим позднее, когда все проспятся от новогодних хлопот.

 

С новым годом, уважаемые граждане, с новым сервисом!

вебсервисы web-сервисы apache2 php

См. также

API-интеграция 1С с маркетплейсами ОЗОН, WildBerries, Я.Маркет, СберМегаМаркет, Стройландия, Леруа Мерлен, Hoff, AliExpress для УТ11, КА2, ERP2, УНФ, БП3, Розница, УТ10, УПП1.3

Сайты и интернет-магазины Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Беларусь Россия Управленческий учет Платные (руб)

Модуль для интеграции с маркетплейсами ОЗОН, WildBerries, Я.Маркет, СберМегаМаркет, Стройландия, Леруа Мерлен, Hoff, AliExpress. При помощи расширения поддерживаются следующие методы: обмен остатками товаров, обмен ценами, обработка заказов, печать стикеров, загрузка отчетов комиссионеров по API (в том числе Я.Маркет). Подходит для конфигураций Беларуси. Поддержка искусственного интелекта GigaChat

59990 руб.

05.09.2023    8260    124    74    

78

Интеграция Альфа Авто 5 / Альфа Авто 6 и AUTOCRM / Инфотек

Сайты и интернет-магазины WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    15930    13    18    

13

Оплата покупок "Долями" в 1С:Розница 2.3 (для работы с сервисом dolyame.ru)

Сайты и интернет-магазины Платформа 1С v8.3 1С:Розница 2 Розничная и сетевая торговля (FMCG) Россия Платные (руб)

Готовое интеграционное решение для оплаты покупок Долями в 1C:Розница 2.3. Реализовано в виде расширения. Интеграция сервиса dolyame.ru для приема платежей в рассрочку.

18000 руб.

19.12.2023    1512    12    3    

8

Обмен данными с сайтом. БП 3.0

Оптовая торговля Розничная торговля Сайты и интернет-магазины Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Обмен данными с сайтом на платформе 1С:Битрикс (и подобными) для 1С: Бухгалтерия предприятия 3.0.

12000 руб.

18.03.2019    31508    111    100    

64

Интеграция 1С — Битрикс24. Обмен задачами

Сайты и интернет-магазины Интеграция WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Управленческий учет Платные (руб)

Интеграция 1С и Битрикс24. Разработка имеет двухстороннюю синхронизацию 1С и Битрикс24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (8.3.18.1289). При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

5040 руб.

04.05.2021    17880    6    15    

13

Универсальный парсер интернет-магазинов

Оптовая торговля Розничная торговля Сайты и интернет-магазины Платформа 1С v8.3 Управляемые формы 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Управленческий учет Платные (руб)

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

9600 руб.

19.10.2018    52177    220    99    

111
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. gigapevt 25 31.12.15 08:12 Сейчас в теме
"sudo /etc/init.d/apache2 restart" можно заменить на "sudo service apache2 restart". Как то привычнее.
+
2. starik-2005 3036 31.12.15 08:58 Сейчас в теме
(1) gigapevt, можно и так.
+
3. Danila-Master 116 05.01.16 08:35 Сейчас в теме
Поделюсь своим методом "дергать" веб-сервис. В место PHP, я использую HTML+javascript.
В моей базе есть веб-сервис, куда нужно передать ИИН (Идентификационный индивидуальный номер), а веб-сервис вернет ФИО сотрудника. Вот такой маленький пример.
Код:
<html>
<head>
    <title>SOAP JavaScript Client Test</title>
    <script type="text/javascript">
        function soap() {
            var xmlhttp = new XMLHttpRequest();
            xmlhttp.open('POST', 'http://1c-web/zup/ws/ws1.1cws?GetFIO', true, '<Login>', '<password>');
            // build SOAP request

            var iin = document.getElementById("iin").value;
            var sr =
                '<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:zup="http://1c-web/zup">' +
	'<soap:Header/>' +
	'<soap:Body>' +
	'<zup:GetFIO>' +
	'<zup:iin>' + iin + '</zup:iin>' +
	'</zup:GetFIO>' +
	'</soap:Body>' +
	'</soap:Envelope>';

            xmlhttp.onreadystatechange = function () {
                if (xmlhttp.readyState == 4) {
                    if (xmlhttp.status == 200) {
            //alert(xmlhttp.responseText);
		var memo = document.getElementById("memo");
		memo.innerHTML = xmlhttp.responseText;
                    }
                }
            }
            // Send the POST request
            xmlhttp.setRequestHeader('Content-Type', 'text/xml');
      xmlhttp.setRequestHeader('charset', 'utf8');
            xmlhttp.send(sr);
            // send request
            // ...

        }
    </script>
</head>
<body>
    <form name="Demo" action="" method="post">
        <div>
	ИИН: <INPUT id="iin" name="iin"/>
	
	<input type="button" value="Soap" onclick="soap();" />
	<p id="memo"> </p>
        </div>
    </form>
</body>
<html>
Показать


В строке
xmlhttp.open('POST', 'http://1c-web/zup/ws/ws1.1cws?GetFIO', true, '<Login>', '<password>');
можно указать логин и пароль, иначе при каждом запросе будет появлятся системное окно для авторизации.
+
5. kanyuk 29.10.17 22:57 Сейчас в теме
(3)


SOAP JavaScript Client Test

function soap() {
var xmlhttp = new XMLHttpRequest();
xmlhttp.open('POST', 'http://1c-web/zup/ws/ws1.1cws?GetFIO', true, '', '');
// build SOAP request

var iin = document.getElementById("iin").value;
var sr =
'' +
'' +
'' +
'' +
'' + iin + '' +
'' +
'' +
'';

xmlhttp.onreadystatechange = function () {
if (xmlhttp.readyState == 4) {
if (xmlhttp.status == 200) {
//alert(xmlhttp.responseText);
var memo = document.getElementById("memo");
memo.innerHTML = xmlhttp.responseText;
}
}
}
// Send the POST request
xmlhttp.setRequestHeader('Content-Type', 'text/xml');
xmlhttp.setRequestHeader('charset', 'utf8');
xmlhttp.send(sr);
// send request
// ...

}





ИИН:






Показать
+
4. пользователь 30.05.16 20:54
Сообщение было скрыто модератором.
...
Оставьте свое сообщение