Интеграция систем на базе PHP с информационными базами 1С через веб-сервисы — это стандартная задача при создании личных кабинетов, синхронизации интернет-магазинов или мобильных приложений. Одной из главных сложностей для PHP-разработчика становится правильное формирование SOAP-запроса, особенно когда методы 1С ожидают специфические параметры или сложные структуры данных (XDTO). В этой статье мы подробно разберем, как настроить SoapClient, правильно передать аргументы и обработать ответы от сервера 1С.
Для взаимодействия с веб-сервисом 1С в PHP используется встроенный класс SoapClient. Главный секрет успешного вызова заключается в том, что параметры метода должны передаваться в виде ассоциативного массива, где ключи точно соответствуют именам параметров, указанным в определении веб-сервиса в конфигураторе 1С.
Рассмотрим простейший пример инициализации клиента и вызова метода. Важно передавать логин и пароль в массиве опций, так как веб-сервисы 1С практически всегда защищены авторизацией.
$login = "web_user";
$pass = "password123";
$wsdl = "http://server/base/ws/myservice?wsdl";
try {
$client = new SoapClient($wsdl, [
"login" => $login,
"password" => $pass,
"trace" => true,
"exceptions" => true
]);
// Параметры передаются как ассоциативный массив
$params = [
"pos_start" => 1,
"pos_end" => 10,
"status" => "active"
];
$result = $client->GetOrderList($params);
print_r($result);
} catch (SoapFault $e) {
echo "Ошибка SOAP: " . $e->getMessage();
}
Обратите внимание: при вызове метода GetOrderList мы передаем массив $params напрямую. PHP автоматически преобразует этот массив в соответствующую XML-структуру внутри SOAP-тела (Body).
Если в вашем проекте планируется много обращений к разным методам, логично инкапсулировать логику в отдельный класс-обертку. Проанализируем реализацию метода call, которая позволяет автоматизировать передачу параметров. Важным нюансом здесь является использование метода __soapCall.
class TMSoap {
private $proxy;
public function __construct($wsdl, $user, $password) {
$this->proxy = new SoapClient($wsdl, [
'trace' => true,
'login' => $user,
'password' => $password,
'cache_wsdl' => WSDL_CACHE_NONE // Полезно на этапе разработки
]);
}
public function call($method, $params) {
// Чтобы параметры корректно обернулись в XML,
// их нужно передавать вторым аргументом в виде массива массивов
return $this->proxy->__soapCall($method, [$params]);
}
}
// Пример использования:
$soap = new TMSoap($wsdl, $user, $pass);
$response = $soap->call('checkOrder', ['uid' => $order_id]);
Использование конструкции Array($params) внутри __soapCall гарантирует, что ваши ключи из массива станут именами XML-тегов параметров метода 1С.
В экосистеме 1С часто используется понятие XDTO (XML Data Transfer Objects). Многие начинающие разработчики ищут специальные библиотеки для генерации XDTO в PHP, однако на самом деле XDTO — это описание структуры данных в XML-схеме. Для PHP это означает, что нам нужно передать глубоко вложенный ассоциативный массив.
Выясним, как отправить данные, если 1С ожидает объект со вложенными полями. Допустим, мы запрашиваем реквизиты контрагента по ИНН через типичный сервис 1С:
$params = [
"INN" => "7701234567",
"CompanyData" => [
"Name" => "ООО Ромашка",
"Type" => "ЮрЛицо"
]
];
try {
$result = $client->getCorporationRequisitesByINN($params);
// Результат от 1С также приходит в виде объекта или массива объектов
// Доступ к вложенным свойствам осуществляется через стрелочную нотацию
if (isset($result->РеквизитыЮрЛица->СвАдрес)) {
$address = $result->РеквизитыЮрЛица->СвАдрес->Адрес->Состав;
echo "Адрес получен: " . $address;
}
} catch (SoapFault $e) {
// Обработка ошибок логики 1С
}
Если 1С не принимает обычный массив, возможно, ей требуется явное указание типов данных через SoapVar. Это бывает необходимо для передачи объектов, соответствующих сложным типам из WSDL.
Когда 1С выдает ошибку «Недостаточно параметров» или «Неизвестный тип», хотя визуально в PHP всё верно, необходимо проверить, что именно уходит «по проводам». Для этого мы включили опцию 'trace' => true в настройках клиента.
Разберем методы для отладки:
$client->__getLastRequest() — возвращает полный XML-текст последнего отправленного запроса. Сравните его с эталоном из SOAPUI.$client->__getLastResponse() — возвращает XML ответа. Часто 1С пишет подробности ошибки внутри XML, которые не всегда попадают в getMessage() исключения.Проанализируем типичную проблему с кэшированием. PHP сохраняет WSDL-файл во временную папку. Если вы изменили состав параметров метода в 1С (добавили новый реквизит), PHP может продолжать слать запросы по старой схеме. Чтобы этого избежать, используйте настройки в php.ini или в коде:
ini_set('soap.wsdl_cache_enabled', 0);
Рассмотрим специфику некоторых типов данных при передаче из PHP в 1С:
date('c') или date("Y-m-d\TH:i:s").base64Binary), перед отправкой обязательно пропустите содержимое файла через base64_encode().true и false обычно корректно транслируются в XML-ные 1 и 0, которые понимает 1С.Важно помнить, что ошибки веб-сервиса 1С могут быть двух типов: системные (неверный логин, упал сервер) и логические (не найден документ, объект заблокирован). Логические ошибки из модуля веб-сервиса 1С (команда ВызватьИсключение) пробрасываются в PHP как SoapFault.
try {
$res = $client->CreateDocument($data);
} catch (SoapFault $e) {
// Выясним причину ошибки
error_log("Код ошибки 1С: " . $e->faultcode);
error_log("Текст ошибки 1С: " . $e->getMessage());
}
Таким образом, взаимодействие PHP и 1С через SOAP строится на строгом соответствии имен ключей массива именам параметров в 1С и внимательном контроле структуры вложенных данных для имитации XDTO-объектов.