Вызов web-сервиса 1С извне и из другой базы: адреса, код, ошибки
Содержание
Чтобы обратиться к веб-сервису 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, и программировать ничего не надо.
Что проверить до первого обращения к веб-сервису
Перед первым запросом пройдите по списку. Каждый пункт — частая причина того, что «ничего не работает ».
Публикация из конфигуратора
- Запустите конфигуратор от имени администратора Windows — иначе платформа не сможет записать файлы в каталог веб-сервера и изменить его настройки.
- Откройте
Администрирование → Публикация на веб-сервере. - Задайте имя публикации латиницей, например
trade. Оно станет частью адреса. - На вкладке веб-сервисов отметьте нужные: флаг публикации Web-сервисов, HTTP-сервисов и, если нужно, стандартного интерфейса OData.
- Нажмите «Опубликовать» и согласитесь на перезапуск веб-сервера.
После публикации в каталоге появится файл 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 передаёт пароль фактически открытым текстом.
Что делать:
- Заведите отдельного пользователя, например
integration_site, и дайте ему роль только на нужные объекты. - Включите HTTPS на веб-сервере (сертификат Let’s Encrypt или корпоративный).
- Ограничьте доступ к каталогу публикации по IP средствами веб-сервера.
- Для внешних систем держите отдельную публикацию, а не ту же, через которую работает веб-клиент.
Каждый сеанс 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С. Журнал растёт быстро, поэтому включайте его на время диагностики и задавайте срок хранения.
Для критичных интеграций заведите регистр сведений «Журнал обмена»: дата, направление, идентификатор, код ответа, текст ошибки. Его удобно фильтровать и показывать бухгалтеру без доступа к журналу регистрации.
Частые вопросы
Можно ли обратиться к веб-сервису файловой базы?
Нужна ли отдельная лицензия для веб-сервисов?
Как вызвать веб-сервис из 1С без интернета на сервере?
ИнтернетПрокси в HTTPСоединение или WSОпределения.Почему в браузере WSDL открывается, а из кода нет?
Можно ли передавать файлы через веб-сервис 1С?
Запрос.ПолучитьТелоКакДвоичныеДанные().