Вызов web-сервиса 1С извне и из другой базы: адреса, код, ошибки

· 9 мин

Содержание

Чтобы обратиться к веб-сервису 1С, его нужно опубликовать на веб-сервере (Apache или IIS), а потом отправлять запросы по адресу вида http://сервер/имя_публикации/ws/ИмяСервиса?wsdl для SOAP или http://сервер/имя_публикации/hs/корневой_URL/... для HTTP-сервиса. Авторизация — логин и пароль пользователя информационной базы.

Частое заблуждение: «веб-сервис 1С работает сам, достаточно добавить его в конфигурацию». Нет. Без публикации и модуля расширения веб-сервера база на запросы не отвечает вообще, даже если объект в конфигураторе описан идеально. Всё, что ниже, работает в платформе 8.3 и одинаково для любой конфигурации: БП, ЗУП, УТ, ERP.

Какие бывают веб-сервисы в 1С и чем они отличаются

Под словом «веб-сервис» в 1С прячутся три разных механизма. От того, какой из них у вас, зависит адрес и формат запроса.

МеханизмГде описанАдрес обращенияФормат
🧩 Web-сервис (SOAP)Общие → Web-сервисы в конфигураторе/ws/ИмяСервисаXML по WSDL
🌐 HTTP-сервисОбщие → HTTP-сервисы/hs/КорневойURL/шаблонЛюбой: JSON, XML, текст
📦 Стандартный интерфейс ODataНе нужно ничего писать в конфигураторе/odata/standard.odata/JSON или Atom/XML

Зачем это всё нужно на практике:

  • 🛒 сайт или маркетплейс-коннектор забирает остатки и цены;
  • 📱 мобильное приложение курьера отмечает доставку;
  • 🔄 одна база 1С отправляет данные в другую без файлового обмена;
  • 📊 BI-система читает документы и справочники для отчётов.

Если сервис уже есть в типовой конфигурации или его написал разработчик, ваша задача — узнать его имя и убедиться, что он опубликован. Если нужна просто выгрузка справочников и документов, часто хватает OData, и программировать ничего не надо.

Что проверить до первого обращения к веб-сервису

Перед первым запросом пройдите по списку. Каждый пункт — частая причина того, что «ничего не работает ».

Готовность базы к обращениям
Выполнено: 0 / 6

Публикация из конфигуратора

  1. Запустите конфигуратор от имени администратора Windows — иначе платформа не сможет записать файлы в каталог веб-сервера и изменить его настройки.
  2. Откройте Администрирование → Публикация на веб-сервере.
  3. Задайте имя публикации латиницей, например trade. Оно станет частью адреса.
  4. На вкладке веб-сервисов отметьте нужные: флаг публикации Web-сервисов, HTTP-сервисов и, если нужно, стандартного интерфейса OData.
  5. Нажмите «Опубликовать» и согласитесь на перезапуск веб-сервера.

После публикации в каталоге появится файл default.vrd. В нём строка подключения к базе и список опубликованных сервисов. Если сервис добавили в конфигурацию позже, публикацию нужно обновить, иначе его адрес вернёт 404.

Перезапуск Apache или IIS обрывает текущие сеансы веб-клиента и все активные вызовы сервисов. Публикуйте в нерабочее время или предупредите пользователей.

Включение OData

Для OData публикации мало: нужно указать, какие объекты доступны. В типовых конфигурациях на БСП это делается обработкой настройки стандартного интерфейса OData — ссылка на неё есть в Администрирование → Синхронизация данных. Программно состав задаёт метод УстановитьСоставСтандартногоИнтерфейсаOData().

Как обращаться к веб-сервису 1С: три рабочих способа

Способ 1. SOAP через WSDL

Описание сервиса забирают по адресу:

http://srv01/trade/ws/Exchange?wsdl

Здесь trade — имя публикации, Exchange — имя публикации web-сервиса (свойство «Имя файла публикации» объекта; обычно совпадает с именем, иногда с окончанием .1cws). Откройте адрес в браузере: браузер спросит логин и пароль, после чего покажет XML с описанием операций.

Из WSDL нужны три вещи:

  • 📌 пространство имён — атрибут targetNamespace;
  • 📌 имя сервиса — элемент service;
  • 📌 имя точки подключения — элемент port. 1С создаёт две: ExchangeSoap и ExchangeSoap12.

Дальше любой SOAP-клиент (SoapUI, Postman, библиотека на PHP или Python) сам строит запросы по этому описанию.

Способ 2. HTTP-сервис в стиле REST

У HTTP-сервиса нет WSDL. Адрес собирается из корневого URL сервиса и шаблона:

http://srv01/trade/hs/api/orders/12345

api — корневой URL, /orders/{id} — шаблон, 12345 — параметр. Метод (GET, POST, PUT, DELETE) задаёт разработчик для каждого шаблона. Формат ответа тоже определяет он, чаще всего это JSON.

Способ 3. OData без программирования

http://srv01/trade/odata/standard.odata/Catalog_Номенклатура?$format=json&$top=10

Имена сущностей строятся по типу объекта: Catalog_, Document_, InformationRegister_ и так далее. Полный список доступных сущностей — по адресу .../standard.odata/ без продолжения.

Логин, пароль и безопасность обращений

Стандартно 1С использует Basic-аутентификацию. Клиент передаёт заголовок:

Authorization: Basic <base64 от строки логин:пароль>

Логин и пароль — от пользователя информационной базы, а не от Windows. Если логин кириллический, строку перед кодированием в base64 переводят в UTF-8, иначе 1С ответит 401.

Чего не делать:

  • ❌ не прописывайте логин и пароль в строке подключения внутри default.vrd — тогда сервис откроется любому, кто знает адрес;
  • ❌ не давайте интеграции пользователя с ролью «Полные права»;
  • ❌ не выставляйте публикацию в интернет по HTTP: Basic передаёт пароль фактически открытым текстом.

Что делать:

  1. Заведите отдельного пользователя, например integration_site, и дайте ему роль только на нужные объекты.
  2. Включите HTTPS на веб-сервере (сертификат Let’s Encrypt или корпоративный).
  3. Ограничьте доступ к каталогу публикации по IP средствами веб-сервера.
  4. Для внешних систем держите отдельную публикацию, а не ту же, через которую работает веб-клиент.

Каждый сеанс web-сервиса — это сеанс информационной базы, он занимает клиентскую лицензию. Если внешняя система шлёт десятки параллельных запросов, включите у web-сервиса повторное использование сеансов (свойство объекта в конфигураторе) — так сеансы не будут создаваться заново на каждый вызов.

Примеры обращений к web-сервису 1С

Вызов SOAP-сервиса из другой базы 1С

Определения = Новый WSОпределения(
    "https://srv01/trade/ws/Exchange?wsdl",
    "integration_site", "Пароль123");

Прокси = Новый WSПрокси(Определения,
    "http://www.example.org/exchange",   // targetNamespace из WSDL
    "Exchange",                          // имя сервиса
    "ExchangeSoap");                     // точка подключения

Прокси.Пользователь = "integration_site";
Прокси.Пароль = "Пароль123";

Результат = Прокси.GetOrder("12345");
Сообщить(Результат);

Если сервис вызывается часто, WSDL лучше один раз импортировать в конфигурацию как объект «WS-ссылка». Тогда описание не скачивается при каждом вызове, а прокси создаётся через WSСсылки.ИмяСсылки.СоздатьWSПрокси(...).

Вызов SOAP через curl

curl -u integration_site:Пароль123 \
  -H "Content-Type: text/xml; charset=utf-8" \
  -H "SOAPAction: \"http://www.example.org/exchange#Exchange:GetOrder\"" \
  --data @request.xml \
  https://srv01/trade/ws/Exchange

Значение SOAPAction не угадывайте — копируйте из атрибута soapAction нужной операции в WSDL. Тело request.xml — конверт SOAP с элементом операции и её параметрами в пространстве имён сервиса.

Обращение к HTTP-сервису из 1С

Соединение = Новый HTTPСоединение("srv01", 443,
    "integration_site", "Пароль123", , 30,
    Новый ЗащищенноеСоединениеOpenSSL());

Запрос = Новый HTTPЗапрос("/trade/hs/api/orders/12345");
Запрос.Заголовки.Вставить("Accept", "application/json");

Ответ = Соединение.Получить(Запрос);

Если Ответ.КодСостояния = 200 Тогда
    Текст = Ответ.ПолучитьТелоКакСтроку("UTF-8");
    Чтение = Новый ЧтениеJSON;
    Чтение.УстановитьСтроку(Текст);
    Данные = ПрочитатьJSON(Чтение);
    Чтение.Закрыть();
Иначе
    ВызватьИсключение СтрШаблон("Сервис вернул код %1: %2",
        Ответ.КодСостояния, Ответ.ПолучитьТелоКакСтроку());
КонецЕсли;

Шестой параметр HTTPСоединение — таймаут в секундах. Без него вызов может висеть, пока соединение не оборвёт сеть.

Для POST тело задают через Запрос.УстановитьТелоИзСтроки(ТекстJSON, "UTF-8"), а отправляют методом Соединение.ОтправитьДляОбработки(Запрос) или Соединение.ВызватьHTTPМетод("POST", Запрос).

Обработчик на стороне HTTP-сервиса

Функция OrdersGet(Запрос)
    Номер = Запрос.ПараметрыURL["id"];
    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
    Ответ.УстановитьТелоИзСтроки(
        СтрШаблон("{""id"": ""%1"", ""status"": ""ok""}", Номер), "UTF-8");
    Возврат Ответ;
КонецФункции

В рабочем коде JSON собирают через ЗаписьJSON, а не склейкой строк: иначе кавычка в наименовании товара сломает ответ.

SOAP или HTTP-сервис: что выбрать

КритерийSOAP (web-сервис)HTTP-сервис (REST)OData
Описание для клиентаWSDL, клиент генерируется автоматическиДокументацию пишет разработчикМетаданные по $metadata
ФорматТолько XMLЛюбойJSON или XML
Порог входа для внешней командыВыше, нужен SOAP-клиентНиже, хватит curlНизкий
Типизация параметровСтрогая, через XDTOНа совести разработчикаПо метаданным базы
Бизнес-логикаДаДаТолько чтение и запись объектов
Когда братьКорпоративная шина, обмен 1С ↔ 1С, требования заказчикаСайты, мобильные приложения, вебхукиОтчёты и BI, простая выгрузка

Короткое правило: для новых интеграций с сайтами и приложениями берите HTTP-сервис. SOAP оставьте там, где его требует другая сторона или нужен строгий контракт. OData — когда логики нет и нужен просто доступ к данным.

Через OData пользователь с правом записи может менять объекты напрямую, минуя проверки, которые разработчик заложил в формы. Давайте интеграционному пользователю права только на чтение, если запись не нужна.

Где искать причину, если вызов не проходит

Начните с кода ответа — он сразу сужает круг поиска.

Диагностика: выберите симптом

Ещё одна ловушка — версия модуля. После обновления платформы на сервере публикацию нужно переопубликовать, иначе default.vrd и настройки Apache указывают на модуль из удалённого каталога старой версии.

Логи обращений: как отследить вызовы

Без журнала вы не узнаете, кто вызвал сервис и что пошло не так. Используйте несколько уровней.

Журнал регистрации 1С. Каждое обращение создаёт сеанс, и в журнале видно его начало и завершение с именем пользователя. Отберите события по пользователю интеграции — сразу видно частоту вызовов и ошибки.

Собственные записи в обработчике. В начале и при ошибке вызывайте ЗаписьЖурналаРегистрации() со своим именем события, например Интеграция.Сайт:

Попытка
    // основная логика
Исключение
    ЗаписьЖурналаРегистрации("Интеграция.Сайт",
        УровеньЖурналаРегистрации.Ошибка, , ,
        ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
    Ответ = Новый HTTPСервисОтвет(500);
    Возврат Ответ;
КонецПопытки;

Журнал доступа веб-сервера. Apache пишет каждый запрос в access.log с IP, путём, кодом ответа и временем. Это первое место, куда смотреть при 404 и 401: видно, дошёл ли запрос вообще и по какому адресу.

Технологический журнал. Для разбора медленных вызовов включают logcfg.xml с событиями CALL и EXCP на сервере 1С. Журнал растёт быстро, поэтому включайте его на время диагностики и задавайте срок хранения.

Для критичных интеграций заведите регистр сведений «Журнал обмена»: дата, направление, идентификатор, код ответа, текст ошибки. Его удобно фильтровать и показывать бухгалтеру без доступа к журналу регистрации.

Частые вопросы

Можно ли обратиться к веб-сервису файловой базы?
Да. Файловую базу тоже публикуют на веб-сервере, и сервисы работают. Но при параллельных вызовах файловый вариант быстро упирается в блокировки, для постоянной интеграции лучше клиент-серверная база.
Нужна ли отдельная лицензия для веб-сервисов?
Отдельного вида лицензии нет. Сеанс web-сервиса занимает обычную клиентскую лицензию, поэтому учитывайте его при подсчёте нужного количества.
Как вызвать веб-сервис из 1С без интернета на сервере?
Если сервис во внутренней сети, интернет не нужен — достаточно сетевого доступа от сервера 1С до веб-сервера по нужному порту. Для внешних адресов через прокси передайте объект ИнтернетПрокси в HTTPСоединение или WSОпределения.
Почему в браузере WSDL открывается, а из кода нет?
Браузер работает от вашей учётной записи и с вашими настройками прокси, а серверный код — от учётной записи службы сервера 1С. Проверьте доступ и сертификаты именно с сервера.
Можно ли передавать файлы через веб-сервис 1С?
Да. В SOAP — параметром типа «ДвоичныеДанные», он кодируется в base64. В HTTP-сервисе — телом запроса, его читают методом Запрос.ПолучитьТелоКакДвоичныеДанные().