Работа с веб-сервисами в 1С: создание, публикация и подключение WS-ссылок
Содержание
Чтобы вызвать внешний SOAP-сервис из 1С, в конфигураторе добавляют объект WS-ссылка (ветка Общие → WS-ссылки) и указывают адрес WSDL. Чтобы, наоборот, отдать данные наружу, создают объект Web-сервис и публикуют базу на веб-сервере. Это две разные задачи, и их часто путают: WS-ссылка — это вызов чужого сервиса, Web-сервис — это ваш собственный интерфейс для чужих систем.
Разберём обе стороны: как добавить и настроить WS-ссылку для входящего вызова, как создать и опубликовать свой веб-сервис, как закрыть его аутентификацией и как отладить обмен, когда он не идёт. Всё — для платформы 1С:Предприятие 8.3 с интерфейсом «Такси».
Что выбрать: WS-ссылку, веб-сервис или HTTP-сервис
Прежде чем лезть в конфигуратор, определитесь с направлением обмена и форматом.
- 📥 Входящий вызов (1С дёргает чужую систему) → добавляете WS-ссылку по WSDL контрагента.
- 📤 Исходящий интерфейс (чужая система дёргает 1С) → создаёте Web-сервис (SOAP) или HTTP-сервис (REST-подобный) и публикуете его.
- 🔁 Обмен между двумя базами 1С обычно удобнее делать через типовой механизм обмена (планы обмена, Конвертация данных ), а веб-сервисы брать, когда на другой стороне не 1С.
SOAP-сервис описывается строгим контрактом WSDL и работает с типизированными пакетами XDTO. HTTP-сервис легче: он принимает произвольный URL и тело запроса, отдаёт JSON или что угодно. Для интеграции с современными REST API чаще берут именно HTTP-сервис, но исторический и самый частый запрос — это SOAP и WS-ссылка, с него и начнём.
Что нужно подготовить до начала работ:
Разрядность — самая частая причина, по которой публикация «молча» не работает. 64-разрядная платформа требует 64-разрядный модуль веб-сервера. Если ставили Apache под x86, а платформа x64 — обмена не будет.
Как создать веб-сервис в конфигураторе
Свой SOAP-сервис описывают в дереве конфигурации.
- Откройте конфигуратор, встаньте на ветку
Общие → Web-сервисы, по правой кнопке —Добавить. - Задайте Имя (латиницей, например
ОбменДанными) — оно попадёт в URL. - Заполните URI пространства имён — это идентификатор вашего сервиса, обычно в виде адреса, например
http://mycompany.ru/exchange. Он не обязан быть «живым» — это просто уникальная строка. - Добавьте Операции — каждая операция соответствует одному методу. У операции указываете тип возвращаемого значения и Имя метода — имя процедуры или функции в модуле сервиса.
- При необходимости добавьте Параметры операции и задайте их типы.
- Откройте модуль веб-сервиса и напишите код метода.
Пример функции в модуле сервиса, которая возвращает остаток по складу:
Функция ПолучитьОстаток(Склад, Номенклатура) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ОстаткиОстаток КАК Остаток
|ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад = &Склад И Номенклатура = &Ном) КАК Остатки";
Запрос.УстановитьПараметр("Склад", Склад);
Запрос.УстановитьПараметр("Ном", Номенклатура);
Выборка = Запрос.Выполнить().Выбрать();
Возврат ?(Выборка.Следующий(), Выборка.Остаток, 0);
КонецФункции
Сложные структуры данных (не просто строка или число) описывают через пакеты XDTO в ветке Общие → Пакеты XDTO, а затем ссылаются на эти типы в параметрах операций. Для простого обмена скалярными значениями пакеты не нужны.
Имя операции в WSDL и имя метода в модуле — это разные поля. Внешняя система видит имя операции, а платформа по свойству «Имя метода» находит, какую процедуру выполнить.
Как опубликовать веб-сервис на веб-сервере
Объект в конфигурации сам по себе недоступен снаружи — базу нужно опубликовать.
- В конфигураторе откройте
Администрирование → Публикация на веб-сервере. - В поле Имя задайте короткое имя публикации латиницей (например
buh) — оно станет частью адреса:http://сервер/buh/. - Выберите веб-сервер (Apache или IIS) и каталог на диске, куда платформа положит файлы публикации.
- Отметьте флажок «Публиковать Web-сервисы» и в списке ниже отметьте нужные сервисы. Если флажок снят — сервис не отдаётся, даже если он есть в конфигурации.
- Нажмите «Опубликовать». Платформа создаст в каталоге файл
default.vrdи настроит веб-сервер.
После публикации WSDL вашего сервиса доступен по адресу вида:
http://сервер/buh/ws/ОбменДанными?wsdl
где buh — имя публикации, ws — служебный префикс, ОбменДанными — имя веб-сервиса из конфигурации.
Выбор веб-сервера влияет на мелочи настройки. Для IIS публикация создаёт виртуальный каталог и прописывает обработчик; если сервис отдаёт 500 сразу после публикации, в первую очередь смотрят, под какой учётной записью работает пул приложений и есть ли у неё доступ к каталогу базы. Для Apache платформа дописывает блок в конфигурацию (строки LoadModule и Alias); после правок конфигурацию перечитывают перезапуском службы. На одной машине можно держать несколько публикаций с разными именами — они не мешают друг другу.
После каждого изменения состава операций или имени сервиса публикацию нужно повторить, иначе внешняя система получит старый контракт. Для IIS после переопубликации полезно перезапустить пул приложений, для Apache — перечитать конфигурацию.
Публикация переписывает файл default.vrd в каталоге. Если вы правили его вручную, сохраните копию перед повторной публикацией.
Как добавить WS-ссылку для вызова внешнего сервиса
Теперь обратная задача — из 1С вызвать чужой SOAP-сервис. Для этого в конфигурацию добавляют WS-ссылку.
- В конфигураторе встаньте на ветку
Общие → WS-ссылки, по правой кнопке —Добавить. - В открывшемся окне вставьте адрес WSDL чужого сервиса (строка вида
http://partner.ru/service?wsdl). - Если сервис закрыт аутентификацией, укажите пользователя и пароль для получения описания.
- Платформа скачает WSDL, разберёт его и создаст в конфигурации готовый прокси-объект со всеми операциями.
- Задайте Имя WS-ссылки латиницей — по нему вы будете обращаться к сервису в коде.
Вызов добавленной WS-ссылки из встроенного языка:
Прокси = WSСсылки.ОбменСПорталом.СоздатьWSПрокси(
"http://partner.ru/exchange", // URI пространства имён
"ОбменДанными", // имя сервиса
"ОбменДанными"); // имя порта
Ответ = Прокси.ПолучитьОстаток("СкладОсновной", НоменклатураСсылка);
Иногда адрес сервиса на боевом сервере отличается от того, что зашит в WSDL (тестовый контур, другой домен). Тогда прокси создают динамически, без жёсткой WS-ссылки:
Определения = Новый WSОпределения(
"http://10.0.0.5/buh/ws/ОбменДанными?wsdl", "ws_user", "secret");
Прокси = Новый WSПрокси(
Определения, "http://partner.ru/exchange", "ОбменДанными", "ОбменДанными");
Такой способ удобен, когда адрес и учётные данные хранятся в настройках и подставляются на лету.
Если при добавлении WS-ссылки платформа не может разобрать WSDL, причина чаще всего не в 1С, а на стороне сервиса: описание отдаётся с ошибкой, требует аутентификации, которую вы не указали, либо ссылается на внешние схемы (import), недоступные с вашей машины. Откройте адрес WSDL в браузере и убедитесь, что возвращается корректный XML целиком, а не фрагмент и не страница с ошибкой.
Если контрагент сменил адрес или контракт сервиса, WS-ссылку нужно обновить: по правой кнопке на ней есть команда обновления из исходного WSDL. Просто поменять строку адреса в коде недостаточно, если изменился набор операций.
Как настроить аутентификацию и права доступа
Опубликованный веб-сервис доступен всем, кто знает адрес, поэтому аутентификацию настраивают почти всегда.
Веб-сервис работает от имени пользователя информационной базы. Внешняя система передаёт логин и пароль по HTTP Basic-аутентификации, а платформа запускает сеанс под этим пользователем. Что это значит на практике:
- Заведите в базе отдельного пользователя для обмена (например
ws_exchange) с минимально необходимыми правами, а не используйте учётку администратора. - Права этого пользователя ограничивают, что сможет сделать внешняя система: если у него нет права на регистр, операция вернёт ошибку доступа.
- Если в базе разрешён вход без пароля (аутентификация ОС), для веб-сервиса всё равно настройте вход по логину и паролю — доменная аутентификация через веб-сервис ненадёжна.
Защитить канал передачи нужно отдельно: Basic-аутентификация передаёт пароль практически открытым текстом, поэтому боевой обмен публикуют только по HTTPS. Сертификат ставят на уровне веб-сервера (Apache/IIS), а не в 1С.
Не открывайте порт веб-сервера в интернет без HTTPS и без ограничения по IP. Открытый SOAP-эндпоинт под учёткой с широкими правами — это прямой доступ к вашим данным.
Как протестировать и отладить обмен
Первая проверка — простая: откройте адрес WSDL в браузере.
- Если вернулся XML с описанием операций — публикация работает, сервис виден.
- Если браузер просит логин и пароль — аутентификация включена, это нормально, введите учётные данные пользователя базы.
- Если 404 — ошибка в адресе или публикация не выполнена.
- Если 500 — сервис опубликован, но падает на старте (ошибка в модуле, недоступна база).
Для проверки самих вызовов удобно использовать внешний клиент: SoapUI, Postman или простой скрипт — отправить тестовый запрос и посмотреть ответ.
Чтобы отладить код внутри метода сервиса:
- В модуле веб-сервиса поставьте точку останова на нужной строке.
- Включите отладку для процесса, который обслуживает публикацию: для клиент-серверной базы это рабочий процесс
rphost, отладка по протоколу HTTP или TCP должна быть разрешена в кластере. - В конфигураторе откройте
Отладка → Подключениеи в списке предметов отладки выберите элемент с видом Web-сервис / HTTP-сервис. - Отправьте внешний запрос — выполнение остановится на точке останова, дальше работаете как в обычной отладке.
Параллельно смотрите журнал регистрации базы: ошибки выполнения метода (деление на ноль, отсутствие права, необработанное исключение) пишутся туда с текстом и стеком.
Разбор типичных ошибок подключения
Когда сервис «не отвечает», причина почти всегда в одном из нескольких мест. Сопоставьте симптом с причиной.
/имя_публикации/ws/ИмяСервиса?wsdl, флажок «Публиковать Web-сервисы» отмечен, сам сервис отмечен в списке. Переопубликуйте.СоздатьWSПрокси), проверьте, что порт открыт в брандмауэре и сервер доступен.Если нужно разово проверить доступность с сервера, откройте WSDL прямо в браузере на самой машине веб-сервера, по адресу localhost. Так вы отделите проблему публикации от проблемы сети и брандмауэра.