Публикация HTTP- и веб-сервисов 1С на IIS и Apache: от конфигуратора до первого запроса

· 9 мин

Содержание

Чтобы опубликовать сервис 1С, нужны три вещи: модуль расширения веб-сервера из дистрибутива платформы, сам HTTP-сервис (или веб-сервис) в конфигурации и публикация базы через Администрирование → Публикация на веб-сервере в Конфигураторе, запущенном от имени администратора Windows. После этого сервис отвечает по адресу вида http://сервер/имя_публикации/hs/корневой_URL/шаблон.

Частое заблуждение — что достаточно «опубликовать базу», и сервис заработает сам. На деле публикация базы и публикация сервиса — разные галочки. Базу можно открыть в веб-клиенте, а запрос к сервису при этом вернёт 404, потому что HTTP-сервис не отмечен на своей вкладке.

Что подготовить на веб-сервере перед публикацией сервиса

Платформа 1С сама по себе не умеет принимать HTTP-запросы. Их принимает веб-сервер (IIS или Apache) и передаёт в 1С через модуль расширения.

Что нужно до начала работы:

  • 🧩 Модуль расширения веб-сервера. При установке платформы выберите компонент «Модули расширения веб-сервера». Если платформа уже стоит, запустите установщик снова и выберите «Изменить».
  • 🖥 Сам веб-сервер. IIS ставится как роль Windows Server, Apache — отдельным дистрибутивом. Поддерживаются Apache 2.2 и 2.4, на практике сейчас берут 2.4.
  • 🔢 Совпадение разрядности. 64-битный Apache работает только с 64-битной платформой, 32-битный — с 32-битной. Для IIS разрядность задаётся в пуле приложений.
  • 🌐 Сетевой доступ к базе. Для файловой базы — права на папку. Для клиент-серверной — доступ с веб-сервера к серверу 1С по портам 1540, 1541 и диапазону рабочих процессов.

Настройка IIS

В Диспетчере серверов → Добавить роли и компоненты включите роль «Веб-сервер (IIS)». В её составе, в группе «Разработка приложений», отметьте «Расширения ISAPI» и «Фильтры ISAPI». Без расширений ISAPI модуль 1С не загрузится.

Если на 64-битном сервере стоит 32-битная платформа, откройте пул приложений публикации и в дополнительных параметрах включите «Разрешить 32-разрядные приложения».

Для файловой базы выдайте группе IIS_IUSRS права на изменение каталога базы. Права на чтение нужны и к каталогу bin платформы.

Настройка Apache

Apache 2.4 под Windows ставится как служба. Проверьте, что он запускается без 1С и отдаёт стартовую страницу на http://localhost. Только после этого переходите к публикации — иначе потом не понять, кто виноват в ошибке.

Учётной записи, под которой работает служба Apache, нужны права на каталог файловой базы. По умолчанию это локальная системная учётная запись; в рабочей среде лучше завести отдельного пользователя.

Как создать HTTP-сервис в конфигураторе

HTTP-сервис — это объект конфигурации, ветка Общие → HTTP-сервисы. Если конфигурация типовая и на поддержке, не правьте её напрямую: добавьте сервис в расширение конфигурации . Расширения поддерживают HTTP-сервисы, и типовую можно обновлять без объединения.

Порядок создания:

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

Сделайте отдельный шаблон /ping с методом GET, который просто возвращает 200 и строку ok. На нём удобно проверять публикацию, не трогая бизнес-логику.

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

РежимЧто происходитКогда выбирать
Не использоватьНа каждый запрос открывается и закрывается сеансРедкие запросы, простота
ИспользоватьКлиент обязан вернуть cookie сеанса, иначе ошибкаСвой клиент, который умеет хранить cookie
АвтоматическиСеансы берутся из пула на стороне веб-сервераЧастые запросы от внешних систем

Открытие сеанса — самая дорогая часть короткого запроса. При десятках вызовов в минуту режим «Автоматически» заметно снижает время ответа.

Веб-сервис (SOAP) вместо HTTP-сервиса

Если внешняя система требует SOAP и WSDL, нужен объект Общие → Web-сервисы. Там задаются пространство имён, XDTO-пакеты и операции с типами параметров. WSDL после публикации доступен по адресу http://сервер/имя_публикации/ws/имя_сервиса?wsdl. Для новых интеграций обычно выбирают HTTP-сервис с JSON: он проще и легче отлаживается.

Код обработчика: как читать запрос и формировать ответ

Обработчик получает объект HTTPСервисЗапрос и обязан вернуть HTTPСервисОтвет. Ниже рабочий пример для шаблона /items/{code}: метод GET ищет элемент номенклатуры по коду и возвращает JSON.

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

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

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

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

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

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

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

Для POST тело запроса читают так:

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

	Тело = Запрос.ПолучитьТелоКакСтроку();
	Попытка
		Чтение = Новый ЧтениеJSON;
		Чтение.УстановитьСтроку(Тело);
		Данные = ПрочитатьJSON(Чтение);
		Чтение.Закрыть();
	Исключение
		Ответ = Новый HTTPСервисОтвет(400);
		Ответ.УстановитьТелоИзСтроки("Некорректный JSON", КодировкаТекста.UTF8);
		Возврат Ответ;
	КонецПопытки;

	// Здесь обработка: Данные — структура с полями из JSON
	Ответ = Новый HTTPСервисОтвет(200);
	Ответ.УстановитьТелоИзСтроки("ok", КодировкаТекста.UTF8);
	Возврат Ответ;

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

Где что лежит в запросе:

  • 📍 Запрос.ПараметрыURL — параметры из фигурных скобок шаблона;
  • ❓ Запрос.ПараметрыЗапроса — всё, что после ? в адресе;
  • 📨 Запрос.Заголовки — HTTP-заголовки;
  • 📦 Запрос.ПолучитьТелоКакСтроку() — тело запроса.

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

Права доступа и аутентификация для сервиса 1С

Отдельного права «на HTTP-сервис» в роли нет. Обработчик выполняется от имени пользователя, который прошёл аутентификацию, и с его ролями. Если у него нет права чтения справочника, код упадёт с ошибкой нарушения прав, а клиент получит код 500.

Варианты аутентификации:

СпособКак работаетПлюсы и минусы
BasicКлиент передаёт логин и пароль пользователя 1С в заголовке AuthorizationПросто, но без HTTPS пароль идёт почти открытым текстом
Пользователь в публикацииЛогин и пароль прописаны в строке соединения публикацииКлиенту не нужен пароль, но сервис открыт всем, кто знает адрес
Аутентификация ОСWindows-аутентификация через IISУдобно внутри домена, неудобно для внешних систем

Практика, которая себя оправдывает:

  1. Заведите отдельного пользователя, например api_service, с логином латиницей. С кириллическими логинами в Basic-аутентификации часто бывают проблемы на стороне клиента.
  2. Включите ему «Аутентификацию 1С:Предприятия» и задайте сложный пароль.
  3. Дайте только нужные роли. Не давайте «Полные права» сервисному пользователю.
  4. Если сервис смотрит наружу — включите HTTPS на веб-сервере. Сертификат настраивается средствами IIS или Apache, 1С здесь не участвует.

Когда сервису нужно прочитать данные, к которым у сервисного пользователя доступа нет, вынесите это чтение в общий модуль с флажком «Привилегированный». Так права остаются узкими, а нужная операция выполняется.

Ограничение доступа на уровне веб-сервера

Пароль пользователя 1С — не единственный замок. Если сервисом пользуется одна внешняя система, разрешите доступ к публикации только с её IP-адреса.

  • 🔒 В Apache 2.4 это директива Require ip 203.0.113.10 в блоке <Directory> публикации вместо Require all granted.
  • 🔒 В IIS — компонент «Ограничения IP-адресов и доменов» в роли веб-сервера.
  • 🔒 Отдельная публикация только с HTTP-сервисами, без веб-клиента, уменьшает то, что видно снаружи.

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

Публикация делается из Конфигуратора. Запускайте Конфигуратор от имени администратора, иначе он не сможет записать настройки IIS или файл httpd.conf.

Пошаговый помощник
Откройте окно публикации
В Конфигураторе: Администрирование → Публикация на веб-сервере.

После публикации в Apache в httpd.conf появятся строки примерно такого вида:

LoadModule _1cws_module "C:/Program Files/1cv8/8.3.24.1586/bin/wsap24.dll"

Alias "/trade" "C:/inetpub/trade/"
<Directory "C:/inetpub/trade/">
    AllowOverride All
    Options None
    Require all granted
    SetHandler 1c-application
    ManagedApplicationDescriptor "C:/inetpub/trade/default.vrd"
</Directory>

Строка LoadModule содержит номер версии платформы. После обновления платформы путь указывает на старую версию. Её удаление ломает публикацию, поэтому после обновления переопубликуйте базу или поправьте путь вручную.

Файл default.vrd

В нём хранятся строка соединения и список опубликованных сервисов. Фрагмент для HTTP-сервиса:

<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
       xmlns:xs="http://www.w3.org/2001/XMLSchema"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       base="/trade"
       ib="Srvr=&quot;srv1c&quot;;Ref=&quot;trade&quot;;">
  <httpServices publishByDefault="false">
    <service name="API" rootUrl="api" enable="true"
             reuseSessions="autouse" sessionMaxAge="20"
             poolSize="10" poolTimeout="5"/>
  </httpServices>
</point>

publishByDefault="true" публикует все HTTP-сервисы конфигурации сразу. Удобно на тестовой базе, но на рабочей лучше перечислять сервисы явно.

Публикация на Linux

На Linux окно публикации в Конфигураторе тоже есть, но чаще пользуются утилитой webinst из каталога платформы:

sudo /opt/1cv8/x86_64/8.3.24.1586/webinst -publish -apache24 \
  -wsdir trade -dir /var/www/trade \
  -connstr "Srvr=srv1c;Ref=trade;" \
  -confPath /etc/apache2/apache2.conf

После этого добавьте в default.vrd блок httpServices и перезапустите Apache: sudo systemctl restart apache2.

Перезапуск веб-сервера обрывает текущие подключения веб-клиента и запросы к сервисам. На рабочем сервере делайте это вне часов активной работы или предупредите пользователей.

Проверка первого запроса

Проверяйте с самого веб-сервера, чтобы исключить сеть и файрвол:

curl -i -u api_service:Пароль http://localhost/trade/hs/api/ping

Ключ -i покажет код ответа и заголовки. Ответ HTTP/1.1 200 OK и тело ok значат, что публикация работает. Дальше проверяйте адрес снаружи.

Ошибки при публикации сервиса 1С и как их найти

Сначала смотрите на код ответа: он почти всегда указывает на слой, где проблема.

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

Если журнал регистрации пуст, а клиент получает 500, ошибка возникла до входа в обработчик. Обычно это неверная строка соединения в default.vrd или проблема с правами на каталог.

Отладка обработчика

Код HTTP-сервиса можно отлаживать в Конфигураторе. В окне публикации есть флажок «Разрешить отладку». Затем в Конфигураторе включите автоматическое подключение к сеансам HTTP-сервисов через Отладка → Подключение и поставьте точку останова в обработчике. Следующий запрос остановится на ней.

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

Нужна ли отдельная лицензия для HTTP-сервиса?
Лицензия на веб-сервер 1С не нужна. Сеансы HTTP-сервисов работают по общим правилам лицензирования вашей платформы; при нехватке лицензий запрос вернёт ошибку.
Можно ли опубликовать сервис из расширения, не меняя типовую конфигурацию?
Да. HTTP-сервис создаётся в расширении и публикуется так же, как сервис основной конфигурации, через ту же вкладку «HTTP-сервисы».
Как опубликовать несколько баз на одном веб-сервере?
Опубликуйте каждую базу под своим именем. Адреса будут разными: /trade/hs/api и /buh/hs/api, конфликтов не возникнет.
Почему после обновления конфигурации сервис перестал отвечать?
Если в обновлении изменился корневой URL или шаблон, старый адрес даёт 404. Если сервис публиковался явным списком, новый сервис нужно отметить в окне публикации заново.
Можно ли вызвать HTTP-сервис из браузера?
Метод GET — да, просто откройте адрес; браузер запросит логин и пароль. Для POST нужен инструмент вроде curl или Postman.