HTTP-сервис в 1С 8.3: от веб-сервера до первого ответа 200
Содержание
Чтобы подключиться к 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
- Откройте
Диспетчер серверов → Добавить роли и компонентыи добавьте роль «Веб-сервер (IIS)». - В службах роли отметьте
Разработка приложений → Расширения ISAPIиФильтры ISAPI. - Если платформа 32-разрядная, в дополнительных параметрах пула приложений включите «Разрешить 32-разрядные приложения». Для 64-разрядной оставьте значение
False. - Для файловой базы выдайте группе
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. Если нет — создаём свой. В типовую конфигурацию его удобнее добавить через расширение: так обновления не затрут доработку.
- Откройте конфигуратор, ветку
Общие → HTTP-сервисы, нажмите «Добавить». - Задайте имя, например
API. - В свойстве «Корневой URL» укажите короткую латинскую строку:
api. Она станет частью адреса после/hs/. - На вкладке «Шаблоны URL» добавьте шаблон. Для проверки связи —
/ping. Для получения объекта по коду —/items/{code}: фигурные скобки задают параметр. - В шаблоне добавьте метод и выберите HTTP-метод:
GET,POST,PUT,DELETEилиЛюбой. - В свойствах метода нажмите на лупу у поля «Обработчик» — платформа создаст функцию в модуле сервиса.
Одному сервису можно задать несколько шаблонов, а шаблону — несколько методов. Получается обычный 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-сервисов на веб-сервере
Это шаг, который чаще всего пропускают. Сервис есть в конфигурации, но наружу он виден только после публикации.
Публикация из конфигуратора
- Запустите конфигуратор от имени администратора Windows: публикация пишет в каталог веб-сервера и в его настройки.
- Откройте
Администрирование → Публикация на веб-сервере. - Укажите имя публикации (латиницей, оно войдёт в адрес), веб-сервер и каталог.
- Перейдите на вкладку «HTTP-сервисы». Включите «Публиковать HTTP-сервисы по умолчанию» или отметьте нужные сервисы в списке.
- Нажмите «Опубликовать». Для 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
- Создайте запрос, выберите метод
GET, вставьте адресhttp://srv01/trade/hs/api/ping. - На вкладке
Authorizationвыберите типBasic Auth, введите логин и пароль пользователя 1С. - Нажмите «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 вызывается Соединение.ОтправитьДляОбработки(Запрос), а тело задаётся через Запрос.УстановитьТелоИзСтроки().
7. Ошибки при подключении к HTTP-сервису 1С: код ответа и причина
Первое, на что смотреть, — код ответа. Он сразу говорит, на каком звене цепочки обрыв.
hs, корневой URL и шаблон по буквам — регистр в шаблонах важен. Проверьте publishByDefault в default.vrd и обновлена ли конфигурация базы данных после добавления сервиса.default.vrd, клиент не должен слать свой заголовок с другим логином.IIS_IUSRS и перезапустите пул.httpd.conf остался путь к удалённой версии.Если ничего не помогло
- 🖥️ Откройте адрес прямо на сервере в браузере. Работает там, а снаружи нет — дело в межсетевом экране или DNS, а не в 1С.
- 🔄 После обновления платформы переопубликуйте базу: путь к модулю в настройках веб-сервера привязан к номеру версии.
- 🧪 Опубликуйте пустую тестовую базу с одним сервисом
/ping. Заработало — сравнивайте настройки двух публикаций.
8. Частые вопросы
Нужна ли отдельная лицензия для запросов к HTTP-сервису?
Можно ли подключиться к HTTP-сервису файловой базы?
Чем HTTP-сервис отличается от OData и веб-сервиса SOAP?
Как посмотреть, какие HTTP-сервисы уже есть в базе?
Общие → HTTP-сервисы, а для расширений — ту же ветку внутри каждого расширения. На вкладке «HTTP-сервисы» окна публикации виден тот же список.