HTTP-сервис в 1С 8.3: от веб-сервера до первого ответа 200

· 10 мин

Содержание

Чтобы подключиться к HTTP-сервису 1С, база должна быть опубликована на веб-сервере (IIS или Apache) с включённой публикацией HTTP-сервисов. Тогда сервис отвечает по адресу вида http://<сервер>/<имя публикации>/hs/<корневой URL>/<шаблон>, а клиент передаёт логин и пароль пользователя 1С в заголовке Basic-авторизации. Пример готового адреса: http://srv01/trade/hs/api/ping.

Обычно всё ломается на стыке: сервис написан, а внешняя система получает 404, 401 или 500. Ниже — вся цепочка по порядку: веб-сервер, сервис в конфигураторе, код обработчика, публикация, права, проверка и разбор ошибок. Всё описанное относится к платформе 8.3 и не зависит от конфигурации: Бухгалтерия, УТ или ERP работают с HTTP-сервисами одинаково.

1. Подготовка веб-сервера: IIS или Apache для 1С

HTTP-сервис не работает сам по себе. Запрос принимает веб-сервер, передаёт его модулю расширения 1С, а тот — информационной базе. Поэтому сначала готовим веб-сервер и платформу на той же машине.

Что поставить из дистрибутива платформы

При установке платформы 1С выберите компонент Модули расширения веб-сервера. Без него в конфигураторе не появится рабочий пункт публикации, а в каталоге bin платформы не будет нужных библиотек.

Разрядность имеет значение. 64-разрядную платформу ставьте с 64-разрядным веб-сервером. Смешивать нельзя: модуль просто не загрузится.

Вариант 1: IIS на Windows Server

  1. Откройте Диспетчер серверов → Добавить роли и компоненты и добавьте роль «Веб-сервер (IIS)».
  2. В службах роли отметьте Разработка приложений → Расширения ISAPI и Фильтры ISAPI.
  3. Если платформа 32-разрядная, в дополнительных параметрах пула приложений включите «Разрешить 32-разрядные приложения». Для 64-разрядной оставьте значение False.
  4. Для файловой базы выдайте группе IIS_IUSRS права на изменение каталога базы. Иначе веб-сервер не сможет открыть файл 1Cv8.1CD.

Вариант 2: Apache 2.4

Apache проще для Linux и для тех, кто не хочет разбираться с пулами IIS. Платформа 8.3 работает с Apache 2.2 и 2.4, для новых установок берите 2.4.

  • 🧩 на Windows модуль 1С — файл wsap24.dll в каталоге bin платформы;
  • 🐧 на Linux — wsap24.so в каталоге установки платформы;
  • 🔐 пользователь, от которого работает Apache, должен иметь доступ к каталогу файловой базы.

После публикации (раздел 4) конфигуратор сам допишет в httpd.conf строку LoadModule и блок Alias с путём к публикации. Руками их обычно трогать не нужно.

Перезапуск службы Apache или IIS обрывает все текущие HTTP-запросы и веб-клиенты пользователей. Делайте его вне рабочего времени или предупредите коллег.

2. Создание HTTP-сервиса в конфигураторе 1С

Если сервис уже есть в конфигурации (его написал разработчик или он пришёл с типовой), переходите к разделу 4. Если нет — создаём свой. В типовую конфигурацию его удобнее добавить через расширение: так обновления не затрут доработку.

  1. Откройте конфигуратор, ветку Общие → HTTP-сервисы, нажмите «Добавить».
  2. Задайте имя, например API.
  3. В свойстве «Корневой URL» укажите короткую латинскую строку: api. Она станет частью адреса после /hs/.
  4. На вкладке «Шаблоны URL» добавьте шаблон. Для проверки связи — /ping. Для получения объекта по коду — /items/{code}: фигурные скобки задают параметр.
  5. В шаблоне добавьте метод и выберите HTTP-метод: GET, POST, PUT, DELETE или Любой.
  6. В свойствах метода нажмите на лупу у поля «Обработчик» — платформа создаст функцию в модуле сервиса.

Одному сервису можно задать несколько шаблонов, а шаблону — несколько методов. Получается обычный REST: GET /items/{code} читает, POST /items создаёт.

Часть адресаОткуда берётсяПример
srv01имя или IP веб-сервераsrv01, 192.168.1.10
tradeимя публикации базызадаётся при публикации
hsпостоянная часть для HTTP-сервисоввсегда hs
apiсвойство «Корневой URL» сервисаapi
/items/42шаблон URL с параметром/items/{code}

После добавления сервиса выполните «Обновить конфигурацию базы данных» (F7), иначе база про него не узнает. Для расширения — сохраните его и обновите конфигурацию базы так же.

3. Код обработчика HTTP-запроса

Обработчик получает объект HTTPСервисЗапрос и обязан вернуть HTTPСервисОтвет. Самый короткий рабочий вариант для шаблона /ping:

Функция PingGET(Запрос)

    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
    Ответ.УстановитьТелоИзСтроки("{""status"":""ok""}");
    Возврат Ответ;

КонецФункции

Чтение параметров и тела запроса

Данные в сервис приходят тремя путями:

  • 🔗 параметры шаблона ({code}) — Запрос.ПараметрыURL.Получить("code");
  • ❓ параметры после знака вопроса (?date=20260101) — Запрос.ПараметрыЗапроса.Получить("date");
  • 📦 тело POST- или PUT-запроса — Запрос.ПолучитьТелоКакСтроку().

Пример: отдать наименование номенклатуры по коду из адреса /items/{code} в формате JSON.

Функция ItemsGET(Запрос)

    Код = Запрос.ПараметрыURL.Получить("code");
    Ссылка = Справочники.Номенклатура.НайтиПоКоду(Код);

    Если Ссылка.Пустая() Тогда
        Ответ = Новый HTTPСервисОтвет(404);
        Ответ.УстановитьТелоИзСтроки("Не найдено", КодировкаТекста.UTF8);
        Возврат Ответ;
    КонецЕсли;

    Данные = Новый Структура;
    Данные.Вставить("code", Код);
    Данные.Вставить("name", Строка(Ссылка));

    Запись = Новый ЗаписьJSON;
    Запись.УстановитьСтроку();
    ЗаписатьJSON(Запись, Данные);

    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
    Ответ.УстановитьТелоИзСтроки(Запись.Закрыть(), КодировкаТекста.UTF8);
    Возврат Ответ;

КонецФункции

Входящий JSON читается обратным путём: ЧтениеJSON → УстановитьСтроку(Запрос.ПолучитьТелоКакСтроку()) → ПрочитатьJSON(Чтение). Получится структура, с которой дальше работаете как обычно.

Код ответа выбирайте честно: 200 — всё хорошо, 400 — клиент прислал кривые данные, 404 — объекта нет, 500 — сломалось у вас. Внешней системе так проще разбирать ошибки, чем искать слово «ошибка» в тексте при коде 200.

Исключения внутри обработчика платформа превращает в ответ 500. Для отладки оборачивайте рискованный код в Попытка … Исключение и пишите ОписаниеОшибки() в журнал регистрации через ЗаписьЖурналаРегистрации.

4. Публикация базы и HTTP-сервисов на веб-сервере

Это шаг, который чаще всего пропускают. Сервис есть в конфигурации, но наружу он виден только после публикации.

Публикация из конфигуратора

  1. Запустите конфигуратор от имени администратора Windows: публикация пишет в каталог веб-сервера и в его настройки.
  2. Откройте Администрирование → Публикация на веб-сервере.
  3. Укажите имя публикации (латиницей, оно войдёт в адрес), веб-сервер и каталог.
  4. Перейдите на вкладку «HTTP-сервисы». Включите «Публиковать HTTP-сервисы по умолчанию» или отметьте нужные сервисы в списке.
  5. Нажмите «Опубликовать». Для Apache после этого перезапустите службу.

Публикация утилитой webinst

На сервере без графики, в скриптах и на Linux удобнее webinst из каталога bin платформы:

webinst -publish -iis -wsdir trade -dir "C:\inetpub\wwwroot\trade" -connstr "Srvr=srv01;Ref=trade;"

Для Apache вместо -iis указывают -apache24 и путь к конфигу через -confpath. Для файловой базы строка подключения выглядит как File="C:\Bases\trade";.

Что лежит в default.vrd

В каталоге публикации появится файл default.vrd. За HTTP-сервисы отвечает элемент httpServices:

<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
       base="/trade"
       ib="Srvr=srv01;Ref=trade;">
    <httpServices publishByDefault="true"/>
</point>

Если publishByDefault="false", наружу выйдут только сервисы, перечисленные внутри этого элемента. Отсюда частая ситуация: базу опубликовали год назад, сервис добавили вчера, а он отвечает 404. Лечится повторной публикацией с галочкой или правкой этого файла.

5. Аутентификация и защита подключения к HTTP-сервису

Каждый запрос к HTTP-сервису выполняется от имени пользователя информационной базы. Вариантов передать этого пользователя три.

СпособКак настроитьКогда подходитРиски
Basic-авторизацияу пользователя 1С включена аутентификация 1С:Предприятия, клиент шлёт заголовок Authorization: Basic …интеграции с сайтом, мобильным приложением, другой базойпароль идёт в каждом запросе — без HTTPS виден в сети
Пользователь в default.vrdв атрибут ib добавить Usr=…;Pwd=…;закрытая внутренняя сеть, вебхуки от сервисов без поддержки авторизациилюбой, кто знает адрес, работает с правами этого пользователя
Аутентификация ОСу пользователя 1С включена аутентификация ОС, на IIS — проверка подлинности Windowsдоменная сеть, клиенты на Windowsсложнее настроить, неудобна для внешних систем

Отдельный пользователь для интеграции

Не подключайте внешнюю систему под логином бухгалтера или администратора. Заведите отдельного пользователя, например api_site, и дайте ему роль только с нужными правами: чтение номенклатуры, запись заказов. Тогда утечка пароля не откроет всю базу, а в журнале регистрации сразу видно, что сделала интеграция.

Логин интеграционного пользователя делайте латиницей. Кириллица в Basic-авторизации кодируется по-разному в разных клиентах, и запрос получает 401 при правильном пароле.

HTTPS и сетевой доступ

  • 🔒 Сервис доступен из интернета — только HTTPS. Сертификат привязывается к сайту в IIS или к виртуальному хосту Apache, 1С здесь настраивать не нужно.
  • 🧱 Открывайте наружу один порт веб-сервера (443), а не порты кластера 1С.
  • 🚪 Если сервис нужен только одной системе, ограничьте доступ по IP на уровне веб-сервера или межсетевого экрана.

Повторное использование сеансов

В свойствах HTTP-сервиса есть «Повторное использование сеансов». По умолчанию на каждый запрос открывается и закрывается сеанс 1С. Если запросов много (сотни в минуту), включите повторное использование: сеанс будет жить заданное в «Время жизни сеанса» число секунд и обслуживать следующие запросы без входа заново. Нагрузка на сервер и лицензии заметно падает.

6. Проверка подключения через Postman, curl и из другой базы 1С

Начинайте с самого простого шаблона, /ping. Если он отвечает, публикация и права в порядке, и дальше ищете ошибку уже в коде.

Postman

  1. Создайте запрос, выберите метод GET, вставьте адрес http://srv01/trade/hs/api/ping.
  2. На вкладке Authorization выберите тип Basic Auth, введите логин и пароль пользователя 1С.
  3. Нажмите «Send». Ожидаемый результат — статус 200 OK и тело {"status":"ok"}.

Для POST перейдите на вкладку Body, выберите raw и тип JSON. Postman сам добавит заголовок Content-Type.

curl

curl есть в Windows 10, Windows Server 2019 и новее, а также в любом Linux:

# проверка связи
curl -i -u api_site:Pa55word "http://srv01/trade/hs/api/ping"

# передача JSON методом POST
curl -i -u api_site:Pa55word -X POST \
  -H "Content-Type: application/json; charset=utf-8" \
  -d '{"code":"00-00000042","qty":5}' \
  "http://srv01/trade/hs/api/items"

Ключ -i выводит заголовки ответа: по ним видно код и то, кто ответил — веб-сервер или 1С.

Подключение из другой базы 1С

Когда клиентом выступает другая база 1С, используйте HTTPСоединение и HTTPЗапрос:

Соединение = Новый HTTPСоединение("srv01", 80, "api_site", "Pa55word", , 30);
Запрос = Новый HTTPЗапрос("/trade/hs/api/items/00-00000042");
Ответ = Соединение.Получить(Запрос);

Если Ответ.КодСостояния = 200 Тогда
    Текст = Ответ.ПолучитьТелоКакСтроку();
Иначе
    ВызватьИсключение СтрШаблон("Сервис вернул код %1", Ответ.КодСостояния);
КонецЕсли;

Число 30 — таймаут в секундах. Для HTTPS укажите порт 443 и седьмым параметром передайте Новый ЗащищенноеСоединениеOpenSSL(). Для POST вызывается Соединение.ОтправитьДляОбработки(Запрос), а тело задаётся через Запрос.УстановитьТелоИзСтроки().

Перед передачей адреса внешней системе
Выполнено: 0 / 6

7. Ошибки при подключении к HTTP-сервису 1С: код ответа и причина

Первое, на что смотреть, — код ответа. Он сразу говорит, на каком звене цепочки обрыв.

Диагностика: выберите симптом

Если ничего не помогло

  • 🖥️ Откройте адрес прямо на сервере в браузере. Работает там, а снаружи нет — дело в межсетевом экране или DNS, а не в 1С.
  • 🔄 После обновления платформы переопубликуйте базу: путь к модулю в настройках веб-сервера привязан к номеру версии.
  • 🧪 Опубликуйте пустую тестовую базу с одним сервисом /ping. Заработало — сравнивайте настройки двух публикаций.

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

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