Выгрузка остатков для множества складов на редакции "Малый бизнес" Интеграция с WEB-сервисом 1-С SOAP с NTLM авторизацией через контроллер домена ldap на Microsoft-IIS, Многоскладовая система на "Малом бизнесе". WEB-сервис с NTLM-авторизацией.
Хочу рассказать историю одной интеграции и поделиться опытом.
Предыстория: Как обычно спешка. сдать проект нужно уже вчера! Час на оценку проекта и в бой. На стадии планирования/проектирования проглядели что на сайте требуется информация по остаткам на разных складах и магазинах. Когда это выяснилось лицензия на "Малый Бизнес" уже была со всеми согласована и куплена. А в этой редакции как известно предусмотрен только один склад.
История: Нужно как то решать проблему. Первый вариант, который приходит на ум, кастомизировать компонент "bitrix:catalog.import.1c". Не самая лучшая идея: - Кастомизация как правило трудоёмкая, с костылями и велосипедами. - Отказ от дальнейших обновлений компонента (меня всегда очень отпугивает). - Усложняется поддержка проекта. Переговорив с программистом 1-С решили пойти иным путём: На стороне 1-С реализуется web-сервис, который предоставляет остатки товаров (или товара) по складам. Для программиста 1-С web-сервис - дело пустяковое. Для битрикса механизмов взаимодействия с web-сервисом к сожалению нету. Пишем ручками. web-сервисы 1-С работают через протокол SOAP. Да конечно, это прошлый век. Сейчас все работают через REST-API и json, но 1-С весьма консервативна, поэтому SOAP! Для работы через SOAP на PHP есть класс SoapClient. Обычно взаимодействие выглядит весьма просто. Пример кода:
Добавляя дополнительные настройки $options можно решить различные проблемы соединения: ssl-соединения, соединение через proxy и прочие. Однако в моем случае проблему через $options решить не удалось. Как выяснилось web-сервис работал с NTLM авторизацией через контроллер домена ldap на Microsoft-IIS. Эти данные можно увидеть через-консоль браузера.
К сожалению php класс SoapClient не поддерживает NTLM авторизацию. Немного погуглив я принял решение использовать библиотеку ntlm-soap-client библиотека зависимая, поэтому устанавливать ее нужно через composer. Инструкция по установке прилагается к описанию проекта в гите. Подключив библиотеку наш код получения остатков теперь такой:
Поскольку мой адрес web-сервиса был такой: $url = 'http://188.188.188.188:8888/dir/file.1cws?wsdl'; То мне пришлось дополнительно модифицировать библиотеку ntlm-soap-client: - Файл /ntlm-soap-client/src/NTLMSoap/Common/NTLMConfig.php - Функция getAuthString - Файл /ntlm-soap-client/src/NTLMSoap/Model/Traits/NTLMRequest.php - Функция __doRequest
После чего мучения закончились. В ответ получил массив с остатками, а дальше дело техники на усмотрение разработчика: записывать остатки в HL-Block или в свойства Товаров/Товарных предложений.
В настройках нужного инфоблока обязательно должна быть галочка в настройке "Индексировать элементы для модуля поиска". Если галочка установлена после добавления элементов в инфоблок, то требуется переиндексация модуля.