К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как подключиться к веб-сервису из 1С

Как подключиться к веб-сервису из 1С через WS-ссылку и HTTPСоединение: настройка, код, проверка результата, типичные ошибки и ответы на вопросы.

Подключение 1С к веб-сервису нужно, когда конфигурация должна обмениваться данными с внешними системами: банками, службами доставки, CRM, сайтами или другими базами 1С. Есть два основных пути: через WS-ссылку, если сервис работает по протоколу SOAP и публикует WSDL-описание, и через объект HTTPСоединение, если сервис предоставляет REST API или принимает произвольные HTTP-запросы.

Выбор способа определяется форматом внешнего сервиса. Если у поставщика есть ссылка вида https://example.com/service?wsdl, удобнее WS-ссылка: платформа сама построит прокси-объект с типизированными методами. Если документация описывает endpoint'ы, JSON и заголовки авторизации — работайте через HTTPСоединение, это даёт полный контроль над запросом.

Оба способа доступны и в тонком, и в веб-клиенте, но код выполняется на сервере 1С (в серверной процедуре), поэтому важно учитывать права, таймауты и доступность внешнего адреса именно с сервера, а не с рабочего места пользователя.

Как определить, какой способ подключения нужен

Первый шаг — изучить документацию внешнего сервиса. Ключевой признак SOAP-сервиса — наличие WSDL-файла: откройте адрес в браузере, если возвращается XML с корневым элементом definitions, это SOAP. REST-сервисы обычно описываются списком URL, методов (GET, POST) и примерами JSON.

Также проверьте требования к авторизации: SOAP-сервисы чаще используют логин и пароль в параметрах прокси, REST — токены в заголовке Authorization или API-ключ в параметре запроса. Это влияет на то, как вы будете передавать учётные данные в коде.

Маршрут решения

Как выбрать способ подключения

У сервиса есть WSDL-описание (адрес с ?wsdl)Используйте WS-ссылку и WSПрокси — платформа сама сформирует типы данных
Сервис описан как REST API с JSON и endpoint'амиИспользуйте HTTPСоединение и HTTPЗапрос
Нужно просто скачать файл или отправить формуДостаточно HTTPСоединения без сложной структуры
Сервис требует взаимную TLS-аутентификацию по сертификатуПонадобится ЗащищенноеСоединениеOpenSSL с сертификатом клиента

Подключение к SOAP-сервису через WS-ссылку

WS-ссылка — объект конфигурации, который хранит адрес WSDL и позволяет платформе автоматически построить описание методов и типов данных сервиса. В конфигураторе откройте ветку «Общие → WS-ссылки», добавьте новый элемент и укажите URL WSDL-описания. Платформа загрузит описание и покажет доступные операции.

Далее в коде создаётся прокси-объект, через который вызываются методы сервиса как обычные функции:

Определение = Новый WSОпределения("https://example.com/service?wsdl", "user", "password");

Прокси = Новый WSПрокси(Определение, "http://example.com/", "MyService", "MyServiceSoap");

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

Прокси.Пароль = "password";

Результат = Прокси.GetData("параметр1");

Если в конфигурации создана WS-ссылка, определение можно получить через менеджер: WSСсылки.ИмяСсылки.СоздатьWSПрокси(...) — тогда адрес хранится централизованно и не зашит в коде. Это удобно при переносе между тестовой и рабочей базами.

Подключение к REST API через HTTPСоединение

Для REST-сервисов используется связка объектов: HTTPСоединение задаёт сервер, порт, учётные данные и таймаут; HTTPЗапрос описывает адрес ресурса, заголовки и тело. Пример POST-запроса с JSON:

Соединение = Новый HTTPСоединение("api.example.com", 443, , , , 30,

Новый ЗащищенноеСоединениеOpenSSL);

Запрос = Новый HTTPЗапрос("/v1/orders");

Запрос.Заголовки.Вставить("Content-Type", "application/json");

Запрос.Заголовки.Вставить("Authorization", "Bearer " + Токен);

Запрос.УстановитьТелоИзСтроки(ТекстJSON, КодировкаТекста.UTF8);

Ответ = Соединение.ОтправитьДляОбработки(Запрос);

Если Ответ.КодСостояния = 200 Тогда

Результат = Ответ.ПолучитьТелоКакСтроку();

КонецЕсли;

Для чтения JSON из ответа применяйте ЧтениеJSON с методом ПрочитатьJSON — так вы получите структуру или соответствие для дальнейшей обработки. Формировать JSON для отправки удобно через ЗаписьJSON, это исключает ошибки экранирования при ручной сборке строки.

bsl
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
Данные = ПрочитатьJSON(Чтение, Истина);
Чтение.Закрыть();

Авторизация и защита соединения

Большинство рабочих сервисов требуют аутентификации. Для Basic-авторизации логин и пароль передаются третьим и четвёртым параметрами конструктора HTTPСоединение. Для токенной авторизации токен добавляется в заголовок Authorization каждого запроса; если токен имеет срок жизни, предусмотрите процедуру его обновления и храните его в безопасном месте, а не в коде модуля.

По HTTPS обязательно передавайте объект ЗащищенноеСоединениеOpenSSL в конструктор соединения — иначе платформа попытается установить незащищённое соединение на порт 443 и получит ошибку. Если сервер использует самоподписанный сертификат, потребуется указать сертификаты удостоверяющего центра в параметрах защищённого соединения.

Учётные данные храните в защищённом хранилище (например, через общий модуль с установкой привилегированного режима или в константах с ограниченным доступом). Жёсткое прописывание паролей в коде — распространённая причина утечек при выгрузке конфигурации.

Обработка ошибок и таймаутов

Сетевые вызовы ненадёжны по своей природе: сервис может быть недоступен, отвечать медленно или возвращать ошибки. Каждый вызов оборачивайте в конструкцию Попытка/Исключение и фиксируйте описание ошибки в журнале регистрации через ЗаписьЖурналаРегистрации — иначе при сбоях в фоновом задании вы не узнаете причину.

Проверяйте код состояния HTTP-ответа перед разбором тела. Коды 4xx обычно означают ошибку в запросе (неверный токен, формат), 5xx — проблему на стороне сервиса, и повторять запрос в первом случае бессмысленно, а во втором имеет смысл отложенная повторная попытка.

Таймаут в конструкторе HTTPСоединение задавайте явно: значение по умолчанию может быть слишком большим для интерактивной работы пользователя. Для синхронных вызовов из формы разумны 20–30 секунд, для фоновых заданий — больше, в зависимости от объёма данных.

Типичные ошибки
01
Вызов веб-сервиса из клиентской процедуры — на тонком клиенте код не выполнится, переносите вызов в серверную процедуру
02
Отсутствие обработки исключений — пользователь видит техническое окно ошибки вместо понятного сообщения
03
Игнорирование кода состояния ответа — тело с текстом ошибки разбирается как успешные данные
04
Пароль и токен зашиты в код — утечка при выгрузке конфигурации или передаче cf-файла
05
Слишком большой таймаут в интерактивном режиме — форма «зависает» на минуты при недоступном сервисе

Проверка результата подключения

После настройки проверьте подключение поэтапно. Сначала убедитесь, что адрес сервиса доступен с сервера 1С (не только с вашего рабочего компьютера): в файловой базе это одна машина, в клиент-серверном варианте — отдельный сервер, где могут быть свои правила брандмауэра и прокси.

Затем выполните тестовый вызов с минимальными данными и проверьте, что ответ соответствует документации: код состояния, структура JSON или тип возвращаемого значения SOAP-метода. Полезно временно выводить полный текст ответа в сообщение или журнал, чтобы увидеть фактический формат — он нередко отличается от примеров в документации.

Контрольные точки

Как проверить результат

Код состояния HTTP-ответа
Норма

200 или 201, тело содержит ожидаемые данные

Тревожный признак

401/403 (проблема авторизации), 404 (неверный адрес), 500 (ошибка сервиса)

Доступность адреса с сервера 1С
Норма

WSDL или API открывается с сервера, запросы проходят без сетевых ошибок

Тревожный признак

Таймаут или «соединение отклонено» — проверяйте брандмауэр и прокси

Разбор ответа
Норма

JSON читается через ПрочитатьJSON без исключений, поля на месте

Тревожный признак

Ошибка парсинга — сервис вернул HTML-страницу ошибки или другой формат

Поведение при недоступном сервисе
Норма

Пользователь получает понятное сообщение, ошибка пишется в журнал

Тревожный признак

Необработанное исключение и аварийное завершение операции

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

Можно ли подключиться к веб-сервису без изменения конфигурации?

Да, если использовать HTTPСоединение — весь код можно разместить во внешней обработке. WS-ссылка как объект метаданных требует изменения конфигурации, но WSОпределения и WSПрокси можно создать программно по URL, без WS-ссылки, что тоже позволяет обойтись внешней обработкой.

Почему возникает ошибка «Ошибка работы с Интернет: couldn't connect to server»?

Чаще всего адрес недоступен с той машины, где выполняется код: закрыт порт в брандмауэре, требуется прокси или неверно указан хост. Проверьте доступность адреса с сервера 1С, параметры прокси в конструкторе HTTPСоединение и корректность порта.

Как передать файл через веб-сервис?

Для REST API файл отправляется методом УстановитьТелоИзДвоичныхДанных у HTTPЗапроса или как multipart/form-data. В SOAP файлы обычно передаются в base64 внутри XML-сообщения — платформа делает это автоматически для типов Base64Binary, если WSDL описывает такой тип.

Чем отличается WSОпределения от WS-ссылки в конфигураторе?

WS-ссылка — объект метаданных, хранящий адрес WSDL централизованно; WSОпределения — программный объект, создаваемый по URL в коде. Функционально результат одинаков, но WS-ссылку проще менять при переезде сервиса, а программное создание удобно для внешних обработок.

Как вызвать веб-сервис по расписанию?

Создайте регламентное задание, в обработчике которого выполняется вызов сервиса с обработкой ошибок и записью результата. Учтите, что в файловой базе регламентные задания требуют запущенного сеанса с выполнением фоновых задач, либо используйте внешний планировщик.

Что делать, если сервис возвращает данные в кодировке, отличной от UTF-8?

Передайте нужную кодировку параметром в метод ПолучитьТелоКакСтроку, например КодировкаТекста.ANSI или КодировкаТекста.KOI8R. Если кодировка неизвестна, получите тело как двоичные данные и определите её по заголовку Content-Type ответа.

Итог

Что важно запомнить

SOAP-сервис подключайте через WS-ссылку и WSПрокси, REST API — через HTTPСоединение с явными заголовками, таймаутом и защищённым соединением. Код выполняйте на сервере, оборачивайте в Попытка/Исключение, проверяйте код состояния ответа и не храните пароли в коде.