Веб-сервис в 1С 8.3 от конфигуратора до первого SOAP-вызова: IIS, Apache, права и отладка
Содержание
Настройка веб-сервиса 1С сводится к трём шагам: описать сервис в конфигураторе (Общие → Web-сервисы), опубликовать базу на веб-сервере через Администрирование → Публикация на веб-сервере и проверить, что по адресу http://сервер/база/ws/ИмяСервиса.1cws?wsdl открывается WSDL-описание. Если WSDL открылся — сервис живой, дальше остаётся отладить операции и закрыть доступ.
Порядок одинаков для любой конфигурации на платформе 8.3, файловой и клиент-серверной базы. Различается только веб-сервер: на Windows обычно IIS, на Linux — Apache. Ниже разобраны оба варианта, а также права, безопасность, тестирование и производительность.
Что подготовить до публикации веб-сервиса
Большинство проблем с публикацией возникает не в 1С, а на стороне веб-сервера. Проверьте заранее:
- 🖥️ Веб-сервер установлен. На Windows — роль IIS с компонентами «Расширения ISAPI» и «Фильтры ISAPI» (раздел «Разработка приложений»), плюс «Консоль управления IIS». На Linux — Apache 2.4.
- 🧩 Модули расширения веб-сервера 1С. Это отдельный компонент в установщике платформы. Если при установке его не отметили, запустите установку повторно, выберите «Изменить» и добавьте компонент.
- 🔢 Разрядность. Модуль расширения веб-сервера должен совпадать по разрядности с процессом веб-сервера. 64-битный IIS и 64-битная платформа — самый простой вариант.
- 📌 Одна версия платформы. На веб-сервере нужна та же версия платформы, что у кластера серверов 1С (для клиент-серверной базы). Иначе модуль не сможет подключиться к базе.
- 👤 Отдельный пользователь 1С для сервиса. Например,
ws_exchangeс паролем и ролью только на нужные данные. - 🔐 Права на каталоги. Для файловой базы учётной записи веб-сервера нужны права на чтение и запись в каталог базы. Иначе сервис ответит ошибкой доступа к файлам.
Сеансы веб-сервисов расходуют клиентские лицензии, как и обычные пользователи. Если лицензий впритык, внешняя система может «съесть» последнюю, и бухгалтер не войдёт в базу. Учтите это при планировании.
Как создать веб-сервис в конфигураторе 1С
Типовые конфигурации править напрямую неудобно — после этого они снимаются с полной поддержки. Если сервис нужен в типовой БП 3.0 или ЗУП 3.1, создавайте его в расширении конфигурации. Веб-сервисы в расширениях поддерживаются в актуальных версиях платформы 8.3.
Создание объекта
- Откройте конфигуратор, затем
Конфигурация → Открыть конфигурацию(или откройте расширение). - В дереве перейдите в
Общие → Web-сервисы, нажмите «Добавить». - Задайте имя латиницей или кириллицей, например
Exchange. - Заполните URI пространства имён — любую уникальную строку вида
http://mycompany.ru/exchange. Это не адрес сайта, а идентификатор, по нему клиент находит типы. - В свойстве Пакеты XDTO выберите пакеты, типы которых сервис будет принимать и отдавать. Для простых строк и чисел достаточно стандартного пакета
http://www.w3.org/2001/XMLSchema. - Проверьте Имя файла публикации. По умолчанию это
Exchange.1cws— под этим именем сервис будет доступен по адресу.
Операции и параметры
На закладке «Операции» добавьте операцию, например GetCounterparty. Для неё задайте:
| Свойство | Что указать |
|---|---|
| Тип возвращаемого значения | Например, string (http://www.w3.org/2001/XMLSchema) |
| Возможно пустое | Включите, если операция может вернуть «ничего» |
| В транзакции | Включайте только для операций, которые пишут данные |
| Имя процедуры | Имя функции в модуле сервиса, создаётся кнопкой с лупой |
У операции добавьте параметры, например INN с типом string и направлением «Входной».
Модуль обработчика
Пример операции, которая ищет контрагента по ИНН и возвращает его наименование:
Функция GetCounterparty(INN)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Контрагенты.Наименование КАК Наименование
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.ИНН = &ИНН
| И НЕ Контрагенты.ПометкаУдаления";
Запрос.УстановитьПараметр("ИНН", INN);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.Наименование;
КонецЕсли;
Возврат "";
КонецФункции
После правок выполните Конфигурация → Обновить конфигурацию базы данных (F7). Без этого шага сервис не появится в публикации.
Обновление конфигурации базы данных при изменении структуры требует монопольного доступа. Выполняйте его в нерабочее время или предупредите пользователей.
Публикация веб-сервиса на IIS в Windows
Публикацию делает сам конфигуратор. Запускайте конфигуратор от имени администратора Windows, иначе 1С не сможет записать настройки в IIS и каталог inetpub.
- В конфигураторе откройте
Администрирование → Публикация на веб-сервере. - Имя — короткое имя публикации латиницей, например
buh. Оно станет частью адреса. - Веб-сервер — Internet Information Services.
- Каталог — физическая папка публикации, например
C:\inetpub\wwwroot\buh. - На закладке «Web-сервисы» отметьте «Публиковать Web-сервисы» и поставьте галочку напротив нужного сервиса. Здесь же можно поменять адрес (псевдоним).
- Снимите флажки с того, что публиковать не нужно: тонкий и веб-клиент, стандартный интерфейс OData, HTTP-сервисы. Каждый лишний пункт — ещё одна точка входа снаружи.
- Нажмите «Опубликовать». Согласитесь на перезапуск веб-сервера.
1С создаст в каталоге публикации файл default.vrd и зарегистрирует в IIS приложение с обработчиком wsisapi.dll.
Пул приложений IIS
Откройте «Диспетчер служб IIS», найдите приложение buh и посмотрите, какой пул ему назначен. В дополнительных параметрах пула проверьте флаг «Разрешены 32-разрядные приложения»:
| Платформа на веб-сервере | Значение флага |
|---|---|
| 64-разрядная | False |
| 32-разрядная | True |
Для файловой базы дайте группе IIS_IUSRS (или учётной записи пула) права «Изменение» на каталог базы. Для клиент-серверной базы это не нужно: с базой работает кластер 1С, а не IIS.
Команда iisreset и перезапуск пула обрывают все текущие сеансы веб-клиента и веб-сервисов. Перезапускайте IIS, когда обмены не идут.
Публикация на Apache в Linux
На Linux удобнее публиковать утилитой webinst из каталога платформы, например /opt/1cv8/x86_64/8.3.xx.xxxx/. Пример для клиент-серверной базы:
cd /opt/1cv8/x86_64/8.3.xx.xxxx
sudo ./webinst -publish -apache24 -wsdir buh \
-dir /var/www/buh \
-connstr "Srvr=srv1c;Ref=buh;" \
-confpath /etc/apache2/apache2.conf
Утилита создаст default.vrd в /var/www/buh и допишет в конфиг Apache директиву загрузки модуля wsap24.so и блок Alias для каталога. Для файловой базы строка подключения выглядит как File="/var/1c/buh";.
Дальше:
- Проверьте синтаксис конфигурации:
sudo apachectl configtest. - Дайте пользователю Apache (
www-dataв Debian и Ubuntu) права на чтение/var/www/buh, а для файловой базы — на чтение и запись каталога базы. - Перезапустите Apache:
sudo systemctl restart apache2. Как и на IIS, перезапуск рвёт активные сеансы.
Список веб-сервисов, которые попадут в публикацию, webinst сам не выбирает. По умолчанию публикуются все. Чтобы управлять ими поштучно, правьте default.vrd — см. следующий раздел.
Файл default.vrd: тонкая настройка публикации
Файл default.vrd — главный пульт публикации. Конфигуратор пишет его сам, но тонкие параметры удобнее задать руками. Пример для одного сервиса:
<?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="/buh"
ib="Srvr=srv1c;Ref=buh;">
<ws pointEnableCommon="false">
<point name="Exchange"
alias="Exchange.1cws"
enable="true"
reuseSessions="autouse"
sessionMaxAge="20"
poolSize="10"
poolTimeout="5"/>
</ws>
</point>
Что здесь важно:
- 🚪
pointEnableCommon="false"— публикуются только сервисы, явно перечисленные сenable="true". Новые сервисы, добавленные в конфигурацию, наружу сами не выйдут. - ♻️
reuseSessions— повторное использование сеансов:dontuse,useилиautouse. - ⏱️
sessionMaxAge— сколько секунд живёт сеанс в пуле. - 📦
poolSizeиpoolTimeout— размер пула сеансов и время ожидания свободного сеанса.
После правки default.vrd перезапустите пул IIS или Apache, иначе изменения не подхватятся.
Права и безопасность веб-сервиса
Опубликованный сервис — дверь в учётную базу из сети. Закройте её по минимуму:
- Только HTTPS. На IIS добавьте привязку
httpsс сертификатом к сайту, на Apache — виртуальный хост на 443 порту. HTTP оставьте только для внутренней сети, а лучше уберите совсем. - Отдельный пользователь. Внешняя система подключается под своим пользователем 1С с ролью, где есть права только на нужные справочники и документы. Полные права сервисной учётке не давайте.
- Basic-аутентификация. Клиент передаёт логин и пароль пользователя 1С в заголовке. Без HTTPS этот пароль летит по сети открытым текстом.
- Без пароля в default.vrd. В строку
ibможно дописатьUsr=иPwd=, и тогда сервис будет пускать без авторизации. Это удобно для теста, но пароль лежит в файле открыто, а сервис доступен всем. Для рабочей схемы не годится. - Ограничение по IP. В IIS — «Ограничения IP-адресов и доменов», в Apache — директива
Require ipв блоке каталога. Если сервисом пользуется один партнёр, пускайте только его адреса. - Ничего лишнего. Не публикуйте тонкий клиент и OData на тот же адрес, если они не нужны.
Привилегированный режим в модуле сервиса снимает проверку прав. Включайте его только для узкого куска кода, а не для всей операции, иначе роль сервисного пользователя теряет смысл.
Как протестировать веб-сервис и найти ошибку
Проверка WSDL в браузере
Откройте http://сервер/buh/ws/Exchange.1cws?wsdl. Браузер спросит логин и пароль пользователя 1С. В ответ должен прийти XML с описанием операций. Если он пришёл — публикация и права в порядке.
Вызов из SoapUI или Postman
В SoapUI создайте проект по адресу WSDL — он сам построит шаблон запроса для каждой операции. Укажите логин и пароль на вкладке Auth (Basic), подставьте ИНН и отправьте запрос. Так проверяется сам сервис без участия чужой системы.
Вызов из другой базы 1С
Определения = Новый WSОпределения(
"https://сервер/buh/ws/Exchange.1cws?wsdl", "ws_exchange", "Пароль");
Прокси = Новый WSПрокси(Определения,
"http://mycompany.ru/exchange", "Exchange", "ExchangeSoap");
Прокси.Пользователь = "ws_exchange";
Прокси.Пароль = "Пароль";
Наименование = Прокси.GetCounterparty("7700000000");
Сообщить(Наименование);
Имя точки подключения ExchangeSoap берётся из WSDL — посмотрите элемент port, если сомневаетесь.
Отладка обработчика
Чтобы остановиться на точке останова в модуле сервиса, в default.vrd добавьте строку отладки, например <debug enable="true" protocol="http" url="http://localhost:1550"/> внутри корневого point. Затем в конфигураторе откройте Отладка → Подключение и включите автоматическое подключение для сеансов веб-сервисов. После отладки строку уберите: отладчик в рабочей публикации тормозит все вызовы.
Типовые ошибки и что они значат
enable в default.vrd и имя файла публикации (.1cws). После обновления конфигурации переопубликуйте базу.Производительность: чтобы сервис не тормозил под нагрузкой
Медленный веб-сервис почти всегда упирается в одно из трёх: создание сеансов, тяжёлые запросы в обработчике или блокировки.
- ♻️ Повторное использование сеансов. Без него каждый вызов открывает новый сеанс 1С — это заметные доли секунды на старт и лишняя лицензия. Включите
reuseSessions="autouse"вdefault.vrdили свойство «Повторное использование сеансов» у самого сервиса в конфигураторе. - 📦 Пакетные операции. Сто вызовов по одному товару медленнее, чем один вызов со списком из ста. Опишите в XDTO тип-список и принимайте данные пачкой.
- 🔍 Запросы вместо обращения через точку. Чтение
Контрагент.Наименованиев цикле — отдельное обращение к базе на каждой итерации. Собирайте данные одним запросом. - 🔒 Короткие транзакции. Флаг «В транзакции» держит блокировки до конца операции. Для операций чтения его не включайте.
- ⏳ Таймауты на стороне клиента. Задайте разумный таймаут в вызывающей системе (у
WSОпределенияиWSПроксион передаётся параметром конструктора), чтобы зависший вызов не копил очередь.
Для замеров используйте технологический журнал на сервере 1С или замер производительности в конфигураторе при отладке операции.
Частые вопросы о веб-сервисах 1С
Чем веб-сервис отличается от HTTP-сервиса 1С?
Можно ли опубликовать веб-сервис файловой базы?
Нужно ли переопубликовывать базу после обновления конфигурации?
default.vrd. Изменения кода в существующих операциях подхватываются без переопубликации.