Вызов HTTP-сервиса 1С из другой базы, curl и Postman: от публикации до разбора ответа

· 9 мин

Содержание

Чтобы обратиться к 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-сервисов на веб-сервере

  1. Запустите Конфигуратор от имени администратора Windows — иначе публикация не сможет записать файлы в каталог веб-сервера.
  2. Откройте Администрирование → Публикация на веб-сервере.
  3. Укажите имя публикации и каталог.
  4. Перейдите на вкладку HTTP-сервисов, включите флажок Публиковать HTTP-сервисы и отметьте нужные сервисы.
  5. Если сервис лежит в расширении, включите также Публиковать HTTP-сервисы расширений по умолчанию.
  6. Нажмите «Опубликовать» и согласитесь на перезапуск веб-сервера.

Перезапуск IIS или Apache обрывает все текущие HTTP-сеансы с базой. Если через этот веб-сервер работают пользователи веб-клиента или другие интеграции, публикуйте в нерабочее время.

После публикации в каталоге появится файл default.vrd. В нём видно, что реально опубликовано:

<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
       base="/trade"
       ib="Srvr=&quot;srv01&quot;;Ref=&quot;trade&quot;;">
  <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-сервиса:

  1. При публикации включите отладку — в default.vrd появится элемент <debug enable="true" .../> с адресом сервера отладки.
  2. В Конфигураторе откройте Отладка → Подключение, затем «Автоматическое подключение», и отметьте HTTP-сервисы.
  3. Поставьте точку останова в обработчике метода и выполните запрос из 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.
  • 🧮 Лёгкие обработчики. Запрос в обработчике должен выбирать только нужные поля, без обращения через точку к реквизитам ссылок в цикле.

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

Можно ли вызвать HTTP-сервис файловой базы?
Да. Файловую базу тоже публикуют на веб-сервере, адрес и вызов такие же. Но при нагрузке файловый вариант быстро упирается в блокировки, для интеграций лучше клиент-серверный.
Нужна ли отдельная лицензия на вызовы HTTP-сервиса?
Каждый сеанс HTTP-сервиса занимает клиентскую лицензию на время своей работы. Повторное использование сеансов снижает их число.
Как вызвать HTTP-сервис одной базы 1С из другой базы на том же сервере?
Так же, через HTTPСоединение и веб-сервер. Прямого вызова HTTP-сервиса в обход веб-сервера платформа не даёт.
Где взять список опубликованных сервисов и их шаблонов?
В Конфигураторе — в ветке Общие → HTTP-сервисы, у каждого сервиса видны шаблоны и методы. Что реально опубликовано, показывает файл default.vrd в каталоге публикации.
Чем HTTP-сервис отличается от OData?
HTTP-сервис вы пишете сами: свой адрес, свой формат, своя логика. OData — стандартный интерфейс к объектам базы, который включают без программирования, но он отдаёт данные «как есть».