Вызов HTTP-сервиса 1С из другой базы, curl и Postman: от публикации до разбора ответа
Содержание
Чтобы обратиться к HTTP-сервису 1С, его нужно опубликовать на веб-сервере и отправить запрос на адрес вида http://сервер/имя_публикации/hs/корневой_URL/шаблон. Из кода 1С запрос отправляют через объекты HTTPСоединение и HTTPЗапрос, снаружи — любым HTTP-клиентом: curl, Postman, скриптом на Python.
Чаще всего сервис уже написан, а вызов возвращает 404 или 401, и непонятно, где сломалось: в публикации, в адресе или в правах. Ниже — весь путь по порядку, с рабочим кодом и разбором ответов.
Подготовка: что должно быть готово до первого вызова
HTTP-сервис — это объект конфигурации в ветке Общие → HTTP-сервисы. Сам по себе он ничего не слушает: запросы принимает веб-сервер (IIS или Apache) с модулем расширения веб-сервера 1С и передаёт их в информационную базу.
Перед вызовом проверьте четыре вещи:
- 🧩 Сервис есть в конфигурации или расширении. У него задан корневой URL (например,
api), шаблоны URL (/orders/{id}) и методы (GET, POST и т.д.) с обработчиками. - 🌐 Установлен веб-сервер и компоненты платформы «Модули расширения веб-сервера» той же разрядности и версии, что и сервер 1С.
- 📤 База опубликована, и в публикации включены HTTP-сервисы.
- 👤 Есть пользователь ИБ, под которым будет работать вызов, с паролем и нужными ролями.
Как устроен адрес сервиса
Адрес собирается из частей. Пример: публикация trade, корневой URL api, шаблон /orders/{id}:
http://srv01/trade/hs/api/orders/125
| Часть адреса | Откуда берётся |
|---|---|
srv01 | имя или IP веб-сервера, при необходимости с портом |
trade | имя публикации (виртуальный каталог) |
hs | фиксированный префикс HTTP-сервисов |
api | свойство «Корневой URL» сервиса |
orders/125 | шаблон URL, где {id} подставляется значением 125 |
Префикс hs путают с ws — тот относится к веб-сервисам SOAP. На адрес с ws HTTP-сервис не ответит.
Публикация HTTP-сервисов на веб-сервере
- Запустите Конфигуратор от имени администратора Windows — иначе публикация не сможет записать файлы в каталог веб-сервера.
- Откройте
Администрирование → Публикация на веб-сервере. - Укажите имя публикации и каталог.
- Перейдите на вкладку HTTP-сервисов, включите флажок
Публиковать HTTP-сервисыи отметьте нужные сервисы. - Если сервис лежит в расширении, включите также
Публиковать HTTP-сервисы расширений по умолчанию. - Нажмите «Опубликовать» и согласитесь на перезапуск веб-сервера.
Перезапуск IIS или Apache обрывает все текущие HTTP-сеансы с базой. Если через этот веб-сервер работают пользователи веб-клиента или другие интеграции, публикуйте в нерабочее время.
После публикации в каталоге появится файл default.vrd. В нём видно, что реально опубликовано:
<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
base="/trade"
ib="Srvr="srv01";Ref="trade";">
<httpServices publishByDefault="false">
<service name="API" rootUrl="api" enable="true"/>
</httpServices>
</point>
Если сервиса нет в списке или enable="false", вызов вернёт 404 при любом коде.
Соединение и аутентификация: под каким пользователем работает вызов
Каждый запрос к HTTP-сервису открывает сеанс в базе от имени конкретного пользователя ИБ. Варианты такие:
| Способ | Как работает | Когда применять |
|---|---|---|
| Basic-авторизация в запросе | Логин и пароль передаются в заголовке Authorization | Основной вариант для интеграций |
| Пользователь в публикации | Логин и пароль записаны в default.vrd, клиент их не передаёт | Закрытая внутренняя сеть, тестовые стенды |
| Аутентификация ОС | Вход под доменной учётной записью | Внутренние сервисы в домене |
У пользователя ИБ должна быть включена аутентификация 1С:Предприятия и задан пароль. Пустой пароль и кириллический логин — частые источники проблем: часть внешних клиентов кодирует логин не в UTF-8, и сервер его не узнаёт. Для интеграций заведите отдельного латинского пользователя, например api_exchange.
Инициализация HTTPСоединение
В коде 1С соединение создаётся один раз и описывает сервер, а не конкретный адрес:
Соединение = Новый HTTPСоединение(
"srv01", // сервер, без http:// и без пути
80, // порт
"api_exchange", // пользователь ИБ
"Пароль123", // пароль
, // прокси
30); // таймаут, секунд
Для HTTPS добавьте защищённое соединение и порт 443:
SSL = Новый ЗащищенноеСоединениеOpenSSL(, Новый СертификатыУдостоверяющихЦентровОС);
Соединение = Новый HTTPСоединение("api.example.ru", 443,
"api_exchange", "Пароль123", , 30, SSL);
Не храните пароль в тексте модуля. Держите его в константе с ограниченными правами или в безопасном хранилище и читайте в привилегированном режиме.
Формирование и отправка HTTP-запроса из 1С
Объект HTTPЗапрос описывает путь на сервере, заголовки и тело. Путь пишется без имени сервера, но с именем публикации.
GET: получить данные
Запрос = Новый HTTPЗапрос("/trade/hs/api/orders/125");
Запрос.Заголовки.Вставить("Accept", "application/json");
Ответ = Соединение.Получить(Запрос);
Параметры строки запроса добавляйте прямо в путь: /trade/hs/api/orders?date=2026-10-01. Кириллицу и пробелы в значениях кодируйте функцией КодироватьСтроку(Значение, СпособКодированияСтроки.КодировкаURL).
POST: передать данные в JSON
Данные = Новый Структура;
Данные.Вставить("number", "А-125");
Данные.Вставить("sum", 15400.50);
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
ЗаписатьJSON(Запись, Данные);
ТекстJSON = Запись.Закрыть();
Запрос = Новый HTTPЗапрос("/trade/hs/api/orders");
Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Запрос.УстановитьТелоИзСтроки(ТекстJSON, "UTF-8",
ИспользованиеByteOrderMark.НеИспользовать);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Отключать BOM важно: многие внешние парсеры JSON спотыкаются о невидимые байты в начале тела.
Какой метод соединения выбрать
| HTTP-метод | Метод HTTPСоединение |
|---|---|
| GET | Получить(Запрос) |
| POST | ОтправитьДляОбработки(Запрос) |
| PUT | Записать(Запрос) |
| DELETE | Удалить(Запрос) |
| любой, в том числе PATCH | ВызватьHTTPМетод("PATCH", Запрос) |
Вызов без 1С: curl и Postman
Для проверки сервиса снаружи удобнее всего curl:
curl -u api_exchange:Пароль123 \
-H "Content-Type: application/json; charset=utf-8" \
-d "{\"number\":\"А-125\",\"sum\":15400.50}" \
http://srv01/trade/hs/api/orders
В Postman выберите метод, вставьте полный адрес, на вкладке Authorization укажите тип Basic Auth и логин с паролем. Если из Postman сервис отвечает, а из 1С нет — ищите ошибку в коде вызова, а не в публикации.
Обработка ответа и разбор ошибок
Объект HTTPОтвет содержит код состояния, заголовки и тело. Код проверяйте всегда — платформа не бросает исключение на ответ 404 или 500, оно возникает только при сетевой ошибке.
Попытка
Ответ = Соединение.Получить(Запрос);
Исключение
ЗаписьЖурналаРегистрации("Обмен.HTTP", УровеньЖурналаРегистрации.Ошибка, , ,
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
Возврат;
КонецПопытки;
ТелоОтвета = Ответ.ПолучитьТелоКакСтроку("UTF-8");
Если Ответ.КодСостояния = 200 Тогда
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(ТелоОтвета);
Результат = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
Иначе
ЗаписьЖурналаРегистрации("Обмен.HTTP", УровеньЖурналаРегистрации.Ошибка, , ,
СтрШаблон("Код %1: %2", Формат(Ответ.КодСостояния, "ЧГ=0"), Лев(ТелоОтвета, 1000)));
КонецЕсли;
Что означает код ответа
| Код | Где искать причину |
|---|---|
| 200, 201 | Всё прошло, разбирайте тело |
| 400 | Сервис сам вернул ошибку: невалидный JSON, нет обязательного поля |
| 401 | Неверный логин или пароль, у пользователя отключена аутентификация 1С |
| 403 | Пользователь вошёл, но обработчик или веб-сервер запретили доступ |
| 404 | Не опубликован сервис, опечатка в корневом URL или шаблоне, нет hs в пути |
| 405 | Для шаблона не создан метод с таким HTTP-методом |
| 500 | Исключение в коде обработчика — текст смотрите в журнале регистрации базы |
| 503 | База недоступна: заблокирован вход, нет лицензий, сервер 1С не отвечает |
Сетевые исключения выглядят иначе. Например, Couldn't resolve host name — не найден сервер по имени, Couldn't connect to server — порт закрыт или веб-сервер не запущен, Timeout was reached — ответ не пришёл за время таймаута.
Отладка обработчика на стороне сервиса
Чтобы остановиться точкой останова в модуле HTTP-сервиса:
- При публикации включите отладку — в
default.vrdпоявится элемент<debug enable="true" .../>с адресом сервера отладки. - В Конфигураторе откройте
Отладка → Подключение, затем «Автоматическое подключение», и отметьте HTTP-сервисы. - Поставьте точку останова в обработчике метода и выполните запрос из Postman.
Права доступа и роли пользователя интеграции
Обработчик HTTP-сервиса выполняется с правами пользователя, под которым открыт сеанс. Если у него нет права чтения справочника, код упадёт с ошибкой «Нарушение прав доступа», а клиент получит 500.
Рабочая схема для интеграции:
- 🔑 Создайте отдельную роль для обмена, например
ИнтеграцияHTTP, и дайте права только на нужные объекты. - 🚫 Не выдавайте пользователю интеграции роль «Полные права». Утечка пароля тогда равна доступу ко всей базе.
- 🧱 Если обработчику нужен доступ шире, чем у роли, выносите код в общий модуль с флагом «Привилегированный» или включайте
УстановитьПривилегированныйРежим(Истина)только на нужном участке. - 🖥 Запретите этому пользователю интерактивный вход: в карточке пользователя снимите показ в списке выбора и не давайте ролей с интерфейсом.
В типовых конфигурациях на БСП пользователя для интеграции удобно завести через Администрирование → Настройки пользователей и прав → Пользователи и назначить ему профиль групп доступа с вашей ролью.
Сам обработчик тоже может проверять доступ: например, сверять заголовок с токеном и возвращать Новый HTTPСервисОтвет(403) при несовпадении. Это второй рубеж поверх пароля.
Типичные ошибки при обращении к HTTP-сервису 1С
Ещё одна частая ловушка — путь в HTTPЗапрос. В него пишут полный адрес http://srv01/trade/hs/..., хотя сервер уже указан в HTTPСоединение. Правильно — только путь, начиная с /.
Оптимизация при частых запросах
Каждый вызов по умолчанию открывает новый сеанс: аутентификация, загрузка конфигурации в память, получение лицензии. При десятках запросов в секунду это заметная задержка и нагрузка на сервер 1С.
Повторное использование сеансов
У HTTP-сервиса в свойствах есть параметр «Повторное использование сеансов» и «Время жизни сеанса» (в секундах):
| Значение | Поведение |
|---|---|
| Не использовать | Новый сеанс на каждый запрос |
| Использовать | Клиент сам управляет сеансом через заголовок IBSession |
| Автоматически | Платформа держит пул сеансов и раздаёт их запросам |
При варианте «Использовать» первый запрос отправляют с заголовком IBSession: start. Сервер вернёт cookie сеанса, который клиент передаёт в следующих запросах. Последний запрос завершает сеанс заголовком IBSession: finish.
При повторном использовании сеанса сохраняются значения модулей и параметров сеанса. Не кладите в них данные одного запроса — их увидит следующий запрос, возможно от другого клиента.
Другие приёмы
- 📦 Пакетная передача. Сто документов одним POST быстрее, чем сто отдельных вызовов.
- ⏱ Разумный таймаут. 30–60 секунд для обычных операций; для тяжёлых выгрузок — асинхронная схема: запрос ставит задание, второй запрос забирает результат.
- 🔁 Одно соединение на цикл. Создавайте
HTTPСоединениедо цикла, а в цикле меняйте толькоHTTPЗапрос. - 🗜 Сжатие. Для больших ответов включите gzip на веб-сервере; клиенту достаточно передать
Accept-Encoding: gzip. - 🧮 Лёгкие обработчики. Запрос в обработчике должен выбирать только нужные поля, без обращения через точку к реквизитам ссылок в цикле.