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

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

Как обратиться к веб-сервису из 1С

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

Обращение к веб-сервису из 1С — типовая задача интеграции: получить курсы валют, отправить заказ в CRM, проверить контрагента по ИНН или передать данные в учётную систему партнёра. Платформа «1С:Предприятие» поддерживает два основных подхода: работу через WS-ссылки и WS-прокси для SOAP-сервисов и низкоуровневый объект HTTPСоединение для REST API и произвольных HTTP-запросов.

Выбор подхода зависит от типа сервиса. Если внешняя система публикует WSDL-описание (SOAP), удобнее использовать WS-ссылку — платформа сама сгенерирует типы данных и методы. Если сервис работает по REST и обменивается JSON, потребуется HTTPСоединение с ручной сборкой запроса и разбором ответа. Оба механизма доступны на клиенте и на сервере, но сетевые вызовы корректнее выполнять в серверном коде.

Ниже разобраны оба сценария с примерами кода, настройкой авторизации, обработкой ошибок и проверкой результата. Материал ориентирован на разработчика, который уже знаком с конфигуратором и встроенным языком 1С.

Как понять, какой механизм обращения к сервису выбрать

Первый шаг — определить тип веб-сервиса. SOAP-сервисы публикуют WSDL-файл, который обычно доступен по адресу вида http://сервер/service?wsdl. Если по такому адресу открывается XML-документ с описанием операций и типов, перед вами SOAP, и оптимальный путь — WS-ссылка.

REST-сервисы WSDL не предоставляют. Вместо этого у них есть документация с описанием endpoint'ов, HTTP-методов (GET, POST, PUT, DELETE) и формата тел запросов — чаще всего JSON. Для таких сервисов в 1С используется объект HTTPСоединение.

Сравнение подходов

WS-ссылка и WSПрокси

Подходит для SOAP с WSDL. Типы и методы генерируются автоматически, меньше ручного кода. Ограничение: требуется доступный WSDL, сложнее отладить сырой XML.

HTTPСоединение

Универсальный вариант для REST и любых HTTP-запросов. Полный контроль над заголовками и телом. Ограничение: сериализацию JSON и обработку ответа пишете вручную.

WS-определение в коде

Динамическое создание прокси через WSОпределения без добавления ссылки в конфигурацию. Удобно, когда адрес сервиса меняется, но метаданные не хранятся в конфигурации.

Если сервис поддерживает оба протокола, для простых операций чаще выбирают REST — он легче отлаживается через браузер или curl. SOAP оправдан, когда контракт сложный и важна строгая типизация данных.

Обращение к SOAP-сервису через WS-ссылку

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

Типовой код вызова выглядит так: создаётся WSОпределение по ссылке, затем WSПрокси с указанием URI пространства имён, имени сервиса и точки подключения — все эти значения видны в свойствах WS-ссылки. После этого вызывается нужная операция как обычный метод.

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

Прокси = Новый WSПрокси(Определение,

"http://example.com/namespace",

"MyService",

"MyServiceSoap");

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

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

Результат = Прокси.GetRate("USD");

Параметры операций с сложными типами передаются через XDTO-объекты: их фабрика доступна через свойство Прокси.ФабрикаXDTO. Создавайте объект нужного типа, заполняйте свойства и передавайте в операцию — платформа сама сериализует его в XML.

Обращение к REST API через HTTPСоединение

Для REST-сервисов создаётся объект HTTPСоединение с указанием сервера, порта и параметров защищённого соединения. Затем формируется HTTPЗапрос с методом, заголовками и телом, после чего выполняется метод ВызватьHTTPМетод или удобные сокращения Получить/ОтправитьДляОбработки.

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

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

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

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

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

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

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

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

Чтение = Новый ЧтениеJSON;

Чтение.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());

Данные = ПрочитатьJSON(Чтение);

КонецЕсли;

Для формирования JSON из структуры 1С используйте ЗаписатьJSON с ЗаписьJSON — это надёжнее ручной конкатенации строк, потому что корректно экранирует кавычки и спецсимволы. Даты сериализуйте в формате ISO 8601, который понимает большинство API.

Порядок обращения к REST API
  1. 1
    Изучите документацию сервиса: endpoint, метод, формат авторизации и тела запроса
  2. 2
    Проверьте запрос во внешнем инструменте (curl, Postman) — убедитесь, что сервис отвечает
  3. 3
    Создайте HTTPСоединение с нужным портом и защищённым соединением для HTTPS
  4. 4
    Сформируйте HTTPЗапрос: заголовки Content-Type и Authorization, тело через ЗаписатьJSON
  5. 5
    Выполните вызов и проверьте КодСостояния ответа до разбора тела
  6. 6
    Разберите ответ через ПрочитатьJSON и обработайте ошибки сервиса

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

Большинство веб-сервисов требует аутентификации. Для SOAP это обычно Basic-авторизация через свойства Пользователь и Пароль у WSПрокси. Для REST встречаются три варианта: Basic (логин и пароль в HTTPСоединение), API-ключ в заголовке или параметре запроса и токен Bearer в заголовке Authorization.

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

Токены доступа часто имеют ограниченный срок жизни. Если сервис возвращает код 401, не считайте это сбоем интеграции — сначала обновите токен по процедуре, описанной в документации сервиса, и повторите запрос один раз.

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

Сетевой вызов может завершиться неудачей на нескольких уровнях: сервер недоступен, истёк таймаут, сервис вернул код ошибки, ответ не парсится. Каждый уровень нужно обрабатывать отдельно, иначе диагностика превратится в гадание.

Оберните вызов в Попытка/Исключение и фиксируйте ИнформацияОбОшибке() в журнале регистрации через ЗаписьЖурналаРегистрации — это обязательный минимум для продуктивной интеграции. Таймаут задавайте явно в параметрах HTTPСоединения: значение по умолчанию может быть слишком большим для интерактивных операций и блокировать сеанс пользователя.

Типичные ошибки
01
Проверять только факт получения ответа, игнорируя КодСостояния — ошибка 500 с телом HTML принимается за данные
02
Выполнять обращение к сервису на клиенте в тонком клиенте — запрос идёт с машины пользователя, где нет нужных сертификатов и доступа в сеть
03
Не задавать таймаут — при зависшем сервере сеанс пользователя блокируется на минуты
04
Разбирать JSON через строковые функции вместо ПрочитатьJSON — любой лишний символ ломает логику
05
Повторять запрос в цикле без паузы при ошибке — сервис блокирует за частые обращения

Для повторных попыток применяйте ограниченное число ретраев с нарастающей паузой и только для идемпотентных операций. Повторная отправка запроса на создание документа без контроля дублей может создать два одинаковых заказа внешней системе.

Проверка результата и отладка обмена

Прежде чем искать ошибку в коде 1С, воспроизведите запрос во внешнем инструменте. Если curl или Postman получают корректный ответ, а 1С — нет, проблема в формировании запроса: заголовках, кодировке тела или сертификатах. Если внешний инструмент тоже получает ошибку — вопрос к сервису или учётным данным.

Для отладки полезно логировать полный текст запроса и ответа. В 1С тело запроса можно получить через Запрос.ПолучитьТелоКакСтроку() до отправки, тело ответа — аналогично после. Сравнение этих строк с рабочим запросом из Postman быстро выявляет расхождения: лишний перевод строки, неверную кодировку, отсутствующий заголовок.

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

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

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

200 или 201 для успешных операций, документированные коды для остальных случаев

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

Любой код 4xx/5xx — запрос не выполнен, тело разбирать как данные нельзя

Тело ответа
Норма

Валидный JSON/XML, читается штатными средствами платформы

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

HTML-страница ошибки, пустое тело, кракозябры из-за неверной кодировки

Данные в базе после вызова
Норма

Созданные/обновлённые объекты соответствуют отправленным

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

Дубли документов, пустые поля, рассинхрон с ответом сервиса

Где выполнять вызовы и как встроить их в бизнес-процесс

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

Длительные обмены не должны блокировать интерфейс. Выносите массовую синхронизацию в регламентные задания, а разовые тяжёлые операции — в фоновые задания через ФоновыеЗадания.Выполнить. Пользователю показывайте результат по завершении, а не вращающийся курсор на минуту.

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

Как выбрать сценарий выполнения

Пользователь нажал кнопку и ждёт быстрый ответ (проверка статуса, курс валют)Серверный вызов в той же транзакции формы с коротким таймаутом
Нужно синхронизировать справочники или выгрузить пакет документовРегламентное задание по расписанию с записью ошибок в журнал
Разовая тяжёлая операция по инициативе пользователяФоновое задание с уведомлением пользователя о завершении
Сервис нестабилен и запросы периодически падаютОчередь отправки с отложенными повторами вместо синхронного вызова
Перед началом разработки сохраните WSDL-файл и примеры успешных запросов/ответов локально. Когда интеграция внезапно ломается, эти эталоны позволяют за минуты понять, изменился ли контракт сервиса, или проблема на вашей стороне.
ПЗ
Практическое замечание

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

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

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

Почему HTTPS-запрос из 1С падает, хотя в браузере адрес открывается?

Чаще всего причина в цепочке сертификатов: браузер использует хранилище ОС, а платформа 1С — собственные механизмы OpenSSL. Проверьте, что в HTTPСоединение передан объект ЗащищенноеСоединениеOpenSSL, и при необходимости укажите файл сертификатов удостоверяющих центров. Также проверьте версию TLS, которую требует сервер.

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

Для SOAP файл кодируется в base64 внутри тела запроса — используйте Base64Строка после чтения файла в двоичные данные. Для REST применяется либо base64 в JSON, либо multipart/form-data: в последнем случае тело формируется вручную с разделителями boundary или отправляется как двоичные данные через УстановитьИмяФайлаТела, если API принимает файл напрямую.

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

Получите тело ответа как поток или двоичные данные и преобразуйте через ПолучитьСтроку с явным указанием кодировки, например КодировкаТекста.ANSI или windows-1251. Определить фактическую кодировку помогает заголовок Content-Type ответа — параметр charset.

Можно ли вызывать веб-сервис из 1С без изменения конфигурации?

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

Как защититься от дублей при повторной отправке данных?

Передавайте уникальный идентификатор операции (GUID документа 1С) в каждом запросе и договоритесь, что сервис использует его как ключ идемпотентности. Если сервис этого не поддерживает, перед повторной отправкой запрашивайте у него статус предыдущей операции по тому же идентификатору.

Итог

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

SOAP с WSDL обслуживайте через WS-ссылку и WSПрокси, REST — через HTTPСоединение с ручной сборкой JSON. Вызовы выполняйте на сервере, задавайте таймауты, проверяйте код состояния до разбора ответа, логируйте ошибки в журнал регистрации и никогда не храните пароли и токены в открытом виде.