Разработка и Конфигурация · 12 мин
Как отправить запрос в 1С
Как отправить HTTP-запрос из 1С: объект HTTPСоединение, GET и POST-запросы, заголовки, JSON, авторизация, обработка ошибок и типичные сбои.
Отправка запросов из 1С — стандартная задача интеграции: обмен с банковскими сервисами, сайтами, CRM, курьерскими службами и внутренними API. Во встроенном языке для этого используется объект HTTPСоединение вместе с объектами HTTPЗапрос и HTTPОтвет. Этот механизм доступен и на сервере, и на клиенте, но на практике запросы выполняют на сервере, чтобы не зависеть от настроек рабочего места пользователя.
Прежде чем писать код, нужно знать четыре вещи: адрес сервера (хост и порт), ресурс на сервере (путь после домена), метод запроса (GET, POST, PUT и другие) и формат тела (JSON, XML, form-data). Любой из этих параметров, указанный неверно, приведёт либо к ошибке соединения, либо к отказу сервера принять запрос.
Важно понимать разницу между ошибкой соединения и ошибкой ответа. Ошибка соединения — это исключение встроенного языка: сервер недоступен, неправильный порт, проблема с сертификатом. Ошибка ответа — это код состояния HTTP (например, 400, 401, 404, 500): соединение установлено, но сервер отказался выполнить операцию. Их нужно обрабатывать по-разному.
Как работает механизм HTTP-запросов в 1С
Объект HTTPСоединение описывает канал связи с конкретным сервером: хост, порт, логин и пароль базовой авторизации, прокси и параметры TLS. Само по себе соединение ничего не отправляет — это лишь «труба», по которой уходят запросы. Запрос создаётся отдельным объектом HTTPЗапрос, где задаётся адрес ресурса, заголовки и тело.
Отправка выполняется методом ВызватьHTTPМетод(Метод, Запрос) или укороченными вариантами Получить() для GET и ОтправитьДляОбработки() для POST. Результат возвращается как объект HTTPОтвет, из которого читают КодСостояния и тело через ПолучитьТелоКакСтроку() или ПолучитьТелоКакПоток().
Для защищённых соединений (https) в конструктор HTTPСоединение последним параметром передаётся объект ЗащищенноеСоединениеOpenSSL. Без него при обращении к https-адресу вы получите ошибку установки соединения. Проверка сертификата в таком объекте может быть отключена для тестового стенда, но в рабочей базе отключать проверку небезопасно.
Как отправить GET-запрос: минимальный пример
GET-запрос используется для получения данных: курсов валют, статуса заказа, списка товаров из внешней системы. Тело у GET-запроса обычно отсутствует, параметры передаются в строке адреса после знака вопроса.
Соединение = Новый HTTPСоединение("api.example.ru", 443, , , , 30,
Новый ЗащищенноеСоединениеOpenSSL);
Запрос = Новый HTTPЗапрос("/v1/status?id=12345");
Запрос.Заголовки.Вставить("Accept", "application/json");
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
ТелоОтвета = Ответ.ПолучитьТелоКакСтроку();
КонецЕсли;Обратите внимание на параметры конструктора: хост указывается без «https://» и без пути, порт для https — 443, для http — 80. Шестой параметр (в примере 30) — таймаут в секундах. Без таймаута запрос при недоступном сервере может «зависнуть» надолго и заблокировать сеанс пользователя или фоновое задание.
Русские буквы и спецсимволы в параметрах адреса нужно кодировать функцией КодироватьСтроку(Значение, СпособКодированияСтроки.КодировкаURL). Иначе сервер получит битую строку и вернёт ошибку 400.
Как отправить POST-запрос с телом в формате JSON
POST-запросы применяются для передачи данных: создания заявки, отправки заказа, авторизации по API-ключу. Тело чаще всего формируется в JSON. В 1С для сборки JSON используется ЗаписьJSON, либо структура сериализуется через ЗаписатьJSON.
Соединение = Новый HTTPСоединение("api.example.ru", 443, , , , 30,
Новый ЗащищенноеСоединениеOpenSSL);
Запрос = Новый HTTPЗапрос("/v1/orders");
Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Запрос.Заголовки.Вставить("Authorization", "Bearer ВАШ_ТОКЕН");
Запрос.УстановитьТелоИзСтроки("{""number"":""A-101"",""sum"":1500}");
Ответ = Соединение.ОтправитьДляОбработки(Запрос);Заголовок Content-Type обязателен: без него многие серверы не распознают тело и вернут ошибку 400 или 415. Авторизация обычно передаётся либо заголовком Authorization с токеном, либо параметрами логина и пароля в самом объекте HTTPСоединение (basic-авторизация) — какой способ требуется, указано в документации конкретного API.
Ответ в формате JSON разбирается объектом ЧтениеJSON: создаёте объект, вызываете УстановитьСтроку(ТелоОтвета), затем ПрочитатьJSON с параметром ПрочитатьВСоответствие = Истина. Дальше значения извлекаются из соответствия по ключам.
Как обработать ответ и ошибки
Код состояния — первое, что нужно проверить. Значения 200–299 означают успех, 301–302 — перенаправление, 400–499 — ошибку на стороне запроса (неверные данные, нет доступа), 500–599 — сбой на сервере. Не стоит считать успехом сам факт получения ответа: сервер мог вернуть 500 с текстом ошибки в теле.
Как проверить результат
200–299, тело содержит ожидаемые данные
4xx или 5xx — читайте текст ошибки в теле ответа
Валидный JSON/XML, разбирается без исключения
Пустое тело или HTML-страница ошибки вместо данных
Ответ приходит в пределах заданного таймаута
Исключение по таймауту — проверяйте сеть и доступность сервера
Исключения соединения (сервер недоступен, ошибка TLS, таймаут) перехватываются конструкцией Попытка ... Исключение ... КонецПопытки. В блоке исключения логируйте ОписаниеОшибки() вместе с адресом и методом запроса — без этого разбирать инциденты будет нечего. Для регламентных обменов полезно писать ошибки в журнал регистрации через ЗаписьЖурналаРегистрации.
При кодах 401 и 403 не повторяйте запрос в цикле: проблема в авторизации, и повтор только усугубит ситуацию вплоть до блокировки ключа. При 429 (превышен лимит запросов) и 5xx разумна повторная попытка с паузой, но число попыток ограничивайте, например тремя.
Альтернативные способы обмена: веб-сервисы и HTTP-сервисы
Если обе стороны обмена — ваши системы, вместо ручной сборки HTTP-запросов часто удобнее другие механизмы платформы. Для приёма запросов в 1С публикуются HTTP-сервисы (объект конфигурации «HTTP-сервисы») — тогда внешняя система сама обращается к вашей базе по REST-подобному адресу. Для SOAP-интеграций используются веб-сервисы и WS-ссылки, которые генерируют прокси-объекты по WSDL-описанию.
Сравнение вариантов
Универсальный способ обращения к любому внешнему API; требует ручной работы с JSON, заголовками и ошибками
Подходит, когда внешняя система должна вызывать 1С; требует публикации базы на веб-сервере
Удобна для корпоративных сервисов с WSDL; платформа сама формирует XML, но механизм тяжелее и менее гибок
Даёт доступ к данным базы без кода; подходит для чтения, ограничен в логике и требует настройки публикации
Выбор зависит от направления обмена: если 1С выступает клиентом чужого API — почти всегда это HTTPСоединение; если 1С должна принимать вызовы — HTTP-сервисы. Публикация базы на веб-сервере (IIS или Apache) — отдельная задача администрирования: без публикации HTTP-сервисы и OData извне недоступны.
Где выполнять запросы и как защитить доступ
Запросы к внешним системам выполняйте на сервере или в фоновом задании. Выполнение на клиенте создаёт проблемы: у пользователя может не быть доступа в интернет, прокси настроен иначе, а длительный запрос блокирует интерфейс. Для регулярных обменов используйте регламентные задания с обработкой ошибок и журналированием.
Секреты (токены, пароли API) не храните в коде модулей и в открытом виде в константах. Распространённая практика — хранение в защищённом хранилище (ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище в конфигурациях на БСП) или в отдельном регистре с ограниченными правами. Доступ к функциям обмена ограничивайте ролями: рядовому пользователю кнопка «Отправить запрос» обычно не нужна.
- 1Изучите документацию API: хост, путь, метод, формат тела, способ авторизации
- 2Проверьте запрос во внешнем инструменте (Postman, curl), чтобы отделить проблемы API от проблем кода
- 3Напишите код: HTTPСоединение с таймаутом и TLS, HTTPЗапрос с заголовками и телом
- 4Оберните вызов в Попытка/Исключение, проверьте КодСостояния, разберите тело ответа
- 5Протестируйте ошибочные сценарии: неверный токен, недоступный сервер, пустой ответ
- 6Вынесите секреты в безопасное хранилище и настройте права доступа
Отладка: как понять, что именно не работает
Главный приём отладки — воспроизвести запрос вне 1С. Если тот же запрос с теми же заголовками и телом в Postman или curl возвращает 200, а из 1С — ошибку, проблема в коде: адресе, кодировке, заголовках. Если и внешний инструмент получает отказ — проблема в данных или доступе, и код трогать бессмысленно.
Полезно временно выводить в сообщение или журнал полный текст запроса и ответа: адрес ресурса, заголовки, тело, код состояния. По такому снимку большинство проблем диагностируется за минуты. После отладки логирование тела отключите или сократите — в нём могут быть персональные данные и секреты.
Частая ситуация: запрос из 1С возвращает кракозябры вместо русского текста. Причина почти всегда в кодировке — сервер отдал тело в UTF-8, а строка прочитана иначе. Указывайте кодировку явно в ПолучитьТелоКакСтроку(КодировкаТекста.UTF8) и в заголовке Content-Type при отправке.
Если соединение рвётся с ошибкой сертификата на вполне легитимном сервере, проверьте актуальность корневых сертификатов на сервере 1С и корректность системного времени — просроченные цепочки и сбитые часы дают характерные сбои TLS.
Что важно запомнить
Запрос из 1С — это HTTPСоединение плюс HTTPЗапрос: хост без префикса, обязательный таймаут, TLS для https, корректный Content-Type, проверка кода состояния и обработка исключений. Секреты — в безопасном хранилище, обмены — на сервере, отладка — через сравнение с внешним инструментом.
Частые вопросы
Как отправить запрос из 1С без программирования?
Штатного «конструктора запросов к API» для пользователя в типовых конфигурациях нет. Если нужен разовый обмен, проще использовать внешний инструмент (Postman, curl) и загрузить результат в 1С файлом. Постоянные обмены без доработки возможны только там, где конфигурация уже содержит готовую интеграцию с нужным сервисом.
Чем отличается Получить() от ВызватьHTTPМетод()?
Получить() — сокращение для GET-запроса, ОтправитьДляОбработки() — для POST. ВызватьHTTPМетод() универсален: метод (GET, POST, PUT, DELETE, PATCH) передаётся строкой первым параметром. Для любых методов, кроме GET и POST, используется только он.
Почему запрос работает на клиенте, но падает на сервере?
Сервер 1С — отдельная машина со своими сетевыми настройками: там может быть закрыт выход в интернет, другой прокси, не установлены корневые сертификаты. Проверяйте доступность адреса именно с сервера, например через ping или тестовый запрос из консоли сервера.
Как передать файл в запросе?
Небольшие файлы передают в теле запроса в base64 внутри JSON или как бинарное тело через УстановитьТелоИзДвоичныхДанных(). Для multipart/form-data тело формируют вручную с границами (boundary) — готового конструктора multipart в платформе нет, это нужно учитывать при оценке трудоёмкости.
Можно ли выполнять запросы асинхронно, чтобы не блокировать работу?
Да: вынесите обмен в фоновое задание через ФоновыеЗадания.Выполнить() или в регламентное задание. Пользователь продолжит работу, а результат фиксируется в базе или сообщается через механизм длительных операций БСП.
Что делать, если сервер возвращает ошибку 403, хотя токен верный?
Проверьте, что токен передаётся именно в том заголовке и формате, который требует API (например, с префиксом Bearer и пробелом). Также убедитесь, что у ключа есть права на конкретный метод и что запрос идёт с разрешённого IP-адреса, если у сервиса есть фильтрация по адресам.