Разработка и Конфигурация · 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Соединение.
Сравнение подходов
Подходит для SOAP с WSDL. Типы и методы генерируются автоматически, меньше ручного кода. Ограничение: требуется доступный WSDL, сложнее отладить сырой XML.
Универсальный вариант для REST и любых HTTP-запросов. Полный контроль над заголовками и телом. Ограничение: сериализацию JSON и обработку ответа пишете вручную.
Динамическое создание прокси через 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.
- 1Изучите документацию сервиса: endpoint, метод, формат авторизации и тела запроса
- 2Проверьте запрос во внешнем инструменте (curl, Postman) — убедитесь, что сервис отвечает
- 3Создайте HTTPСоединение с нужным портом и защищённым соединением для HTTPS
- 4Сформируйте HTTPЗапрос: заголовки Content-Type и Authorization, тело через ЗаписатьJSON
- 5Выполните вызов и проверьте КодСостояния ответа до разбора тела
- 6Разберите ответ через ПрочитатьJSON и обработайте ошибки сервиса
Авторизация и защищённое соединение
Большинство веб-сервисов требует аутентификации. Для SOAP это обычно Basic-авторизация через свойства Пользователь и Пароль у WSПрокси. Для REST встречаются три варианта: Basic (логин и пароль в HTTPСоединение), API-ключ в заголовке или параметре запроса и токен Bearer в заголовке Authorization.
Для HTTPS всегда передавайте объект ЗащищенноеСоединениеOpenSSL — без него соединение по 443 порту не установится. Если сервер использует самоподписанный сертификат, придётся либо добавить сертификат в доверенные на уровне ОС, либо создать объект защищённого соединения без проверки сертификата — но это допустимо только для тестовых стендов.
Токены доступа часто имеют ограниченный срок жизни. Если сервис возвращает код 401, не считайте это сбоем интеграции — сначала обновите токен по процедуре, описанной в документации сервиса, и повторите запрос один раз.
Обработка ошибок и таймаутов
Сетевой вызов может завершиться неудачей на нескольких уровнях: сервер недоступен, истёк таймаут, сервис вернул код ошибки, ответ не парсится. Каждый уровень нужно обрабатывать отдельно, иначе диагностика превратится в гадание.
Оберните вызов в Попытка/Исключение и фиксируйте ИнформацияОбОшибке() в журнале регистрации через ЗаписьЖурналаРегистрации — это обязательный минимум для продуктивной интеграции. Таймаут задавайте явно в параметрах HTTPСоединения: значение по умолчанию может быть слишком большим для интерактивных операций и блокировать сеанс пользователя.
Для повторных попыток применяйте ограниченное число ретраев с нарастающей паузой и только для идемпотентных операций. Повторная отправка запроса на создание документа без контроля дублей может создать два одинаковых заказа внешней системе.
Проверка результата и отладка обмена
Прежде чем искать ошибку в коде 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. Вызовы выполняйте на сервере, задавайте таймауты, проверяйте код состояния до разбора ответа, логируйте ошибки в журнал регистрации и никогда не храните пароли и токены в открытом виде.