Веб-сервис и HTTP-сервис 1С 8.3: от конфигуратора до рабочего URL

· 10 мин

Содержание

Чтобы опубликовать веб-сервис в 1С 8.3, откройте базу в Конфигураторе от имени администратора Windows, выберите Администрирование → Публикация на веб-сервере, отметьте нужные Web-сервисы и HTTP-сервисы и нажмите «Опубликовать». После этого SOAP-сервис отвечает по адресу http://сервер/имя_публикации/ws/имя_файла.1cws?wsdl, а HTTP-сервис — по http://сервер/имя_публикации/hs/корневой_URL/….

На практике публикация срывается не на кнопке, а вокруг неё: не установлены модули расширения веб-сервера, разрядность модуля не совпадает с Apache, у пользователя нет роли, а веб-сервер не может прочитать каталог базы. Ниже — весь путь по порядку: от объекта в дереве метаданных до проверки ответа и настройки пула сеансов.

1. Подготовка сервера к публикации веб-сервисов

Публикация — это связка трёх частей: веб-сервер, модуль расширения 1С для него и сама база. Если одной нет, кнопка «Опубликовать» либо неактивна, либо отработает, но сервис не ответит.

Что проверить до начала:

  • 🌐 Веб-сервер. Для Windows — IIS или Apache 2.4, для Linux — Apache 2.4. Apache 2.2 тоже поддерживается, но для новых установок берите 2.4.
  • 🧩 Модули расширения веб-сервера. Ставятся из дистрибутива платформы: в установщике отметьте компонент «Модули расширения веб-сервера». Без него в каталоге bin платформы не будет wsap24.dll (Apache 2.4) и wsisapi.dll (IIS).
  • 🔢 Разрядность. 64-битный Apache работает только с 64-битной платформой, 32-битный — с 32-битной. Это самая частая причина, по которой Apache не стартует после публикации.
  • 🔁 Одна версия платформы. Для клиент-серверной базы версия платформы на веб-сервере должна совпадать с версией кластера 1С до последней цифры.
  • 🛡️ IIS: компоненты роли. В «Компонентах Windows» включите «Расширения ISAPI» и «Фильтры ISAPI». Для 32-битной платформы в пуле приложений включите параметр Enable 32-Bit Applications.

Веб-сервер и сервер 1С не обязаны стоять на одной машине. Часто Apache выносят на отдельную виртуалку в DMZ, а к кластеру он ходит по портам 1540–1541 и диапазону рабочих процессов.

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

В 1С есть два вида сервисов, и публикуются они одним мастером. Выбор зависит от того, кто будет их вызывать.

ЧтоПротоколКогда выбиратьАдрес вызова
Web-сервисSOAP, описание в WSDLИнтеграция с системами, которые генерируют клиента по WSDL (Java, .NET, другая 1С)/ws/…
HTTP-сервисREST-подобный, JSON или XML вручнуюСайт, мобильное приложение, Telegram-бот, любой простой клиент/hs/…

Web-сервис (SOAP)

  1. В дереве метаданных раскройте Общие → Web-сервисы, добавьте новый.
  2. На вкладке свойств заполните Пространство имён (любой уникальный URI, например http://example.org/stock) и Имя файла публикации, например stock.1cws.
  3. В свойстве Пакеты XDTO укажите пакеты, типы из которых используют операции. Для простых строк и чисел достаточно стандартного пакета http://www.w3.org/2001/XMLSchema.
  4. Добавьте операцию, задайте Тип возвращаемого значения и параметры с типами и направлением передачи.
  5. В свойстве Имя процедуры откройте модуль сервиса — платформа создаст функцию-обработчик.
Функция ПолучитьОстаток(Артикул)
	Запрос = Новый Запрос(
	"ВЫБРАТЬ ПЕРВЫЕ 1
	|	Номенклатура.Ссылка КАК Ссылка
	|ИЗ
	|	Справочник.Номенклатура КАК Номенклатура
	|ГДЕ
	|	Номенклатура.Артикул = &Артикул");
	Запрос.УстановитьПараметр("Артикул", Артикул);
	Выборка = Запрос.Выполнить().Выбрать();
	Если Выборка.Следующий() Тогда
		Возврат Строка(Выборка.Ссылка);
	КонецЕсли;
	Возврат "";
КонецФункции

HTTP-сервис

  1. Добавьте объект в Общие → HTTP-сервисы, задайте Корневой URL, например api.
  2. Добавьте шаблон URL, например /goods/{id}. Фигурные скобки — параметр, он придёт в обработчик.
  3. В шаблоне добавьте метод GET (и при необходимости POST) и создайте обработчик.
Функция GoodsGET(Запрос)
	Код = Запрос.ПараметрыURL["id"];
	Ответ = Новый HTTPСервисОтвет(200);
	Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
	Ответ.УстановитьТелоИзСтроки("{""id"": """ + Код + """}");
	Возврат Ответ;
КонецФункции

Тело POST-запроса читают через Запрос.ПолучитьТелоКакСтроку(). Для реального JSON собирайте ответ через ЗаписьJSON, а не склейкой строк, — иначе кавычка в названии товара сломает ответ.

После создания объектов обновите конфигурацию базы данных (F7). Мастер публикации видит только сервисы из конфигурации базы, а не из основной.

Сервисы можно добавить и в расширение конфигурации — так не придётся снимать типовую с поддержки. В мастере публикации для них есть отдельный флажок «Публиковать HTTP-сервисы расширений по умолчанию».

3. Роли и права для доступа к веб-сервису

Внешний клиент работает в 1С как обычный пользователь информационной базы. Значит, на вызов действуют те же роли и ограничения, что и в интерфейсе.

Порядок настройки:

  1. Создайте отдельную роль, например ИнтеграцияAPI.
  2. Для SOAP: в роли раскройте Web-сервисы и у нужных операций установите право «Использование». Без него клиент получит отказ, даже если пароль верный.
  3. Дайте роли права на данные, которые читает или пишет обработчик: «Чтение» справочника, «Добавление» и «Изменение» документа и так далее.
  4. Создайте служебного пользователя, например api_site, с аутентификацией 1С:Предприятия и паролем. Назначьте ему только эту роль.
  5. В типовых конфигурациях на БСП роли назначают через Администрирование → Настройки пользователей и прав: создайте группу доступа с профилем, в который входит ваша роль.

Не давайте служебному пользователю роль «Полные права». Если пароль утечёт вместе с адресом сервиса, через API можно будет прочитать и изменить всю базу.

Клиент передаёт логин и пароль в заголовке Basic-аутентификации. Поэтому сервис, открытый в интернет, публикуйте только по HTTPS — иначе пароль идёт открытым текстом.

Привилегированный режим УстановитьПривилегированныйРежим(Истина) в обработчике отключает проверку прав. Включайте его точечно — на чтение конкретного регистра, — а не в начале каждого метода.

4. Публикация веб-сервиса на Apache и IIS

Windows: мастер в Конфигураторе

  1. Запустите Конфигуратор через «Запуск от имени администратора». Без этого мастер не сможет записать в конфигурацию Apache или IIS.
  2. Откройте Администрирование → Публикация на веб-сервере.
  3. Заполните поля:
    • Имя — часть адреса после сервера, латиницей, например trade;
    • Веб-сервер — Apache 2.4 или Internet Information Services;
    • Каталог — папка публикации, например C:\inetpub\wwwroot\trade или C:\Apache24\htdocs\trade.
  4. На вкладке «Основные» отметьте нужные Web-сервисы или включите «Публиковать Web-сервисы по умолчанию».
  5. На вкладке «HTTP-сервисы» отметьте сервисы или «Публиковать HTTP-сервисы по умолчанию».
  6. Если нужен только API, снимите флажок «Публиковать тонкий клиент и веб-клиент». Меньше точек входа — меньше поверхность атаки.
  7. Нажмите «Опубликовать» и согласитесь на перезапуск веб-сервера.

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

Для Apache мастер дописывает в httpd.conf строку загрузки модуля и блок для каталога:

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

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

Номер версии в пути подставьте свой. После обновления платформы этот путь нужно поменять вручную — иначе Apache продолжит грузить модуль старой версии.

Linux: утилита webinst

На Linux мастера в Конфигураторе нет — используется webinst из каталога платформы:

cd /opt/1cv8/x86_64/8.3.25.1374
sudo ./webinst -publish -apache24 -wsdir trade -dir /var/www/trade \
  -connstr "Srvr=1c-server;Ref=trade;" -confPath /etc/apache2/apache2.conf
sudo systemctl restart apache2

Утилита создаёт default.vrd с публикацией по умолчанию. Чтобы включить или отключить отдельные сервисы, отредактируйте этот файл (см. следующий раздел) и перезапустите Apache.

Права веб-сервера на файловую базу

Для файловой базы процесс веб-сервера должен иметь права на чтение и запись в каталог с 1Cv8.1CD:

  • 🪟 IIS — выдайте права группе IIS_IUSRS (и пользователю IUSR при анонимном входе);
  • 🪟 Apache как служба Windows по умолчанию работает от LocalSystem; если меняли учётную запись — права нужны ей;
  • 🐧 Linux — пользователю www-data (Debian, Ubuntu) или apache (RHEL-семейство).

Для клиент-серверной базы права на каталог не нужны: веб-сервер ходит к кластеру по сети.

Проверка

  • SOAP: откройте в браузере http://сервер/trade/ws/stock.1cws?wsdl. Должен открыться XML с описанием операций.
  • HTTP: выполните curl -u api_site:пароль http://сервер/trade/hs/api/goods/123. Ответ — ваш JSON.

Для вызова SOAP-операций удобно использовать SoapUI: он сам строит запрос по WSDL.

5. Файл default.vrd: тонкая настройка публикации

default.vrd лежит в каталоге публикации и управляет тем, что и как отдаёт модуль 1С. Мастер правит его сам, но многое удобнее менять руками.

<?xml version="1.0" encoding="UTF-8"?>
<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;1c-server&quot;;Ref=&quot;trade&quot;;">
  <ws pointEnableCommon="false">
    <point name="Stock" alias="stock.1cws" enable="true"
           reuseSessions="autouse" sessionMaxAge="20"
           poolSize="10" poolTimeout="5"/>
  </ws>
  <httpServices publishByDefault="false">
    <service name="API" rootUrl="api" enable="true"
             reuseSessions="autouse" sessionMaxAge="20"
             poolSize="10" poolTimeout="5"/>
  </httpServices>
</point>

Что здесь важно:

  • 📌 ib — строка соединения. Кавычки внутри экранируются как &quot;.
  • 📌 enable="false" у конкретного сервиса снимает его с публикации без удаления блока.
  • 📌 publishByDefault="false" — публикуются только явно перечисленные сервисы. Для боевого сервера это безопаснее.

В строку ib можно дописать Usr= и Pwd= — тогда сервис пускает без логина. Так делают для внутренних интеграций, но пароль лежит в файле открытым текстом. Закройте доступ к каталогу публикации и не используйте этот приём на сервере, видимом из интернета.

6. Ошибки публикации веб-сервиса и где смотреть логи

Начинайте с кода ответа: он сразу сужает круг причин.

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

Где ещё искать:

  • 📄 Журнал регистрации — первое место для ошибок кода и прав. Отбирайте по пользователю сервиса и периоду вызова.
  • 📄 Логи Apache — error.log в папке logs (Windows) или /var/log/apache2/ (Debian, Ubuntu).
  • 📄 Технологический журнал — включается файлом logcfg.xml в каталоге conf платформы. Нужен, когда журнал регистрации молчит: события EXCP покажут исключения, CALL — длительность вызовов.

Технологический журнал быстро растёт. Ставьте фильтр по событиям и включайте его на время диагностики, а не навсегда.

7. Производительность веб-сервисов под нагрузкой

Каждый вызов без повторного использования сеансов — это новый сеанс 1С: аутентификация, создание сеанса, загрузка модулей. На сотнях запросов в минуту это заметная доля времени ответа.

Что даёт результат:

ПриёмГде настраиваетсяЭффект
Повторное использование сеансовСвойство сервиса в Конфигураторе или reuseSessions в default.vrdСеанс не создаётся на каждый вызов
Пул сеансовpoolSize, poolTimeout в default.vrdОграничивает число одновременных сеансов и очередь
Время жизни сеансаsessionMaxAgeСеансы обновляются и не копят память
Отдельная публикация под APIОтдельное имя и каталогНагрузка API не мешает веб-клиенту

Значения свойства «Повторное использование сеансов»:

  • Использовать — клиент сам управляет сеансом через cookie;
  • Автоматически использовать (autouse) — платформа берёт сеанс из пула. Подходит большинству интеграций;
  • Не использовать — новый сеанс на каждый вызов. Оставляйте только для редких вызовов.

При повторном использовании сеанса не храните данные одного клиента в параметрах сеанса: следующий вызов из пула может прийти от другого клиента.

Что ещё ускоряет ответ:

  • ⚡ запросы вместо обращения через точку к реквизитам ссылок в цикле;
  • ⚡ постраничная выдача списков: параметр limit в URL и ВЫБРАТЬ ПЕРВЫЕ в запросе;
  • ⚡ тяжёлые операции — в фоновое задание: сервис принимает задачу, отвечает 202 с идентификатором, а клиент потом спрашивает статус.

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

Нужна ли отдельная лицензия для веб-сервиса 1С?
Отдельной лицензии на публикацию нет. Сеансы веб-сервисов работают в рамках лицензий, установленных на сервере или в базе. Без лицензии сервис базу не откроет.
Можно ли опубликовать веб-сервис для файловой базы?
Да. В строке соединения указывается File= с путём к каталогу базы, а процессу веб-сервера выдаются права на этот каталог. Для серьёзной нагрузки лучше клиент-серверный вариант.
Как опубликовать на одном сервере несколько баз?
Сделайте отдельную публикацию на каждую базу с уникальным именем и своим каталогом. Модуль расширения подключается один раз, а блоков Alias и Directory будет несколько.
Почему после обновления платформы сервис перестал отвечать?
В конфигурации Apache остался путь к модулю старой версии или новая версия не совпадает с кластером. Поправьте путь в LoadModule на новую папку bin и перезапустите веб-сервер.
Как поставить HTTPS на опубликованный сервис?
HTTPS настраивается средствами веб-сервера: сертификат и привязка в IIS или модуль mod_ssl в Apache. На стороне 1С менять ничего не нужно, адрес меняется только в схеме.