Дай дернуть! О веб-сервисах, 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

См. также

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

Готовое интеграционное решение для оплаты покупок Долями в 1C:Розница 2.3. Реализовано в виде расширения. Интеграция сервиса dolyame.ru для приема платежей в рассрочку. Поддерживает работу от разных юридических лиц. Работа: в составе РИБ, отдельно от РИБ, тонкий, толстый клиент, web-клиент (через интернет-браузер).

22440 руб.

19.12.2023    6195    41    11    

37

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

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

36000 руб.

03.08.2020    18599    20    22    

18

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

Готовое интеграционное решение для оплаты покупок Долями в 1C:Розница 3.0. Реализовано в виде расширения. Интеграция сервиса dolyame.ru для приема платежей в рассрочку. Поддерживает работу от разных юридических лиц. Работа: в составе РИБ, отдельно от РИБ, тонкий, толстый клиент, web-клиент (через интернет-браузер). Интегрировано в Чек ККМ, Рабочее место кассира (РМК)

24000 руб.

02.11.2024    776    3    0    

4

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

Склад Вашего магазина онлайн в Telegram. С картинками, ценами, описанием и характеристиками. Используйте Telegram как торговую площадку и увеличивайте продажи.

54000 руб.

10.09.2024    1050    2    4    

3

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

Интеграция 1С и Битрикс 24. Разработка имеет двухстороннюю синхронизацию 1С и Bitrix24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (платформа начиная с 8.3.23): 1С:Управление торговлей, 1С:Управление Нашей фирмой 3, 1С:Комплексная автоматизация 2, Объединенное решение: Модуль 1С:CRM 3 (3.0.21.3) +1С:ERP Управление предприятием 2. При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

7200 руб.

04.05.2021    20760    13    19    

18

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

Программа позволяет одним кликом настроить сбор цен ваших конкурентов или дилеров в интернете. Автоматически собирает данные результата поиска Яндекса (вам не придется вручную добавлять каждый сайт, за которым нужно следить). Обновление цен происходит по заданному вами расписанию автоматически. Можете легко отслеживать позиции вашего сайта в Яндексе по ключевым словам и фразам. Этот инструмент даст вам лучшее понимание того, как ваша SEO-стратегия влияет на видимость вашего сайта в поисковой выдаче, и поможет вам улучшить контент и структуру сайта для повышения его позиций. Функция доступна во всех тарифах.

19950 руб.

23.09.2019    31326    8    12    

31
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. gigapevt 26 31.12.15 08:12 Сейчас в теме
"sudo /etc/init.d/apache2 restart" можно заменить на "sudo service apache2 restart". Как то привычнее.
2. starik-2005 3098 31.12.15 08:58 Сейчас в теме
3. Danila-Master 118 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
Сообщение было скрыто модератором.
...
Оставьте свое сообщение