Хочу рассказать историю одной интеграции и поделиться опытом.
Предыстория:
Как обычно спешка. сдать проект нужно уже вчера! Час на оценку проекта и в бой. На стадии планирования/проектирования проглядели что на сайте требуется информация по остаткам на разных складах и магазинах.
Когда это выяснилось лицензия на "Малый Бизнес" уже была со всеми согласована и куплена. А в этой редакции как известно предусмотрен только один склад.
История:
Нужно как то решать проблему. Первый вариант, который приходит на ум, кастомизировать компонент "bitrix:catalog.import.1c".
Не самая лучшая идея:
- Кастомизация как правило трудоёмкая, с костылями и велосипедами.
- Отказ от дальнейших обновлений компонента (меня всегда очень отпугивает).
- Усложняется поддержка проекта.
Переговорив с программистом 1-С решили пойти иным путём: На стороне 1-С реализуется , который предоставляет остатки товаров (или товара) по складам.
Для программиста 1-С web-сервис - дело пустяковое. Для битрикса механизмов взаимодействия с web-сервисом к сожалению нету. Пишем ручками.
web-сервисы 1-С работают через протокол SOAP. Да конечно, это прошлый век. Сейчас все работают через REST-API и json, но 1-С весьма консервативна, поэтому SOAP!
Для работы через SOAP на PHP есть класс SoapClient.
Обычно взаимодействие выглядит весьма просто. Пример кода:
Часто web-сервис требует авторизацию. Это тоже легко решается:
Добавляя дополнительные настройки $options можно решить различные проблемы соединения: ssl-соединения, соединение через proxy и прочие.
Однако в моем случае проблему через $options решить не удалось. Как выяснилось web-сервис работал с NTLM авторизацией через контроллер домена ldap на Microsoft-IIS.
Эти данные можно увидеть через-консоль браузера.

К сожалению php класс SoapClient не поддерживает NTLM авторизацию. Немного погуглив я принял решение использовать библиотеку
библиотека зависимая, поэтому устанавливать ее нужно через composer. Инструкция по установке прилагается к описанию проекта в гите.
Подключив библиотеку наш код получения остатков теперь такой:
Поскольку мой адрес web-сервиса был такой:
$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-С реализуется , который предоставляет остатки товаров (или товара) по складам.
Для программиста 1-С web-сервис - дело пустяковое. Для битрикса механизмов взаимодействия с web-сервисом к сожалению нету. Пишем ручками.
web-сервисы 1-С работают через протокол SOAP. Да конечно, это прошлый век. Сейчас все работают через REST-API и json, но 1-С весьма консервативна, поэтому SOAP!
Для работы через SOAP на PHP есть класс SoapClient.
Обычно взаимодействие выглядит весьма просто. Пример кода:
| Код |
|---|
$client = new SoapClient('http://188.188.188.188/dir/file.1cws?wsdl');
$response = $client->Ostatok(["Articl" => ""]);
$arStocks = $response->return->Состав;
|
| Код |
|---|
$options = ['login' => "some_name", 'password' => "some_password"];
$client = new SoapClient('http://188.188.188.188/dir/file.1cws?wsdl', $options);
|
Однако в моем случае проблему через $options решить не удалось. Как выяснилось web-сервис работал с NTLM авторизацией через контроллер домена ldap на Microsoft-IIS.
Эти данные можно увидеть через-консоль браузера.

К сожалению php класс SoapClient не поддерживает NTLM авторизацию. Немного погуглив я принял решение использовать библиотеку
библиотека зависимая, поэтому устанавливать ее нужно через composer. Инструкция по установке прилагается к описанию проекта в гите.
Подключив библиотеку наш код получения остатков теперь такой:
| Код |
|---|
<?
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");
?>
|
Поскольку мой адрес web-сервиса был такой:
$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 или в свойства Товаров/Товарных предложений.