Обращение к HTTP-сервисам 1С с помощью кода позволяет автоматизировать интеграцию между внешними системами и конфигурацией 1С. Для этого чаще всего используются методы HTTP-запросов: GET, POST, PUT, DELETE. Формирование запроса требует указания точного URL, соответствующего опубликованному REST или SOAP интерфейсу, настроенному в конфигурации 1С через механизм «HTTP-сервисы» или «Веб-сервисы».
Минимальный набор заголовков для корректного запроса включает Content-Type: application/json (или text/xml при SOAP), а также Authorization, если сервис защищён базовой аутентификацией. Для передачи тела запроса в формате JSON необходимо убедиться, что данные сериализованы в корректной структуре, соответствующей ожиданиям обработчика на стороне 1С.
Сервер 1С может отдавать коды ответа: 200 – успешная обработка, 400 – ошибка в запросе, 401 – отсутствие авторизации, 500 – ошибка на стороне сервера. Обработка этих кодов на клиентской стороне обязательна для отладки и устойчивости интеграции. Логирование тела ответа и заголовков – критически важная практика.
При работе с защищёнными сервисами 1С, опубликованными через встроенный веб-сервер или IIS, нужно обеспечить поддержку HTTPS и правильно настроить сертификаты. В случае обращения из 1С во внешнюю систему через HTTPСоединение важно учитывать ограничения на длину строки, формат заголовков и поддерживаемые TLS-протоколы.
Настройка HTTP-соединения в конфигурации 1С
Для выполнения HTTP-запросов в 1С используется объект HTTPСоединение. Он создаётся через встроенный язык 1С с указанием адреса сервиса и, при необходимости, учётных данных.
Пример создания соединения:
Соединение = Новый HTTPСоединение(«https://example.com», «user», «password»);
Если сервис использует нестандартный порт, его необходимо указать явно:
Соединение = Новый HTTPСоединение(«https://example.com:8443», «user», «password»);
Для включения поддержки HTTPS необходимо, чтобы на клиентской машине был установлен криптопровайдер, поддерживающий работу с TLS. В случае самоподписанных сертификатов может потребоваться установка корневого сертификата вручную.
Для передачи заголовков рекомендуется использовать объект HTTPЗапрос. Пример установки заголовка:
Запрос = Новый HTTPЗапрос(«GET», «/api/data»);
Запрос.УстановитьЗаголовок(«Authorization», «Bearer » + Токен);
Если необходимо использовать прокси, его параметры задаются через свойства ПроксиСервер, ПроксиПорт, ПроксиПользователь и ПроксиПароль объекта HTTPСоединение.
Перед отправкой запроса рекомендуется установить таймаут соединения, чтобы избежать зависания при недоступности сервиса:
Соединение.Таймаут = 30;
При работе с REST API, возвращающим JSON, следует установить заголовок Accept:
Запрос.УстановитьЗаголовок(«Accept», «application/json»);
Если требуется отладка, полезно сохранять как тело запроса, так и полный ответ сервера, включая статус и заголовки.
Формирование тела запроса в формате JSON или XML
Для взаимодействия с HTTP-сервисами 1С тело запроса формируется в зависимости от настроек конкретного веб-сервиса. Если требуется JSON, используйте сериализацию данных в структуру, соответствующую ожиданиям сервиса. В 1С это выполняется через объект ЗаписьJSON
:
Данные = Новый Структура;
Данные.Вставить("Код", "123");
Данные.Вставить("Наименование", "Тестовый товар");
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписьJSON.ЗаписатьЗначение(Данные);
ТелоЗапроса = ЗаписьJSON.Закрыть();
Если сервис принимает XML, применяйте объект ЗаписьXML
. Структура XML должна строго соответствовать XSD-схеме, принятой на стороне сервиса:
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьСтроку();
ЗаписьXML.ЗаписатьНачалоЭлемента("Товар");
ЗаписьXML.ЗаписатьЭлемент("Код", "123");
ЗаписьXML.ЗаписатьЭлемент("Наименование", "Тестовый товар");
ЗаписьXML.ЗаписатьКонецЭлемента();
ТелоЗапроса = ЗаписьXML.Закрыть();
Формат должен быть указан в заголовке Content-Type
соответствующим образом: application/json
или application/xml
. Некорректный заголовок приведёт к отказу в обработке запроса.
Добавление заголовков HTTP-запроса вручную
Для прямого управления HTTP-заголовками в запросах к сервисам 1С используется объект `HTTPЗапрос` из библиотеки HTTP-сервисов. Заголовки добавляются через метод `УстановитьЗаголовок`.
Пример инициализации:
Запрос = Новый HTTPЗапрос("https://example.com/api");
Запрос.УстановитьЗаголовок("Content-Type", "application/json");
Запрос.УстановитьЗаголовок("Authorization", "Bearer " + Токен);
Заголовок `Content-Type` обязателен при передаче данных в теле запроса. `Authorization` используется для доступа к защищённым ресурсам и должен формироваться строго в соответствии с требованиями сервера (например, схема Bearer, Basic или кастомная).
Чтобы избежать подмены заголовков при автоматической сериализации, перед отправкой запроса через HTTP-сервис необходимо отключить автоматическую установку заголовков, если среда это поддерживает. В противном случае повторно установленный `Content-Type` может быть проигнорирован.
Для отладки отправляемых заголовков можно использовать прокси-сервер (например, Fiddler или mitmproxy) и проверять реальное содержимое HTTP-запроса.
Некоторые серверы чувствительны к регистру значений заголовков. Например, `accept` и `Accept` могут интерпретироваться по-разному в нестандартных API. Заголовки следует задавать в точности так, как требует документация сервиса.
Отправка POST-запроса с авторизацией из 1С
Для выполнения POST-запроса с авторизацией в 1С используется объект HTTPСоединение. Поддерживаются базовая и расширенная авторизация. Ниже пример отправки JSON-запроса с использованием базовой авторизации:
Запрос = Новый HTTPЗапрос("/api/endpoint"); Запрос.УстановитьТелоИзСтроки("{""ключ"":""значение""}"); Запрос.УстановитьЗаголовок("Content-Type", "application/json"); ИмяПользователя = "user"; Пароль = "pass"; БазоваяСтрока = СтрШаблон("%1:%2", ИмяПользователя, Пароль); БазоваяСтрока = Базовая64(БазоваяСтрока); Запрос.УстановитьЗаголовок("Authorization", "Basic " + БазоваяСтрока); Соединение = Новый HTTPСоединение("example.com", 443, Истина); Ответ = Соединение.Отправить(Запрос);
Если используется авторизация по токену, вместо строки «Basic …» необходимо указать соответствующий токен:
Запрос.УстановитьЗаголовок("Authorization", "Bearer eyJhbGciOiJIUzI1NiIs...");
Рекомендуется контролировать код ответа сервера и при необходимости обрабатывать ошибки:
Если Ответ.КодСостояния <> 200 Тогда Сообщить("Ошибка: " + Ответ.КодСостояния + " - " + Ответ.ТекстСостояния); Иначе ТелоОтвета = Ответ.ПолучитьТелоКакСтроку(); // Обработка тела ответа КонецЕсли;
В случае нестандартных сертификатов необходимо установить флаг ИгнорироватьОшибкиСертификата в объекте HTTPСоединение:
Соединение.ИгнорироватьОшибкиСертификата = Истина;
Обработка ответа сервера и разбор данных
Ответ от HTTP-сервиса 1С, как правило, возвращается в формате JSON или XML. Для обработки данных необходимо определить тип содержимого, используя заголовок Content-Type
. Если ожидается JSON, следует убедиться, что значение заголовка равно application/json
. Несоответствие может указывать на ошибку на стороне сервера или неправильную конфигурацию точки входа.
Для разбора JSON-ответа в большинстве языков используется встроенный парсер. Например, в Python: response.json()
, в JavaScript: JSON.parse(responseText)
. В случае с XML необходимо использовать парсеры, поддерживающие XPath или DOM API.
Структура ответа может включать вложенные объекты, массивы, коды статуса и сообщения об ошибках. Обращение к ним должно быть строго типизировано. Например, если поле data.items
– массив, перед итерацией следует убедиться, что он не пуст: if data.items and isinstance(data.items, list):
.
Обработка ошибок должна опираться не только на HTTP-статусы, но и на внутренние поля ответа. Например, даже при коде 200 сервис может вернуть объект с полем success: false
. Необходимо проверять эти значения до начала логики обработки.
При работе с 1С важно учитывать, что строки могут содержать данные в специфической кодировке (например, CP1251), особенно в ответах устаревших конфигураций. Для корректного разбора предварительно перекодируйте тело ответа в UTF-8.
Если сервис возвращает файлы (PDF, Excel), необходимо обрабатывать поток бинарных данных напрямую и сохранять его с корректным расширением, полученным из заголовка Content-Disposition
.
В случае нестабильных ответов или неполных данных полезно сохранять оригинальное тело ответа в лог до разбора. Это упростит отладку при изменениях структуры ответа со стороны 1С.
Работа с кодами состояния HTTP и исключениями
При взаимодействии с HTTP-сервисом 1С важно корректно обрабатывать коды состояния и исключения. Это помогает избежать ошибок и корректно реагировать на изменения в работе сервиса.
HTTP-ответ включает в себя код состояния, который информирует о результате запроса. Для 1С наиболее значимыми являются следующие категории кодов:
- 2xx – успешные запросы. Например, код 200 означает успешное выполнение запроса.
- 4xx – ошибки клиента. Например, 400 означает некорректный запрос, а 401 – отсутствие авторизации.
- 5xx – ошибки сервера. Например, 500 указывает на внутреннюю ошибку сервера, а 502 на недоступность сервера.
При получении кода состояния необходимо проверять, в какой категории он находится, и в зависимости от этого предпринимать действия:
- Для успешных кодов (например, 200 или 201) можно продолжить обработку ответа, например, извлекая данные из тела ответа.
- Для ошибок 4xx стоит проверить правильность запроса. Например, код 404 может означать, что ресурс не найден, а 403 – отказ в доступе.
- Ошибки 5xx требуют внимательной проверки состояния сервера. В случае с 502 стоит подумать о повторных попытках запроса с увеличением интервала времени.
Важный момент – обработка исключений, которые могут возникнуть при выполнении запроса. В 1С можно использовать конструкции обработки исключений для разных ситуаций:
- Для ошибок сети (например, недоступности сервера) используйте блоки try-catch. Исключения могут быть вызваны проблемами с подключением, тайм-аутами или DNS-ошибками.
- Если ответ от сервера имеет неожиданный формат, стоит отловить исключение парсинга (например, JSONDecodeError) и обработать его соответствующим образом.
Пример обработки ошибки запроса:
Попытка выполнения запроса try Результат = HTTPЗапрос.Отправить(); except Когда ОшибкаСети Сообщить("Ошибка сети, повторите запрос позже."); Когда ОшибкаПарсинга Сообщить("Не удалось обработать ответ."); end try;
Также важно учитывать, что коды состояния HTTP не всегда означают фатальные ошибки. Например, 204 No Content может означать успешный запрос, но без тела ответа. В таких случаях важно правильно настроить обработку этих кодов для корректной работы системы.
Пример реализации запроса к внешнему REST API
Для взаимодействия с внешним REST API из 1С можно использовать стандартный механизм HTTP-запросов. В этом примере рассмотрим реализацию запроса к REST API для получения данных в формате JSON.
1. Подготовим функцию для отправки GET-запроса. Для этого используем объект HTTPЗапрос
, который позволяет конфигурировать параметры запроса и получать ответ.
Функция ПолучитьДанныеИзAPI()
URL = "https://api.example.com/data";
Запрос = Новый HTTPЗапрос(URL);
Запрос.УстановитьЗаголовок("Content-Type", "application/json");
Ответ = Запрос.Отправить();
Если Ответ.КодСостояния = 200 Тогда
Данные = Ответ.ПрочитатьКакСтроку();
Результат = ПреобразоватьИзJSON(Данные);
Возврат Результат;
Иначе
Сообщить("Ошибка запроса: " + Ответ.КодСостояния);
Возврат Неопределено;
КонецЕсли;
КонецФункции
2. Функция ПреобразоватьИзJSON
конвертирует строку в объект. В 1С для работы с JSON можно использовать встроенные функции, такие как JSON.Прочитать()
.
Функция ПреобразоватьИзJSON(ТекстJSON)
JSONОбъект = Новый JSON;
Возврат JSONОбъект.Прочитать(ТекстJSON);
КонецФункции
3. Важно учитывать возможные ошибки при отправке запроса. Например, при неправильном URL или отсутствии интернета сервер может вернуть код состояния, отличный от 200. В таких случаях нужно правильно обработать ошибку и обеспечить информирование пользователя.
4. Для отправки POST-запроса с данными используется следующий код:
Функция ОтправитьДанныеAPI(Данные)
URL = "https://api.example.com/submit";
Запрос = Новый HTTPЗапрос(URL);
Запрос.УстановитьМетод("POST");
Запрос.УстановитьТело(Данные);
Запрос.УстановитьЗаголовок("Content-Type", "application/json");
Ответ = Запрос.Отправить();
Если Ответ.КодСостояния = 200 Тогда
ДанныеОтвета = Ответ.ПрочитатьКакСтроку();
Результат = ПреобразоватьИзJSON(ДанныеОтвета);
Возврат Результат;
Иначе
Сообщить("Ошибка запроса: " + Ответ.КодСостояния);
Возврат Неопределено;
КонецЕсли;
КонецФункции
Для отправки данных в теле запроса также можно использовать объект ТелоЗапроса
, если необходимо отправлять сложные структуры данных, например, массивы или объекты с вложенными данными.
Такая реализация позволяет эффективно работать с внешними REST API, обеспечивая стабильность и простоту обработки ошибок при взаимодействии с сервисами через HTTP в 1С.
Вопрос-ответ:
Как можно отправить запрос к HTTP-сервису 1С через код?
Для отправки запроса к HTTP-сервису 1С можно использовать стандартный механизм работы с HTTP в платформе 1С. В частности, для этого нужно создать объект типа «HTTPЗапрос», задать ему необходимые параметры, такие как URL сервиса и тело запроса, а затем вызвать метод «Отправить». Это позволит взаимодействовать с внешними сервисами и получать от них данные для обработки в 1С.
Что нужно учитывать при написании кода для запроса к HTTP-сервису 1С?
При написании кода важно учитывать несколько аспектов. Во-первых, необходимо правильно настроить параметры запроса, такие как заголовки и тип данных, которые отправляются. Во-вторых, следует обеспечить обработку ошибок, например, если сервис не доступен или возвращает некорректный ответ. Также стоит учесть особенности безопасности, например, использование HTTPS для защиты данных.
Как обрабатывать ответы от HTTP-сервиса в 1С?
Ответ от HTTP-сервиса в 1С можно обработать с помощью метода «ПолучитьОтвет» объекта «HTTPЗапрос». Ответ обычно приходит в виде строки, которую можно преобразовать в нужный формат, например, в структуру или массив данных, в зависимости от формата ответа (JSON, XML и др.). После этого можно работать с полученными данными в рамках обработки запроса, выполняя нужные действия в системе.
Можно ли отправить POST-запрос к HTTP-сервису из 1С, и как это сделать?
Да, отправить POST-запрос к HTTP-сервису из 1С можно. Для этого нужно создать объект «HTTPЗапрос», установить метод запроса как POST и передать необходимые данные в теле запроса. В качестве данных можно использовать, например, строку в формате JSON или форму данных. Важно правильно настроить заголовки, такие как Content-Type, чтобы сервис мог корректно обработать запрос.
Какие ошибки могут возникать при работе с HTTP-сервисами в 1С?
При работе с HTTP-сервисами в 1С могут возникать различные ошибки. Например, это может быть ошибка сети, если сервис недоступен, ошибка авторизации при работе с защищёнными сервисами, либо неправильный формат данных в ответе от сервиса. Также могут возникать проблемы с настройками прокси-сервера или если сервер возвращает неожиданный статус-код. Важно предусматривать обработку таких ситуаций в коде для надёжной работы приложения.