Веб-сервис и HTTP-сервис 1С 8.3: от конфигуратора до рабочего URL
Содержание
Чтобы опубликовать веб-сервис в 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)
- В дереве метаданных раскройте
Общие → Web-сервисы, добавьте новый. - На вкладке свойств заполните Пространство имён (любой уникальный URI, например
http://example.org/stock) и Имя файла публикации, напримерstock.1cws. - В свойстве Пакеты XDTO укажите пакеты, типы из которых используют операции. Для простых строк и чисел достаточно стандартного пакета
http://www.w3.org/2001/XMLSchema. - Добавьте операцию, задайте Тип возвращаемого значения и параметры с типами и направлением передачи.
- В свойстве Имя процедуры откройте модуль сервиса — платформа создаст функцию-обработчик.
Функция ПолучитьОстаток(Артикул)
Запрос = Новый Запрос(
"ВЫБРАТЬ ПЕРВЫЕ 1
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Артикул = &Артикул");
Запрос.УстановитьПараметр("Артикул", Артикул);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Строка(Выборка.Ссылка);
КонецЕсли;
Возврат "";
КонецФункции
HTTP-сервис
- Добавьте объект в
Общие → HTTP-сервисы, задайте Корневой URL, напримерapi. - Добавьте шаблон URL, например
/goods/{id}. Фигурные скобки — параметр, он придёт в обработчик. - В шаблоне добавьте метод
GET(и при необходимостиPOST) и создайте обработчик.
Функция GoodsGET(Запрос)
Код = Запрос.ПараметрыURL["id"];
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Ответ.УстановитьТелоИзСтроки("{""id"": """ + Код + """}");
Возврат Ответ;
КонецФункции
Тело POST-запроса читают через Запрос.ПолучитьТелоКакСтроку(). Для реального JSON собирайте ответ через ЗаписьJSON, а не склейкой строк, — иначе кавычка в названии товара сломает ответ.
После создания объектов обновите конфигурацию базы данных (F7). Мастер публикации видит только сервисы из конфигурации базы, а не из основной.
Сервисы можно добавить и в расширение конфигурации — так не придётся снимать типовую с поддержки. В мастере публикации для них есть отдельный флажок «Публиковать HTTP-сервисы расширений по умолчанию».
3. Роли и права для доступа к веб-сервису
Внешний клиент работает в 1С как обычный пользователь информационной базы. Значит, на вызов действуют те же роли и ограничения, что и в интерфейсе.
Порядок настройки:
- Создайте отдельную роль, например
ИнтеграцияAPI. - Для SOAP: в роли раскройте Web-сервисы и у нужных операций установите право «Использование». Без него клиент получит отказ, даже если пароль верный.
- Дайте роли права на данные, которые читает или пишет обработчик: «Чтение» справочника, «Добавление» и «Изменение» документа и так далее.
- Создайте служебного пользователя, например
api_site, с аутентификацией 1С:Предприятия и паролем. Назначьте ему только эту роль. - В типовых конфигурациях на БСП роли назначают через
Администрирование → Настройки пользователей и прав: создайте группу доступа с профилем, в который входит ваша роль.
Не давайте служебному пользователю роль «Полные права». Если пароль утечёт вместе с адресом сервиса, через API можно будет прочитать и изменить всю базу.
Клиент передаёт логин и пароль в заголовке Basic-аутентификации. Поэтому сервис, открытый в интернет, публикуйте только по HTTPS — иначе пароль идёт открытым текстом.
Привилегированный режим УстановитьПривилегированныйРежим(Истина) в обработчике отключает проверку прав. Включайте его точечно — на чтение конкретного регистра, — а не в начале каждого метода.
4. Публикация веб-сервиса на Apache и IIS
Windows: мастер в Конфигураторе
- Запустите Конфигуратор через «Запуск от имени администратора». Без этого мастер не сможет записать в конфигурацию Apache или IIS.
- Откройте
Администрирование → Публикация на веб-сервере. - Заполните поля:
- Имя — часть адреса после сервера, латиницей, например
trade; - Веб-сервер — Apache 2.4 или Internet Information Services;
- Каталог — папка публикации, например
C:\inetpub\wwwroot\tradeилиC:\Apache24\htdocs\trade.
- Имя — часть адреса после сервера, латиницей, например
- На вкладке «Основные» отметьте нужные Web-сервисы или включите «Публиковать Web-сервисы по умолчанию».
- На вкладке «HTTP-сервисы» отметьте сервисы или «Публиковать HTTP-сервисы по умолчанию».
- Если нужен только API, снимите флажок «Публиковать тонкий клиент и веб-клиент». Меньше точек входа — меньше поверхность атаки.
- Нажмите «Опубликовать» и согласитесь на перезапуск веб-сервера.
Перезапуск 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="1c-server";Ref="trade";">
<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— строка соединения. Кавычки внутри экранируются как". - 📌
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с идентификатором, а клиент потом спрашивает статус.