Хочу рассказать историю одной интеграции и поделиться опытом.
Предыстория:
Как обычно спешка. сдать проект нужно уже вчера! Час на оценку проекта и в бой. На стадии планирования/проектирования проглядели что на сайте требуется информация по остаткам на разных складах и магазинах.
Когда это выяснилось лицензия на "Малый Бизнес" уже была со всеми согласована и куплена. А в этой редакции как известно предусмотрен только один склад.
История:
Нужно как то решать проблему. Первый вариант, который приходит на ум, кастомизировать компонент "bitrix:catalog.import.1c".
Не самая лучшая идея:
- Кастомизация как правило трудоёмкая, с костылями и велосипедами.
- Отказ от дальнейших обновлений компонента (меня всегда очень отпугивает).
- Усложняется поддержка проекта.
Переговорив с программистом 1-С решили пойти иным путём: На стороне 1-С реализуется [URL=http://v8.1c.ru/overview/Term_000000273.htm]web[/URL][URL=http://v8.1c.ru/overview/Term_000000273.htm]-сервис[/URL], который предоставляет остатки товаров (или товара) по складам.
Для программиста 1-С web-сервис - дело пустяковое. Для битрикса механизмов взаимодействия с web-сервисом к сожалению нету. Пишем ручками.
web-сервисы 1-С работают через протокол SOAP. Да конечно, это прошлый век. Сейчас все работают через REST-API и json, но 1-С весьма консервативна, поэтому SOAP!
Для работы через SOAP на PHP есть класс SoapClient.
Обычно взаимодействие выглядит весьма просто. Пример кода:
[CODE]$client = new SoapClient('http://188.188.188.188/dir/file.1cws?wsdl');
$response = $client->Ostatok(["Articl" => ""]);
$arStocks = $response->return->Состав;
[/CODE]Часто web-сервис требует авторизацию. Это тоже легко решается:
[CODE]$options = ['login' => "some_name", 'password' => "some_password"];
$client = new SoapClient('http://188.188.188.188/dir/file.1cws?wsdl', $options);
[/CODE]Добавляя дополнительные настройки $options можно решить различные проблемы соединения: ssl-соединения, соединение через proxy и прочие.
Однако в моем случае проблему через $options решить не удалось. Как выяснилось web-сервис работал с NTLM авторизацией через контроллер домена ldap на Microsoft-IIS.
Эти данные можно увидеть через-консоль браузера.
[IMG WIDTH=878 HEIGHT=439]https://nologostudio.ru/upload/unauthorized.jpg[/IMG]
К сожалению php класс SoapClient не поддерживает NTLM авторизацию. Немного погуглив я принял решение использовать библиотеку [URL=https://github.com/matejsvajger/ntlm-soap-client]ntlm-soap-client[/URL]
библиотека зависимая, поэтому устанавливать ее нужно через composer. Инструкция по установке прилагается к описанию проекта в гите.
Подключив библиотеку наш код получения остатков теперь такой:[CODE]<?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
CModule::IncludeModule("iblock");
require($_SERVER["DOCUMENT_ROOT"]."/local/php_interface/ntlm-soap-client/vendor/autoload.php");
$url = 'http://188.188.188.188/dir/file.1cws?wsdl';
$config = new matejsvajger\NTLMSoap\Common\NTLMConfig([
'domain' => 'http://188.188.188.188/',
'username' => 'some_name',
'password' => 'some_password'
]);
$client = new matejsvajger\NTLMSoap\Client($url, $config);
/*
Типы и функции SOAP-Сервера
echo "<pre>".print_r($client->__getFunctions(),1)."</pre>";
echo "<pre>".print_r($client->__getTypes(),1)."</pre>";
*/
$parameters["Articl"] = "";
$response = $client->Ostatok($parameters);
$arStocks = $response->return->Состав;
echo "Ostatok = <pre>".print_r($arStocks,1)."</pre>";
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_after.php");
?>
[/CODE]
Поскольку мой адрес web-сервиса был такой:
$url = '[URL=http://188.188.188.188:8888/dir/file.1cws?wsdl]http://188.188.188.188:8888/dir/file.1cws?wsdl[/URL]';
То мне пришлось дополнительно модифицировать библиотеку ntlm-soap-client:
- Файл /ntlm-soap-client/src/NTLMSoap/Common/NTLMConfig.php - Функция getAuthString
- Файл /ntlm-soap-client/src/NTLMSoap/Model/Traits/NTLMRequest.php - Функция __doRequest
После чего мучения закончились. В ответ получил массив с остатками, а дальше дело техники на усмотрение разработчика: записывать остатки в HL-Block или в свойства Товаров/Товарных предложений.
Предыстория:
Как обычно спешка. сдать проект нужно уже вчера! Час на оценку проекта и в бой. На стадии планирования/проектирования проглядели что на сайте требуется информация по остаткам на разных складах и магазинах.
Когда это выяснилось лицензия на "Малый Бизнес" уже была со всеми согласована и куплена. А в этой редакции как известно предусмотрен только один склад.
История:
Нужно как то решать проблему. Первый вариант, который приходит на ум, кастомизировать компонент "bitrix:catalog.import.1c".
Не самая лучшая идея:
- Кастомизация как правило трудоёмкая, с костылями и велосипедами.
- Отказ от дальнейших обновлений компонента (меня всегда очень отпугивает).
- Усложняется поддержка проекта.
Переговорив с программистом 1-С решили пойти иным путём: На стороне 1-С реализуется [URL=http://v8.1c.ru/overview/Term_000000273.htm]web[/URL][URL=http://v8.1c.ru/overview/Term_000000273.htm]-сервис[/URL], который предоставляет остатки товаров (или товара) по складам.
Для программиста 1-С web-сервис - дело пустяковое. Для битрикса механизмов взаимодействия с web-сервисом к сожалению нету. Пишем ручками.
web-сервисы 1-С работают через протокол SOAP. Да конечно, это прошлый век. Сейчас все работают через REST-API и json, но 1-С весьма консервативна, поэтому SOAP!
Для работы через SOAP на PHP есть класс SoapClient.
Обычно взаимодействие выглядит весьма просто. Пример кода:
[CODE]$client = new SoapClient('http://188.188.188.188/dir/file.1cws?wsdl');
$response = $client->Ostatok(["Articl" => ""]);
$arStocks = $response->return->Состав;
[/CODE]Часто web-сервис требует авторизацию. Это тоже легко решается:
[CODE]$options = ['login' => "some_name", 'password' => "some_password"];
$client = new SoapClient('http://188.188.188.188/dir/file.1cws?wsdl', $options);
[/CODE]Добавляя дополнительные настройки $options можно решить различные проблемы соединения: ssl-соединения, соединение через proxy и прочие.
Однако в моем случае проблему через $options решить не удалось. Как выяснилось web-сервис работал с NTLM авторизацией через контроллер домена ldap на Microsoft-IIS.
Эти данные можно увидеть через-консоль браузера.
[IMG WIDTH=878 HEIGHT=439]https://nologostudio.ru/upload/unauthorized.jpg[/IMG]
К сожалению php класс SoapClient не поддерживает NTLM авторизацию. Немного погуглив я принял решение использовать библиотеку [URL=https://github.com/matejsvajger/ntlm-soap-client]ntlm-soap-client[/URL]
библиотека зависимая, поэтому устанавливать ее нужно через composer. Инструкция по установке прилагается к описанию проекта в гите.
Подключив библиотеку наш код получения остатков теперь такой:[CODE]<?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
CModule::IncludeModule("iblock");
require($_SERVER["DOCUMENT_ROOT"]."/local/php_interface/ntlm-soap-client/vendor/autoload.php");
$url = 'http://188.188.188.188/dir/file.1cws?wsdl';
$config = new matejsvajger\NTLMSoap\Common\NTLMConfig([
'domain' => 'http://188.188.188.188/',
'username' => 'some_name',
'password' => 'some_password'
]);
$client = new matejsvajger\NTLMSoap\Client($url, $config);
/*
Типы и функции SOAP-Сервера
echo "<pre>".print_r($client->__getFunctions(),1)."</pre>";
echo "<pre>".print_r($client->__getTypes(),1)."</pre>";
*/
$parameters["Articl"] = "";
$response = $client->Ostatok($parameters);
$arStocks = $response->return->Состав;
echo "Ostatok = <pre>".print_r($arStocks,1)."</pre>";
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_after.php");
?>
[/CODE]
Поскольку мой адрес web-сервиса был такой:
$url = '[URL=http://188.188.188.188:8888/dir/file.1cws?wsdl]http://188.188.188.188:8888/dir/file.1cws?wsdl[/URL]';
То мне пришлось дополнительно модифицировать библиотеку ntlm-soap-client:
- Файл /ntlm-soap-client/src/NTLMSoap/Common/NTLMConfig.php - Функция getAuthString
- Файл /ntlm-soap-client/src/NTLMSoap/Model/Traits/NTLMRequest.php - Функция __doRequest
После чего мучения закончились. В ответ получил массив с остатками, а дальше дело техники на усмотрение разработчика: записывать остатки в HL-Block или в свойства Товаров/Товарных предложений.