В принципе, задачу можно решить, создав руками вторую публикацию с нужными сервисами, но тогда приходится заморачиваться с настройками доступа для этой публикации.
Для себя я решил эту проблему с помощью универсального "прокси", который ставится на любой веб-сервер с установленным php с модулем curl, который перенаправляет входной поток запроса на внутренний сервер, параллельно подменяя имя пользователя и пароль.
Настройка сводится к замене переменных:
$_1c_user = '1c_user';
$_1c_pwd = '1c_password';
$_1c_addr = 'http://webserver/1c/ws/ws1.1cws';
$php_user = 'php_user';
$php_pwd = 'php_password';
$php_realm = 'php_realm';
на нужные значения. Скрипт также подменяет адрес сервиса в wsdl'е, полученном от 1с на свой, так что работа скрипта становится вообще прозрачной.
Естественно, у самого скрипта должен быть доступ к "основной" публикации 1с.
Совсем отключить авторизацию скрипта можно закомментировав строки с 11 по 16.
Файл в архиве, так как инфостарт не принимает файлы php
Сам текст скрипта, если у кого-то нет смартмани, чтобы его скачать:
<?php
$_1c_user = '1c_user';
$_1c_pwd = '1c_password';
$_1c_addr = 'http://webserver/1c/ws/ws1.1cws';
$php_user = 'php_user';
$php_pwd = 'php_password';
$php_realm = 'php_realm';
if (!isset($_SERVER['PHP_AUTH_USER']) || ($_SERVER['PHP_AUTH_USER'] !== $php_user) || ($_SERVER['PHP_AUTH_PW'] !== $php_pwd))
{
header('WWW-Authenticate: Basic realm="'.$php_realm.'"');
header('HTTP/1.0 401 Unauthorized');
exit;
}
if (isset($_GET['wsdl'])) {
$ch = curl_init($_1c_addr.'?wsdl');
} else {
$ch = curl_init($_1c_addr);
$post_data = file_get_contents('php://input');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
}
curl_setopt($ch, CURLOPT_USERPWD, $_1c_user.':'.$_1c_pwd);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$server_output = curl_exec ($ch);
$info = curl_getinfo($ch);
curl_close ($ch);
// подстановка "правильного" для внешнего мира адреса в wsdl
if (isset($_GET['wsdl'])) {
$full_url =
($_SERVER['HTTPS']?'https://':'http://').
$_SERVER['SERVER_NAME'].($_SERVER['HTTP_PORT']?':'.$_SERVER['HTTP_PORT']:'').
$_SERVER['PHP_SELF'];
$server_output = preg_replace('/(:address location=")(.*?)("\/>)/', '$1'.$full_url.'$3', $server_output);
}
header('Content-Type: '.$info["content_type"]);
file_put_contents('php://output', $server_output);
?>